diff options
author | Julien Gilli <julien.gilli@joyent.com> | 2015-01-25 23:57:22 -0800 |
---|---|---|
committer | Julien Gilli <julien.gilli@joyent.com> | 2015-01-29 16:23:38 -0800 |
commit | 59265264d56cfb7ced87f9b3666ec570152c5f47 (patch) | |
tree | d130288aaf1e85847cff7f6ed91c2c8ba49b308f | |
parent | bcff90e0c299ce472d3e00b8f886dac8e99478bd (diff) | |
download | node-59265264d56cfb7ced87f9b3666ec570152c5f47.tar.gz |
src: make build pass with GCC < 4.5
Building node with GCC > 4.4 on CentOS makes the node binary depend on a
more recent version of the C/C++ runtime that is not installed by
default on these older CentOS platforms, and probably on other platforms
as well.
Building node with the default gcc and g++ compilers that come with
these older versions of CentOS allows to ship a node binary that runs
out of the box on these setups with older C/C++ runtimes.
This change works around a bug that was fixed in GCC 4.5. Versions of
GCC < 4.5 would not support using the injected-class-name of a
template base class as a type name.
This change also disables aliasing optimizations for toolchains using
GCC <= 4.4 as they're not able to deal with the aliasing in the queue
implementation used by libuv and node (see src/queue.h).
Fixes #9079.
PR: #9098
PR-URL: https://github.com/joyent/node/pull/9098
Reviewed-By: Timothy J Fontaine <tjfontaine@gmail.com>
Reviewed-By: Trevor Norris <trev.norris@gmail.com>
-rw-r--r-- | deps/debugger-agent/debugger-agent.gyp | 8 | ||||
-rw-r--r-- | deps/uv/uv.gyp | 6 | ||||
-rw-r--r-- | node.gyp | 6 | ||||
-rw-r--r-- | src/cares_wrap.cc | 8 | ||||
-rw-r--r-- | src/node_file.cc | 2 | ||||
-rw-r--r-- | src/pipe_wrap.cc | 2 | ||||
-rw-r--r-- | src/stream_wrap.h | 6 | ||||
-rw-r--r-- | src/tcp_wrap.cc | 2 | ||||
-rw-r--r-- | src/udp_wrap.cc | 2 |
9 files changed, 34 insertions, 8 deletions
diff --git a/deps/debugger-agent/debugger-agent.gyp b/deps/debugger-agent/debugger-agent.gyp index e98206849..3d012ac0d 100644 --- a/deps/debugger-agent/debugger-agent.gyp +++ b/deps/debugger-agent/debugger-agent.gyp @@ -17,6 +17,14 @@ "include", ], }, + 'conditions': [ + [ 'gcc_version<=44', { + # GCC versions <= 4.4 do not handle the aliasing in the queue + # implementation, so disable aliasing on these platforms + # to avoid subtle bugs + 'cflags': [ '-fno-strict-aliasing' ], + }], + ], "sources": [ "src/agent.cc", ], diff --git a/deps/uv/uv.gyp b/deps/uv/uv.gyp index a5ba14c31..880c641f1 100644 --- a/deps/uv/uv.gyp +++ b/deps/uv/uv.gyp @@ -84,6 +84,12 @@ 'src/version.c' ], 'conditions': [ + [ 'gcc_version<=44', { + # GCC versions <= 4.4 do not handle the aliasing in the queue + # implementation, so disable aliasing on these platforms + # to avoid subtle bugs + 'cflags': [ '-fno-strict-aliasing' ], + }], [ 'OS=="win"', { 'defines': [ '_WIN32_WINNT=0x0600', @@ -168,6 +168,12 @@ ], 'conditions': [ + [ 'gcc_version<=44', { + # GCC versions <= 4.4 do not handle the aliasing in the queue + # implementation, so disable aliasing on these platforms + # to avoid subtle bugs + 'cflags': [ '-fno-strict-aliasing' ], + }], [ 'v8_enable_i18n_support==1', { 'defines': [ 'NODE_HAVE_I18N_SUPPORT=1' ], 'dependencies': [ diff --git a/src/cares_wrap.cc b/src/cares_wrap.cc index 39c880015..1764374c1 100644 --- a/src/cares_wrap.cc +++ b/src/cares_wrap.cc @@ -73,7 +73,9 @@ class GetAddrInfoReqWrap : public ReqWrap<uv_getaddrinfo_t> { GetAddrInfoReqWrap::GetAddrInfoReqWrap(Environment* env, Local<Object> req_wrap_obj) - : ReqWrap(env, req_wrap_obj, AsyncWrap::PROVIDER_GETADDRINFOREQWRAP) { + : ReqWrap<uv_getaddrinfo_t>(env, + req_wrap_obj, + AsyncWrap::PROVIDER_GETADDRINFOREQWRAP) { Wrap(req_wrap_obj, this); } @@ -90,7 +92,9 @@ class GetNameInfoReqWrap : public ReqWrap<uv_getnameinfo_t> { GetNameInfoReqWrap::GetNameInfoReqWrap(Environment* env, Local<Object> req_wrap_obj) - : ReqWrap(env, req_wrap_obj, AsyncWrap::PROVIDER_GETNAMEINFOREQWRAP) { + : ReqWrap<uv_getnameinfo_t>(env, + req_wrap_obj, + AsyncWrap::PROVIDER_GETNAMEINFOREQWRAP) { Wrap(req_wrap_obj, this); } diff --git a/src/node_file.cc b/src/node_file.cc index 8a00b5d9e..e04c4c2dd 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -75,7 +75,7 @@ class FSReqWrap: public ReqWrap<uv_fs_t> { Local<Object> req, const char* syscall, char* data = NULL) - : ReqWrap(env, req, AsyncWrap::PROVIDER_FSREQWRAP), + : ReqWrap<uv_fs_t>(env, req, AsyncWrap::PROVIDER_FSREQWRAP), syscall_(syscall), data_(data), dest_len_(0) { diff --git a/src/pipe_wrap.cc b/src/pipe_wrap.cc index 69cdfcdff..2d4919975 100644 --- a/src/pipe_wrap.cc +++ b/src/pipe_wrap.cc @@ -61,7 +61,7 @@ class PipeConnectWrap : public ReqWrap<uv_connect_t> { PipeConnectWrap::PipeConnectWrap(Environment* env, Local<Object> req_wrap_obj) - : ReqWrap(env, req_wrap_obj, AsyncWrap::PROVIDER_PIPEWRAP) { + : ReqWrap<uv_connect_t>(env, req_wrap_obj, AsyncWrap::PROVIDER_PIPEWRAP) { Wrap(req_wrap_obj, this); } diff --git a/src/stream_wrap.h b/src/stream_wrap.h index 38e5d4842..d993663b1 100644 --- a/src/stream_wrap.h +++ b/src/stream_wrap.h @@ -36,7 +36,9 @@ class StreamWrap; class ShutdownWrap : public ReqWrap<uv_shutdown_t> { public: ShutdownWrap(Environment* env, v8::Local<v8::Object> req_wrap_obj) - : ReqWrap(env, req_wrap_obj, AsyncWrap::PROVIDER_SHUTDOWNWRAP) { + : ReqWrap<uv_shutdown_t>(env, + req_wrap_obj, + AsyncWrap::PROVIDER_SHUTDOWNWRAP) { Wrap(req_wrap_obj, this); } @@ -50,7 +52,7 @@ class WriteWrap: public ReqWrap<uv_write_t> { // TODO(trevnorris): WrapWrap inherits from ReqWrap, which I've globbed // into the same provider. How should these be broken apart? WriteWrap(Environment* env, v8::Local<v8::Object> obj, StreamWrap* wrap) - : ReqWrap(env, obj, AsyncWrap::PROVIDER_WRITEWRAP), + : ReqWrap<uv_write_t>(env, obj, AsyncWrap::PROVIDER_WRITEWRAP), wrap_(wrap) { Wrap(obj, this); } diff --git a/src/tcp_wrap.cc b/src/tcp_wrap.cc index a5b20a6ac..6b2408c98 100644 --- a/src/tcp_wrap.cc +++ b/src/tcp_wrap.cc @@ -61,7 +61,7 @@ class TCPConnectWrap : public ReqWrap<uv_connect_t> { TCPConnectWrap::TCPConnectWrap(Environment* env, Local<Object> req_wrap_obj) - : ReqWrap(env, req_wrap_obj, AsyncWrap::PROVIDER_TCPWRAP) { + : ReqWrap<uv_connect_t>(env, req_wrap_obj, AsyncWrap::PROVIDER_TCPWRAP) { Wrap(req_wrap_obj, this); } diff --git a/src/udp_wrap.cc b/src/udp_wrap.cc index 614326fa1..923875e61 100644 --- a/src/udp_wrap.cc +++ b/src/udp_wrap.cc @@ -64,7 +64,7 @@ class SendWrap : public ReqWrap<uv_udp_send_t> { SendWrap::SendWrap(Environment* env, Local<Object> req_wrap_obj, bool have_callback) - : ReqWrap(env, req_wrap_obj, AsyncWrap::PROVIDER_UDPWRAP), + : ReqWrap<uv_udp_send_t>(env, req_wrap_obj, AsyncWrap::PROVIDER_UDPWRAP), have_callback_(have_callback) { Wrap(req_wrap_obj, this); } |