You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@trafficserver.apache.org by "Igor Galić (JIRA)" <ji...@apache.org> on 2013/02/02 00:20:13 UTC
[jira] [Created] (TS-1680) build system (and code) have
inconsistent checking for C++11 (library) features
Igor Galić created TS-1680:
------------------------------
Summary: build system (and code) have inconsistent checking for C++11 (library) features
Key: TS-1680
URL: https://issues.apache.org/jira/browse/TS-1680
Project: Traffic Server
Issue Type: Bug
Components: Build
Reporter: Igor Galić
Compilers on different Operating systems can use different standard libraries. Just knowing the compilers name and version, or the OS isn't enough.
This is beautifully examplified by our C++11 code in {{proxy/logstats.cc}}. Despite the 30~ lines of code to do various checks this still doesn't work with all combinations of compilers:
{noformat}
c++ -DHAVE_CONFIG_H -I. -I/home/igalic/src/asf/trafficserver/proxy -I../lib/ts -I/home/igalic/src/asf/trafficserver/iocore/eventsystem -I/home/igalic/src/asf/trafficserver/iocore/net -I/home/igalic/src/asf/trafficserver/iocore/aio -I/home/igalic/src/asf/trafficserver/iocore/hostdb -I/home/igalic/src/asf/trafficserver/iocore/cache -I/home/igalic/src/asf/trafficserver/iocore/cluster -I/home/igalic/src/asf/trafficserver/iocore/utils -I/home/igalic/src/asf/trafficserver/iocore/dns -I/home/igalic/src/asf/trafficserver/lib/records -I/home/igalic/src/asf/trafficserver/lib/ts -I/home/igalic/src/asf/trafficserver/proxy/http -I/home/igalic/src/asf/trafficserver/proxy/logging -I/home/igalic/src/asf/trafficserver/proxy/http/remap -I/home/igalic/src/asf/trafficserver/proxy/hdrs -I/home/igalic/src/asf/trafficserver/mgmt -I/home/igalic/src/asf/trafficserver/mgmt/preparse -I/home/igalic/src/asf/trafficserver/mgmt/utils -I/home/igalic/src/asf/trafficserver/proxy/api/ts -I. -I./api/ts -I/home/igalic/src/asf/trafficserver/lib -D_LARGEFILE64_SOURCE=1 -D_COMPILE64BIT_SOURCE=1 -D_GNU_SOURCE -D_REENTRANT -Dfreebsd -DDEBUG -D_DEBUG -I/usr/local/include -I/usr/local/include/tcl8.5 -std=c++11 -ggdb3 -pipe -Wall -Werror -Wno-invalid-offsetof -MT logstats.o -MD -MP -MF .deps/logstats.Tpo -c -o logstats.o /home/igalic/src/asf/trafficserver/proxy/logstats.cc
/home/igalic/src/asf/trafficserver/proxy/logstats.cc:79:12: error: no member named 'hash' in namespace 'std'
using std::hash;
~~~~~^
/home/igalic/src/asf/trafficserver/proxy/logstats.cc:364:48: error: no template named 'hash'; did you mean '__gnu_cxx::hash'?
typedef hash_map <const char *, OriginStats *, hash <const char *>, eqstr> OriginStorage;
^~~~
__gnu_cxx::hash
/usr/include/c++/4.2/ext/hash_fun.h:71:12: note: '__gnu_cxx::hash' declared here
struct hash { };
^
/home/igalic/src/asf/trafficserver/proxy/logstats.cc:365:33: error: no template named 'hash'; did you mean '__gnu_cxx::hash'?
typedef hash_set <const char *, hash <const char *>, eqstr> OriginSet;
^~~~
__gnu_cxx::hash
/usr/include/c++/4.2/ext/hash_fun.h:71:12: note: '__gnu_cxx::hash' declared here
struct hash { };
^
/home/igalic/src/asf/trafficserver/proxy/logstats.cc:374:54: error: no template named 'hash'; did you mean '__gnu_cxx::hash'?
typedef hash_map<const char *, LruStack::iterator, hash <const char *>, eqstr> LruHash;
^~~~
__gnu_cxx::hash
/usr/include/c++/4.2/ext/hash_fun.h:71:12: note: '__gnu_cxx::hash' declared here
struct hash { };
^
4 errors generated.
gmake: *** [logstats.o] Error 1
{noformat}
vs:
{noformat}
clang++ -DHAVE_CONFIG_H -I. -I/home/igalic/src/asf/trafficserver/proxy -I../lib/ts -I/home/igalic/src/asf/trafficserver/iocore/eventsystem -I/home/igalic/src/asf/trafficserver/iocore/net -I/home/igalic/src/asf/trafficserver/iocore/aio -I/home/igalic/src/asf/trafficserver/iocore/hostdb -I/home/igalic/src/asf/trafficserver/iocore/cache -I/home/igalic/src/asf/trafficserver/iocore/cluster -I/home/igalic/src/asf/trafficserver/iocore/utils -I/home/igalic/src/asf/trafficserver/iocore/dns -I/home/igalic/src/asf/trafficserver/lib/records -I/home/igalic/src/asf/trafficserver/lib/ts -I/home/igalic/src/asf/trafficserver/proxy/http -I/home/igalic/src/asf/trafficserver/proxy/logging -I/home/igalic/src/asf/trafficserver/proxy/http/remap -I/home/igalic/src/asf/trafficserver/proxy/hdrs -I/home/igalic/src/asf/trafficserver/mgmt -I/home/igalic/src/asf/trafficserver/mgmt/preparse -I/home/igalic/src/asf/trafficserver/mgmt/utils -I/home/igalic/src/asf/trafficserver/proxy/api/ts -I. -I./api/ts -I/home/igalic/src/asf/trafficserver/lib -D_LARGEFILE64_SOURCE=1 -D_COMPILE64BIT_SOURCE=1 -D_GNU_SOURCE -D_REENTRANT -Dfreebsd -DDEBUG -D_DEBUG -I/usr/local/include -I/usr/local/include/tcl8.5 --stdlib=libc++ -std=c++11 -ggdb3 -pipe -Wall -Werror -Qunused-arguments -Wno-invalid-offsetof -MT logstats.o -MD -MP -MF .deps/logstats.Tpo -c -o logstats.o /home/igalic/src/asf/trafficserver/proxy/logstats.cc
In file included from /home/igalic/src/asf/trafficserver/proxy/logstats.cc:58:
/usr/include/c++/v1/ext/hash_map:209:2: error: Use of the header <ext/hash_map> is deprecated. Migrate to <unordered_map> [-Werror,-W#warnings]
#warning Use of the header <ext/hash_map> is deprecated. Migrate to <unordered_map>
^
In file included from /home/igalic/src/asf/trafficserver/proxy/logstats.cc:59:
/usr/include/c++/v1/ext/hash_set:202:2: error: Use of the header <ext/hash_set> is deprecated. Migrate to <unordered_set> [-Werror,-W#warnings]
#warning Use of the header <ext/hash_set> is deprecated. Migrate to <unordered_set>
^
2 errors generated.
gmake: *** [logstats.o] Error 1
{noformat}
(With --stdlib=libc++)
An other example can be found in {{libc++11api}} itself (This error is produced by running {{ci/regression}} on FreeBSD 10):
{noformat}
gmake[2]: Leaving directory `/tmp/org.apache.trafficserver.17293/obj/lib/wccp'
Making all in cpp11api
gmake[2]: Entering directory `/tmp/org.apache.trafficserver.17293/obj/lib/cpp11api'
CXX cpp11api.lo
In file included from /home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:24:
/home/igalic/src/asf/trafficserver/lib/cpp11api/ts-cpp11.h:56:14: error: no type named 'function' in namespace 'std'
typedef std::function<NextState(Transaction &)> GlobalHookCallback;
~~~~~^
/home/igalic/src/asf/trafficserver/lib/cpp11api/ts-cpp11.h:56:22: error: expected unqualified-id
typedef std::function<NextState(Transaction &)> GlobalHookCallback;
^
/home/igalic/src/asf/trafficserver/lib/cpp11api/ts-cpp11.h:61:33: error: unknown type name 'GlobalHookCallback'
void CreateGlobalHook(HookType, GlobalHookCallback);
^
/home/igalic/src/asf/trafficserver/lib/cpp11api/ts-cpp11.h:62:53: error: unknown type name 'GlobalHookCallback'
void CreateTransactionHook(Transaction &, HookType, GlobalHookCallback);
^
/home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:33:3: error: unknown type name 'GlobalHookCallback'
GlobalHookCallback callback;
^
/home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:115:36: error: member access into incomplete type 'const struct sockaddr_in'
inet_ntop(AF_INET, &s_sockaddr_in->sin_addr, res, INET_ADDRSTRLEN);
^
/home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:111:16: note: forward declaration of 'sockaddr_in'
const struct sockaddr_in * s_sockaddr_in =
^
/home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:432:57: error: member access into incomplete type 'const struct sockaddr_in'
return static_cast<unsigned int>(ntohs(client_sockaddr->sin_port));
^
/usr/include/arpa/inet.h:173:26: note: expanded from macro 'ntohs'
#define ntohs(x) __ntohs(x)
^
/usr/include/x86/endian.h:129:30: note: expanded from macro '__ntohs'
#define __ntohs(x) __bswap16(x)
^
/usr/include/x86/endian.h:74:37: note: expanded from macro '__bswap16'
((__uint16_t)(__builtin_constant_p(x) ? \
^
/home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:428:16: note: forward declaration of 'sockaddr_in'
const struct sockaddr_in * client_sockaddr =
^
/home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:432:57: error: member access into incomplete type 'const struct sockaddr_in'
return static_cast<unsigned int>(ntohs(client_sockaddr->sin_port));
^
/usr/include/arpa/inet.h:173:26: note: expanded from macro 'ntohs'
#define ntohs(x) __ntohs(x)
^
/usr/include/x86/endian.h:129:30: note: expanded from macro '__ntohs'
#define __ntohs(x) __bswap16(x)
^
/usr/include/x86/endian.h:75:33: note: expanded from macro '__bswap16'
__bswap16_gen((__uint16_t)(x)) : __bswap16_var(x)))
^
/usr/include/x86/endian.h:66:40: note: expanded from macro '__bswap16_gen'
#define __bswap16_gen(x) (__uint16_t)((x) << 8 | (x) >> 8)
^
/home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:428:16: note: forward declaration of 'sockaddr_in'
const struct sockaddr_in * client_sockaddr =
^
/home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:432:57: error: member access into incomplete type 'const struct sockaddr_in'
return static_cast<unsigned int>(ntohs(client_sockaddr->sin_port));
^
/usr/include/arpa/inet.h:173:26: note: expanded from macro 'ntohs'
#define ntohs(x) __ntohs(x)
^
/usr/include/x86/endian.h:129:30: note: expanded from macro '__ntohs'
#define __ntohs(x) __bswap16(x)
^
/usr/include/x86/endian.h:75:33: note: expanded from macro '__bswap16'
__bswap16_gen((__uint16_t)(x)) : __bswap16_var(x)))
^
/usr/include/x86/endian.h:66:51: note: expanded from macro '__bswap16_gen'
#define __bswap16_gen(x) (__uint16_t)((x) << 8 | (x) >> 8)
^
/home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:428:16: note: forward declaration of 'sockaddr_in'
const struct sockaddr_in * client_sockaddr =
^
/home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:432:57: error: member access into incomplete type 'const struct sockaddr_in'
return static_cast<unsigned int>(ntohs(client_sockaddr->sin_port));
^
/usr/include/arpa/inet.h:173:26: note: expanded from macro 'ntohs'
#define ntohs(x) __ntohs(x)
^
/usr/include/x86/endian.h:129:30: note: expanded from macro '__ntohs'
#define __ntohs(x) __bswap16(x)
^
/usr/include/x86/endian.h:75:53: note: expanded from macro '__bswap16'
__bswap16_gen((__uint16_t)(x)) : __bswap16_var(x)))
^
/home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:428:16: note: forward declaration of 'sockaddr_in'
const struct sockaddr_in * client_sockaddr =
^
/home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:444:57: error: member access into incomplete type 'const struct sockaddr_in'
return static_cast<unsigned int>(ntohs(client_sockaddr->sin_port));
^
/usr/include/arpa/inet.h:173:26: note: expanded from macro 'ntohs'
#define ntohs(x) __ntohs(x)
^
/usr/include/x86/endian.h:129:30: note: expanded from macro '__ntohs'
#define __ntohs(x) __bswap16(x)
^
/usr/include/x86/endian.h:74:37: note: expanded from macro '__bswap16'
((__uint16_t)(__builtin_constant_p(x) ? \
^
/home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:440:16: note: forward declaration of 'sockaddr_in'
const struct sockaddr_in * client_sockaddr =
^
/home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:444:57: error: member access into incomplete type 'const struct sockaddr_in'
return static_cast<unsigned int>(ntohs(client_sockaddr->sin_port));
^
/usr/include/arpa/inet.h:173:26: note: expanded from macro 'ntohs'
#define ntohs(x) __ntohs(x)
^
/usr/include/x86/endian.h:129:30: note: expanded from macro '__ntohs'
#define __ntohs(x) __bswap16(x)
^
/usr/include/x86/endian.h:75:33: note: expanded from macro '__bswap16'
__bswap16_gen((__uint16_t)(x)) : __bswap16_var(x)))
^
/usr/include/x86/endian.h:66:40: note: expanded from macro '__bswap16_gen'
#define __bswap16_gen(x) (__uint16_t)((x) << 8 | (x) >> 8)
^
/home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:440:16: note: forward declaration of 'sockaddr_in'
const struct sockaddr_in * client_sockaddr =
^
/home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:444:57: error: member access into incomplete type 'const struct sockaddr_in'
return static_cast<unsigned int>(ntohs(client_sockaddr->sin_port));
^
/usr/include/arpa/inet.h:173:26: note: expanded from macro 'ntohs'
#define ntohs(x) __ntohs(x)
^
/usr/include/x86/endian.h:129:30: note: expanded from macro '__ntohs'
#define __ntohs(x) __bswap16(x)
^
/usr/include/x86/endian.h:75:33: note: expanded from macro '__bswap16'
__bswap16_gen((__uint16_t)(x)) : __bswap16_var(x)))
^
/usr/include/x86/endian.h:66:51: note: expanded from macro '__bswap16_gen'
#define __bswap16_gen(x) (__uint16_t)((x) << 8 | (x) >> 8)
^
/home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:440:16: note: forward declaration of 'sockaddr_in'
const struct sockaddr_in * client_sockaddr =
^
/home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:444:57: error: member access into incomplete type 'const struct sockaddr_in'
return static_cast<unsigned int>(ntohs(client_sockaddr->sin_port));
^
/usr/include/arpa/inet.h:173:26: note: expanded from macro 'ntohs'
#define ntohs(x) __ntohs(x)
^
/usr/include/x86/endian.h:129:30: note: expanded from macro '__ntohs'
#define __ntohs(x) __bswap16(x)
^
/usr/include/x86/endian.h:75:53: note: expanded from macro '__bswap16'
__bswap16_gen((__uint16_t)(x)) : __bswap16_var(x)))
^
/home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:440:16: note: forward declaration of 'sockaddr_in'
const struct sockaddr_in * client_sockaddr =
^
/home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:527:5: error: unknown type name 'GlobalHookCallback'
GlobalHookCallback callback) {
^
/home/igalic/src/asf/trafficserver/lib/cpp11api/cpp11api.cc:544:48: error: unknown type name 'GlobalHookCallback'
void ats::api::CreateGlobalHook(HookType hook, GlobalHookCallback callback) {
^
16 errors generated.
gmake[2]: *** [cpp11api.lo] Error 1
gmake[2]: Leaving directory `/tmp/org.apache.trafficserver.17293/obj/lib/cpp11api'
gmake[1]: *** [all-recursive] Error 1
gmake[1]: Leaving directory `/tmp/org.apache.trafficserver.17293/obj/lib'
gmake: *** [all-recursive] Error 1
{noformat}
One simple way to check for {{libc++}} is demonstrated here:
{noformat}
#include <ciso646>
#if defined( _LIBCPP_VERSION )
using std::hash;
#else
#include <tr1/unordered_map>
using std::tr1::hash;
#endif
{noformat}
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira