0
0
mirror of https://github.com/nodejs/node.git synced 2024-11-25 08:19:38 +01:00
nodejs/configure
Ryan Dahl 14b04b06b4 Remove SCONS deprecate WAF
We keep around WAF for node-waf only.

We need great diligence by people over the next couple weeks to work out all
the kinks in the GYP build system. We realize that it is currently several
times slower than the WAF build. Please lend a hand.

Fixes #1504
Fixes #1500
2011-11-14 19:17:42 -08:00

248 lines
6.2 KiB
Python
Executable File

#!/usr/bin/env python
import optparse
import os
import json
import sys
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 None
cmd = os.popen('pkg-config --cflags %s' % pkg, 'r')
cflags = cmd.readline().strip()
ret = cmd.close()
if (ret): return None
return (libs, cflags)
def uname(switch):
f = os.popen('uname %s' % switch)
s = f.read().strip()
f.close()
return s
def host_arch():
"""Host architecture. One of arm, ia32 or x64."""
arch = uname('-p')
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()
# TODO move to node.gyp
if sys.platform == 'sunos5':
o['variables']['visibility'] = '' # FIXME -fvisibility=hidden, should be a gcc check
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'
print "configure options:", options
output = {
'variables': {},
'include_dirs': [],
'libraries': [],
'defines': [],
'cflags': [],
}
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
f = open(fn, 'w+')
f.write("# Do not edit. Generated by the configure script.\n")
json.dump(output, f, indent=2, skipkeys=True)
f.write("\n")
f.close()