From: Ben Noordhuis Date: Mon, 29 Aug 2011 22:01:43 +0000 (+0200) Subject: build: configure node, v8, cares and openssl X-Git-Tag: v0.5.7~49 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9f986981f8b0818e610b0ed73e7341c5d934e762;p=platform%2Fupstream%2Fnodejs.git build: configure node, v8, cares and openssl --- diff --git a/configure-gyp b/configure-gyp index 4d43cb5..edd21b1 100755 --- a/configure-gyp +++ b/configure-gyp @@ -9,95 +9,228 @@ root_dir = os.path.dirname(__file__) sys.path.insert(0, os.path.join(root_dir, 'deps', 'v8', 'tools')) import utils # GuessArchitecture +# parse our options +parser = optparse.OptionParser() + +parser.add_option("--debug", + action="store_true", + dest="debug", + help="Also build debug build") + +parser.add_option("--prefix", + action="store", + dest="prefix", + help="Select the install prefix (defaults to /usr/local)") + +parser.add_option("--without-ssl", + action="store_true", + dest="without_ssl", + help="Build without SSL") + +parser.add_option("--without-snapshot", + action="store_true", + dest="without_snapshot", + help="Build without snapshotting V8 libraries. You might want to set" + " this for cross-compiling. [Default: False]") + +parser.add_option("--shared-v8", + action="store_true", + dest="shared_v8", + help="Link to a shared V8 DLL instead of static linking") + +parser.add_option("--shared-v8-includes", + action="store", + dest="shared_v8_includes", + help="Directory containing V8 header files") + +parser.add_option("--shared-v8-libpath", + action="store", + dest="shared_v8_libpath", + help="A directory to search for the shared V8 DLL") + +parser.add_option("--shared-v8-libname", + action="store", + dest="shared_v8_libname", + help="Alternative lib name to link to (default: 'v8')") + +parser.add_option("--openssl-includes", + action="store", + dest="openssl_includes", + help="A directory to search for the OpenSSL includes") + +parser.add_option("--openssl-libpath", + action="store", + dest="openssl_libpath", + help="A directory to search for the OpenSSL libraries") + +parser.add_option("--no-ssl2", + action="store_true", + dest="no_ssl2", + help="Disable OpenSSL v2") + +parser.add_option("--shared-cares", + action="store_true", + dest="shared_cares", + help="Link to a shared C-Ares DLL instead of static linking") + +parser.add_option("--shared-cares-includes", + action="store", + dest="shared_cares_includes", + help="Directory containing C-Ares header files") + +parser.add_option("--shared-cares-libpath", + action="store", + dest="shared_cares_libpath", + help="A directory to search for the shared C-Ares DLL") + +parser.add_option("--with-dtrace", + action="store_true", + dest="with_dtrace", + help="Build with DTrace (experimental)") + +# CHECKME does this still work with recent releases of V8? +parser.add_option("--gdb", + action="store_true", + dest="gdb", + help="add gdb support") + +parser.add_option("--dest-cpu", + action="store", + dest="dest_cpu", + help="CPU architecture to build for. Valid values are: arm, ia32, x64") + +(options, args) = parser.parse_args() + + def pkg_config(pkg): cmd = os.popen('pkg-config --libs %s' % pkg, 'r') libs = cmd.readline().strip() ret = cmd.close() - if (ret): return 0 + if (ret): return None cmd = os.popen('pkg-config --cflags %s' % pkg, 'r') cflags = cmd.readline().strip() ret = cmd.close() - if (ret): return 0 + if (ret): return None return (libs, cflags) -# parse our options -parser = optparse.OptionParser() -parser.add_option("--debug", action="store_true", dest="debug", - default=False, help="Also build debug build") +def uname(switch): + f = os.popen('uname %s' % switch) + s = f.read().strip() + f.close() + return s -parser.add_option("--prefix", action="store", dest="prefix", - help="Select the install prefix (defaults to /usr/local)") +def host_arch(): + """Host architecture. One of arm, ia32 or x64.""" + arch = uname('-p') -# TODO options to support for backwards compatibility -# -# --without-snapshot -# Build without snapshotting V8 libraries. You might want to set this for -# cross-compiling. [Default: False] -# -# --without-ssl -# Build without SSL -# -# --shared-v8 -# Link to a shared V8 DLL instead of static linking -# -# --shared-v8-includes=SHARED_V8_INCLUDES -# Directory containing V8 header files -# -# --shared-v8-libpath=SHARED_V8_LIBPATH -# A directory to search for the shared V8 DLL -# -# --shared-v8-libname=SHARED_V8_LIBNAME -# Alternative lib name to link to (default: 'v8') -# -# --openssl-includes=OPENSSL_INCLUDES -# A directory to search for the OpenSSL includes -# -# --openssl-libpath=OPENSSL_LIBPATH -# A directory to search for the OpenSSL libraries -# -# --no-ssl2 -# Disable OpenSSL v2 -# -# --gdb -# add gdb support -# -# --shared-cares -# Link to a shared C-Ares DLL instead of static linking -# -# --shared-cares-includes=SHARED_CARES_INCLUDES -# Directory containing C-Ares header files -# -# --shared-cares-libpath=SHARED_CARES_LIBPATH -# A directory to search for the shared C-Ares DLL -# -# --with-dtrace -# Build with DTrace (experimental) -# -# --dest-cpu=DEST_CPU -# CPU architecture to build for. Valid values are: arm, ia32, x64 + if arch == 'unknown': + arch = uname('-m') + return { + 'arm': 'arm', + 'x86': 'ia32', + 'i386': 'ia32', + 'x86_64': 'x64', + }.get(arch, 'ia32') + + +def target_arch(): + # TODO act on options.dest_cpu + return host_arch() + + +def configure_node(o): + # TODO add gdb and dest_cpu + o['variables']['node_debug'] = 'true' if options.debug else 'false' + o['variables']['node_prefix'] = options.prefix if options.prefix else '' + o['variables']['node_use_dtrace'] = 'true' if options.with_dtrace else 'false' + o['variables']['host_arch'] = host_arch() + o['variables']['target_arch'] = target_arch() + + +def configure_libz(o): + o['libraries'] += ['-lz'] + + +def configure_v8(o): + o['variables']['v8_use_snapshot'] = 'true' if not options.without_snapshot else 'false' + o['variables']['node_shared_v8'] = 'true' if options.shared_v8 else 'false' + + # assume shared_v8 if one of these is set? + if options.shared_v8_libpath: + o['libraries'] += ['-L%s' % options.shared_v8_libpath] + if options.shared_v8_libname: + o['libraries'] += ['-l%s' % options.shared_v8_libname] + if options.shared_v8_includes: + o['include_dirs'] += [options.shared_v8_includes] + + +def configure_cares(o): + o['variables']['node_shared_cares'] = 'true' if options.shared_cares else 'false' + + # assume shared_cares if one of these is set? + if options.shared_cares_libpath: + o['libraries'] += ['-L%s' % options.shared_cares_libpath] + if options.shared_cares_includes: + o['include_dirs'] += [options.shared_cares_includes] + + +def configure_openssl(o): + o['variables']['node_use_openssl'] = 'false' if options.without_ssl else 'true' + + if options.without_ssl: + return + + if options.no_ssl2: + o['defines'] += ['OPENSSL_NO_SSL2=1'] + + out = pkg_config('openssl') + (libs, cflags) = out if out else ('', '') + + if options.openssl_libpath: + o['libraries'] += ['-L%s' % options.openssl_libpath, '-lssl', '-lcrypto'] + else: + o['libraries'] += libs.split() + + if options.openssl_includes: + o['include_dirs'] += [options.openssl_includes] + else: + o['cflags'] += cflags.split() + + if libs or cflags or options.openssl_libpath or options.openssl_includes: + o['variables']['node_use_system_openssl'] = 'true' + else: + o['variables']['node_use_system_openssl'] = 'false' -(options, args) = parser.parse_args() print "configure options:", options output = { - 'variables': { - 'node_debug': 'true' if options.debug else 'false', - 'node_prefix': options.prefix if options.prefix else '' - } + 'variables': {}, + 'include_dirs': [], + 'libraries': [], + 'defines': [], + 'cflags': [], } -out = pkg_config('openssl') -if out: - output['variables']['node_use_openssl'] = 'true' - output['variables']['openssl_libs'] = '-lssl -lcrypto -lz' #out[0] - output['variables']['openssl_cflags'] = out[1] +configure_node(output) +configure_libz(output) +configure_v8(output) +configure_cares(output) +configure_openssl(output) +# variables should be a root level element, +# move everything else to target_defaults +variables = output['variables'] +del output['variables'] +output = { + 'variables': variables, + 'target_defaults': output +} fn = os.path.join(root_dir, 'options.gypi') print "creating ", fn diff --git a/node.gyp b/node.gyp index c0a390b..3a39fb9 100644 --- a/node.gyp +++ b/node.gyp @@ -51,6 +51,10 @@ ], }, + 'includes': [ + './options.gypi' + ], + 'targets': [ { 'target_name': 'node', @@ -136,7 +140,10 @@ [ 'node_use_openssl=="true"', { 'defines': [ 'HAVE_OPENSSL=1' ], 'sources': [ 'src/node_crypto.cc' ], - 'dependencies': [ './deps/openssl/openssl.gyp:openssl' ] + 'conditions': [ + [ 'node_use_system_openssl=="false"', { + 'dependencies': [ './deps/openssl/openssl.gyp:openssl' ], + }]] }, { 'defines': [ 'HAVE_OPENSSL=0' ] }],