# # SConstruct for the Duktape project, including sources, documentation, etc. # # FIXME: target detection is just a placeholder import os import sys import subprocess # helper to get a command's stdout (executed during tree build) def get_stdout(args): p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout_data, stderr_data = p.communicate() rc = p.wait() if rc != 0: raise Exception('failed to run %r -> %r' % (args, rc)) return stdout_data.strip() # detect host features and assume (for now) that it is also the target machine_infos = { 'i386': { 'name': 'x86 (i386)', 'supports_packed': True, 'byte_order': 'little' }, 'i486': { 'name': 'x86 (i486)', 'supports_packed': True, 'byte_order': 'little' }, 'i586': { 'name': 'x86 (i586)', 'supports_packed': True, 'byte_order': 'little' }, 'i686': { 'name': 'x86 (i686)', 'supports_packed': True, 'byte_order': 'little' }, 'x86_64': { 'name': 'x86-64', 'supports_packed': False, 'byte_order': 'little' }, 'default': { 'name': 'unknown', 'supports_packed': True, 'byte_order': 'little' }, # just a guess } machine_type = get_stdout(['uname', '-m']) if machine_infos.has_key(machine_type): machine = machine_infos[machine_type] else: machine = machine_infos['default'] print('Detected host (=target) machine: %r' % machine) # build info buildinfo_date = get_stdout(['date', '+%Y-%m-%d']) # more stable than full datetime -> better for incremental builds buildinfo_uname = get_stdout(['uname', '-a']) try: buildinfo_githash = get_stdout(['git', 'rev-parse', 'HEAD']) except: buildinfo_githash = 'exported' duk_buildinfo = '%s; %s; %s' % (buildinfo_date, buildinfo_uname, buildinfo_githash) # duk version duk_version = 1 # profile selection, may depend on target capabilities duk_profiles = [ { 'number': 100, 'packed': True, 'debug': False }, { 'number': 101, 'packed': True, 'debug': True }, { 'number': 200, 'packed': True, 'debug': False }, { 'number': 201, 'packed': True, 'debug': True }, { 'number': 300, 'packed': True, 'debug': False }, { 'number': 301, 'packed': True, 'debug': True }, { 'number': 400, 'packed': False, 'debug': False }, { 'number': 401, 'packed': False, 'debug': True }, { 'number': 500, 'packed': False, 'debug': False }, { 'number': 501, 'packed': False, 'debug': True }, ] # Preferred compiler and options. Note: GCC version has significant impact # on -Os code size, e.g. gcc-4.6 is way worse than gcc-4.5. # FIXME: not used now PREF_CC = 'gcc' #PREF_CC = '/usr/bin/gcc-4.3' #PREF_CC = '/usr/bin/gcc-4.4' #PREF_CC = '/usr/bin/gcc-4.5' #PREF_CC = '/usr/bin/gcc-4.6' #PREF_CC = '/usr/bin/gcc-4.7' # FIXME: this is a hack for x86-64, where we want to build both 32-bit and 64-bit # files for better testing; needs a separate variant FORCE_32BIT = False #if machine_type == 'x86_64': # FORCE_32BIT = True ccopts_shared = [ '-pedantic', '-ansi', '-std=c99', '-Wall', '-fstrict-aliasing', '-D_POSIX_C_SOURCE=200809L', # '-D_GNU_SOURCE', # FIXME: needed for e.g. getdate_r '-D_XOPEN_SOURCE', # strptime '-DDUK_OPT_DPRINT_RDTSC=1', ] if FORCE_32BIT: ccopts_shared += [ '-m32' ] ccopts_release = ccopts_shared + [ '-fomit-frame-pointer', '-Os', '-g', '-ggdb', ] ccopts_debug = ccopts_shared + [ '-O0', '-g', '-ggdb', ] ldflags_shared = [] if FORCE_32BIT: ldflags_shared += [ '-m32' ] ldflags_release = ldflags_shared ldflags_debug = ldflags_shared env_base = Environment() env_release = env_base.Clone(CCFLAGS=ccopts_release, LINKFLAGS=ldflags_release) env_debug = env_base.Clone(CCFLAGS=ccopts_debug, LINKFLAGS=ldflags_debug) for prof in duk_profiles: if prof['debug']: env_build = env_debug.Clone() else: env_build = env_release.Clone() if prof['packed'] and not machine['supports_packed'] and not FORCE_32BIT: print('skip packed profile (target does not support packed): %r' % prof) continue SConscript('src/SConscript', variant_dir='build/' + str(prof['number']), exports={ 'duk_profile': str(prof['number']), 'duk_version': duk_version, 'duk_buildinfo': duk_buildinfo, 'is_debug': prof['debug'], 'byte_order': machine['byte_order'], 'env': env_build }) Clean('.', ['build/' + str(prof['number'])]) Clean('.', ['build']) SConscript('doc/SConscript')