build: configure node, v8, cares and openssl
authorBen Noordhuis <info@bnoordhuis.nl>
Mon, 29 Aug 2011 22:01:43 +0000 (00:01 +0200)
committerBen Noordhuis <info@bnoordhuis.nl>
Mon, 12 Sep 2011 21:48:29 +0000 (21:48 +0000)
configure-gyp
node.gyp

index 4d43cb5..edd21b1 100755 (executable)
@@ -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
index c0a390b..3a39fb9 100644 (file)
--- a/node.gyp
+++ b/node.gyp
     ],
   },
 
+  'includes': [
+    './options.gypi'
+  ],
+
   'targets': [
     {
       'target_name': 'node',
         [ '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' ]
         }],