diff options
author | Rasmus Andersson <rasmus@notion.se> | 2010-10-24 18:15:05 +0400 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2010-11-14 01:29:59 +0300 |
commit | e5a0fbe500fa3b5f3e0c15f8d17a5d8026fac919 (patch) | |
tree | ad6815929fb38a1753b84dcc3ec8394c88778948 /wscript | |
parent | de6e88c4282d40bfc24093411d4c2857a1014d61 (diff) |
Added support for cross compilation and also fixed DEST_CPU to represent the canonical symbols dictated by v8
Diffstat (limited to 'wscript')
-rw-r--r-- | wscript | 81 |
1 files changed, 68 insertions, 13 deletions
@@ -13,13 +13,21 @@ import js2c srcdir = '.' blddir = 'build' - +supported_archs = ('arm', 'ia32', 'x64') # 'mips' supported by v8, but not node jobs=1 if os.environ.has_key('JOBS'): jobs = int(os.environ['JOBS']) +def canonical_cpu_type(arch): + m = {'i386':'ia32', 'x86_64':'x64', 'amd64':'x64'} + if arch in m: arch = m[arch] + if not arch in supported_archs: + raise Exception("supported architectures are "+', '.join(supported_archs)+\ + " but NOT '" + arch + "'.") + return arch + def set_options(opt): # the gcc module provides a --debug-level option opt.tool_options('compiler_cxx') @@ -126,6 +134,23 @@ def set_options(opt): ) + opt.add_option( '--product-type' + , action='store' + , default='program' + , help='What kind of product to produce (program, cstaticlib '\ + 'or cshlib) [default: %default]' + , dest='product_type' + ) + + opt.add_option( '--dest-cpu' + , action='store' + , default=None + , help='CPU architecture to build for. Valid values are: '+\ + ', '.join(supported_archs) + , dest='dest_cpu' + ) + + def configure(conf): @@ -189,6 +214,14 @@ def configure(conf): else: Options.options.use_openssl = conf.env["USE_OPENSSL"] = False + # normalize DEST_CPU from --dest-cpu, DEST_CPU or built-in value + if Options.options.dest_cpu and Options.options.dest_cpu: + conf.env['DEST_CPU'] = canonical_cpu_type(Options.options.dest_cpu) + elif 'DEST_CPU' in os.environ and os.environ['DEST_CPU']: + conf.env['DEST_CPU'] = canonical_cpu_type(os.environ['DEST_CPU']) + elif 'DEST_CPU' in conf.env and conf.env['DEST_CPU']: + conf.env['DEST_CPU'] = canonical_cpu_type(conf.env['DEST_CPU']) + conf.check(lib='rt', uselib_store='RT') if sys.platform.startswith("sunos"): @@ -265,6 +298,27 @@ def configure(conf): if sys.platform.startswith("darwin"): # used by platform_darwin_*.cc conf.env.append_value('LINKFLAGS', ['-framework','Carbon']) + # cross compile for architecture specified by DEST_CPU + if 'DEST_CPU' in conf.env: + arch = conf.env['DEST_CPU'] + # map supported_archs to GCC names: + arch_mappings = {'ia32': 'i386', 'x64': 'x86_64'} + if arch in arch_mappings: + arch = arch_mappings[arch] + flags = ['-arch', arch] + conf.env.append_value('CCFLAGS', flags) + conf.env.append_value('CXXFLAGS', flags) + conf.env.append_value('LINKFLAGS', flags) + if 'DEST_CPU' in conf.env: + arch = conf.env['DEST_CPU'] + # TODO: -m32 is only available on 64 bit machines, so check host type + flags = None + if arch == 'ia32': + flags = '-m32' + if flags: + conf.env.append_value('CCFLAGS', flags) + conf.env.append_value('CXXFLAGS', flags) + conf.env.append_value('LINKFLAGS', flags) # Needed for getaddrinfo in libeio conf.env.append_value("CPPFLAGS", "-DX_STACKSIZE=%d" % (1024*64)) @@ -325,15 +379,10 @@ def v8_cmd(bld, variant): # executable is statically linked together... # XXX Change this when v8 defaults x86_64 to native builds + # Possible values are (arm, ia32, x64, mips). arch = "" - if bld.env['DEST_CPU'] == 'x86': - arch = "" - elif bld.env['DEST_CPU'] == 'x86_64': - arch = "arch=x64" - elif bld.env['DEST_CPU'] == 'arm': - arch = "arch=arm" - else: - raise Exception("supported architectures are 'x86', 'x86_64', and 'arm', but NOT '" + bld.env['DEST_CPU'] + "'.") + if bld.env['DEST_CPU']: + arch = "arch="+bld.env['DEST_CPU'] if variant == "default": mode = "release" @@ -397,10 +446,13 @@ def build(bld): Build.BuildContext.exec_command = exec_command Options.options.jobs=jobs + product_type = Options.options.product_type + product_type_is_lib = product_type != 'program' print "DEST_OS: " + bld.env['DEST_OS'] print "DEST_CPU: " + bld.env['DEST_CPU'] print "Parallel Jobs: " + str(Options.options.jobs) + print "Product type: " + product_type bld.add_subdirs('deps/libeio') @@ -471,16 +523,17 @@ def build(bld): native_cc.rule = javascript_in_c ### node lib - node = bld.new_task_gen("cxx", "program") + node = bld.new_task_gen("cxx", product_type) node.name = "node" node.target = "node" node.uselib = 'RT EV OPENSSL CARES EXECINFO DL KVM SOCKET NSL' node.add_objects = 'eio http_parser' - node.install_path = '${PREFIX}/lib' - node.install_path = '${PREFIX}/bin' + if product_type_is_lib: + node.install_path = '${PREFIX}/lib' + else: + node.install_path = '${PREFIX}/bin' node.chmod = 0755 node.source = """ - src/node_main.cc src/node.cc src/node_buffer.cc src/node_javascript.cc @@ -499,6 +552,8 @@ def build(bld): src/node_timer.cc src/node_script.cc """ + if not product_type_is_lib: + node.source = 'src/node_main.cc '+node.source platform_file = "src/platform_%s.cc" % bld.env['DEST_OS'] if os.path.exists(join(cwd, platform_file)): |