diff options
Diffstat (limited to 'SCons/Config/gnu')
-rwxr-xr-x | SCons/Config/gnu | 576 |
1 files changed, 288 insertions, 288 deletions
diff --git a/SCons/Config/gnu b/SCons/Config/gnu index 153bdb5..c1c190c 100755 --- a/SCons/Config/gnu +++ b/SCons/Config/gnu @@ -1,288 +1,288 @@ -print "Using GNU tools configuration"
-
-Import('defenv')
-
-### imports
-
-Import('FlagsConfigure')
-
-### cross compiling
-
-def cross_env(env):
- if env['PLATFORM'] != 'win32':
- env.Tool('crossmingw', toolpath = ['../Tools'])
-
-### flags
-
-def entry(x):
- if x == 'WinMain':
- x = '_WinMain@16'
- elif x == 'DllMain':
- x = '_DllMain@12'
- return '-Wl,-e%s' % x
-
-defenv['ENTRY_FLAG'] = entry
-defenv['MAP_FLAG'] = '-Wl,-Map,${TARGET.base}.map'
-defenv['EXCEPTION_FLAG'] = ''
-defenv['NODEFLIBS_FLAG'] = '-nostdlib -Wl,--exclude-libs,msvcrt.a'
-defenv['C_FLAG'] = '-x c'
-defenv['CPP_FLAG'] = '-x c++'
-defenv['ALIGN_FLAG'] = '-Wl,--file-alignment,512'
-defenv['CPP_REQUIRES_STDLIB'] = 1
-defenv['SUBSYS_CON'] = '-Wl,--subsystem,console'
-defenv['MSVCRT_FLAG'] = ''
-
-### helper functions
-
-# on Mac OS X, programs built with g++ 4.0, stl and -s error out:
-# dyld: lazy symbol binding failed: lazy pointer not found
-# dyld: lazy pointer not found
-#
-# to avoid this, this function checks if -s works
-
-def TestStrip(ctx):
- c = """
- #include <vector>
-
- int main() {
- std::vector<int> v;
- return 0;
- }
- """
- ctx.CheckLinkFlag('-s', run = 1, extension = '.cpp', code = c)
-
-### debug
-
-if defenv['DEBUG']:
- defenv.Append(CCFLAGS = '-g')
-
-### stub environment
-
-stub_env = defenv.Clone()
-cross_env(stub_env)
-
-if not defenv['DEBUG']:
- stub_env.Append(CCFLAGS = '-Os') # optimize for size
-stub_env.Append(CCFLAGS = '-Wall') # all warnings
-stub_env.Append(CCFLAGS = '-x c') # force compile as c
-stub_env.Append(CCFLAGS = '-fno-strict-aliasing') # not safe for strict aliasing
-
-if not defenv['DEBUG'] and defenv['STRIP']:
- stub_env.Append(LINKFLAGS = '-s') # strip
-stub_env.Append(LINKFLAGS = '-mwindows') # build windows executables
-stub_env.Append(LINKFLAGS = '$NODEFLIBS_FLAG') # no standard libraries
-stub_env.Append(LINKFLAGS = '$ALIGN_FLAG') # 512 bytes align
-stub_env.Append(LINKFLAGS = '-Wl,-e,_WinMain@16') # entry point
-stub_env.Append(LINKFLAGS = '$MAP_FLAG') # generate map file
-
-### makensis environment
-
-makensis_env = defenv.Clone()
-
-if not defenv['DEBUG']:
- makensis_env.Append(CCFLAGS = '-O2') # optimize
-makensis_env.Append(CCFLAGS = '-Wall') # all warnings
-makensis_env.Append(CXXFLAGS = '-Wno-non-virtual-dtor') # ignore virtual dtor warnings
-
-conf = FlagsConfigure(makensis_env)
-conf.CheckLinkFlag('-m32') #
-conf.CheckCompileFlag('-m32') #
-conf.CheckLinkFlag('$MAP_FLAG') # generate map file
-if not defenv['DEBUG'] and defenv['STRIP']:
- TestStrip(conf) # strip
-conf.Finish()
-
-### plugin environment
-
-plugin_env = defenv.Clone()
-cross_env(plugin_env)
-
-if not defenv['DEBUG']:
- plugin_env.Append(CCFLAGS = '-Os') # optimize for size
-plugin_env.Append(CCFLAGS = '-Wall') # level 3 warnings
-plugin_env.Append(CCFLAGS = '-fno-strict-aliasing') # not safe for strict aliasing
-
-if not defenv['DEBUG'] and defenv['STRIP']:
- plugin_env.Append(LINKFLAGS = '-s') # strip
-plugin_env.Append(LINKFLAGS = '-mwindows') # build windows executables
-plugin_env.Append(LINKFLAGS = '$ALIGN_FLAG') # 512 bytes align
-plugin_env.Append(LINKFLAGS = '$MAP_FLAG') # generate map file
-
-### cross-platform util environment
-
-cp_util_env = defenv.Clone()
-
-if not defenv['DEBUG']:
- cp_util_env.Append(CCFLAGS = '-O2') # optimize
-cp_util_env.Append(CCFLAGS = '-Wall') # all warnings
-cp_util_env.Append(CCFLAGS = '-fno-strict-aliasing') # not safe for strict aliasing
-
-conf = FlagsConfigure(cp_util_env)
-conf.CheckLinkFlag('$MAP_FLAG') # generate map file
-if not defenv['DEBUG'] and defenv['STRIP']:
- TestStrip(conf) # strip
-conf.Finish()
-
-### util environment
-
-util_env = cp_util_env.Clone()
-cross_env(util_env)
-
-util_env.Append(LINKFLAGS = '-mwindows') # build windows executables
-util_env.Append(LINKFLAGS = '$ALIGN_FLAG') # 512 bytes align
-
-### test environment
-
-test_env = defenv.Clone()
-
-### weird GCC requirements
-
-#
-# GCC puts new PE sections, added by code, between other sections.
-# This is not good for the .ndata section because makensis changes
-# its size dynamically. This is not good if RVAs to sections below
-# it are saved in other places. The RVAs will point to garbage.
-#
-# To fix this, a linker script is provided. The linker script makes
-# sure the sections will be written in the correct order.
-#
-
-stub_env.Append(LINKFLAGS = '-T %s' % File('linker_script').abspath)
-
-#
-# GCC requires some functions from the CRT to be present, if certain
-# operations are done. For example, if a small string is assigned to
-# a larger buffer, GCC 3.4+ uses memset to fill the remaining of the
-# buffer with zeros.
-#
-
-def check_requirement(ctx, func, trigger):
- ctx.Message('Checking for %s requirement... ' % func)
-
- flags = ctx.env['LINKFLAGS']
-
- ctx.env.Append(LINKFLAGS = '$NODEFLIBS_FLAG')
- ctx.env.Append(LINKFLAGS = '-Wl,-e,___main')
-
- test = """
- int __main() {
- %s
- return 0;
- }
- """ % trigger
-
- result = not ctx.TryLink(test, '.c')
- ctx.Result(result)
-
- ctx.env['LINKFLAGS'] = flags
-
- return result
-
-def add_file_to_emitter(env, emitter_name, file):
- try:
- original_emitter = env[emitter_name]
- if type(original_emitter) == list:
- original_emitter = original_emitter[0]
- except KeyError:
- original_emitter = None
-
- def emitter(target, source, env):
- if original_emitter:
- target, source = original_emitter(target, source, env)
-
- if '$NODEFLIBS_FLAG' not in env['LINKFLAGS']:
- return target, source
-
- return target, source + [file]
-
- env[emitter_name] = emitter
-
-def add_file(file):
- file = File(file)
- add_file_to_emitter(stub_env, 'PROGEMITTER', file)
- add_file_to_emitter(util_env, 'PROGEMITTER', file)
- add_file_to_emitter(plugin_env, 'SHLIBEMITTER', file)
-
-cenv = defenv.Clone()
-cross_env(cenv)
-conf = cenv.Configure(custom_tests = { 'CheckRequirement' : check_requirement })
-
-memcpy_test = """
-struct s // gcc 3
-{
- char c[128];
-} t = { "test" };
-char a[] = // gcc 4
- {'/', 'F', 'I' ,'L', 'L', 'S', 'C', 'R', 'E', 'E', 'N', 0};
-int i;
-for (i = 0; i < 100; i++) // avoid a and t being optimized out
-{
- i += a[i] ^ t.c[i];
-}
-return i;
-"""
-
-memset_test = """
-char c[128] = "test";
-c[0] = '6'; // avoid c being optimized out
-return c[1]; // avoid c being optimized out
-"""
-
-if conf.CheckRequirement('memcpy', memcpy_test):
- add_file('memcpy.c')
-
-if conf.CheckRequirement('memset', memset_test):
- add_file('memset.c')
-
-conf.Finish()
-
-#
-# Some platforms, like FreeBSD, require -pthread flag to be passed
-# instead of -lpthread.
-#
-
-conf = FlagsConfigure(makensis_env)
-conf.CheckLinkFlag('-pthread')
-conf.Finish()
-
-#
-# GCC doesn't define __BIG_ENDIAN__ or __LITTLE_ENDIAN__, so manually check
-# for the endianess and define __BIG_ENDIAN__ if needed.
-#
-
-def check_big_endian(ctx):
- ctx.Message('Checking for __BIG_ENDIAN__... ')
-
- test = """
- int main() {
- #ifdef __BIG_ENDIAN__
- // already defined, no need to define again
- return 0;
- #else
- int i = 1;
- char *c = (char *) &i;
- return c[0] != 1;
- #endif
- }
- """
-
- result = not ctx.TryRun(test, '.c')[0]
- ctx.Result(result)
- return result
-
-conf = defenv.Configure(custom_tests = { 'CheckBigEndian' : check_big_endian })
-if conf.CheckBigEndian():
- makensis_env.Append(CPPDEFINES = ['__BIG_ENDIAN__'])
- test_env.Append(CPPDEFINES = ['__BIG_ENDIAN__'])
-conf.Finish()
-
-if makensis_env['PLATFORM'] == 'hpux':
- makensis_env.Append(CPPDEFINES = ['NSIS_HPUX_ALLOW_UNALIGNED_DATA_ACCESS'])
- makensis_conf = makensis_env.Configure()
- makensis_conf.CheckLib("unalign")
- makensis_conf.CheckLib("hppa")
- makensis_conf.Finish()
-
-### return
-
-Return('stub_env makensis_env plugin_env util_env cp_util_env test_env')
+print "Using GNU tools configuration" + +Import('defenv') + +### imports + +Import('FlagsConfigure') + +### cross compiling + +def cross_env(env): + if env['PLATFORM'] != 'win32': + env.Tool('crossmingw', toolpath = ['../Tools']) + +### flags + +def entry(x): + if x == 'WinMain': + x = '_WinMain@16' + elif x == 'DllMain': + x = '_DllMain@12' + return '-Wl,-e%s' % x + +defenv['ENTRY_FLAG'] = entry +defenv['MAP_FLAG'] = '-Wl,-Map,${TARGET.base}.map' +defenv['EXCEPTION_FLAG'] = '' +defenv['NODEFLIBS_FLAG'] = '-nostdlib -Wl,--exclude-libs,msvcrt.a' +defenv['C_FLAG'] = '-x c' +defenv['CPP_FLAG'] = '-x c++' +defenv['ALIGN_FLAG'] = '-Wl,--file-alignment,512' +defenv['CPP_REQUIRES_STDLIB'] = 1 +defenv['SUBSYS_CON'] = '-Wl,--subsystem,console' +defenv['MSVCRT_FLAG'] = '' + +### helper functions + +# on Mac OS X, programs built with g++ 4.0, stl and -s error out: +# dyld: lazy symbol binding failed: lazy pointer not found +# dyld: lazy pointer not found +# +# to avoid this, this function checks if -s works + +def TestStrip(ctx): + c = """ + #include <vector> + + int main() { + std::vector<int> v; + return 0; + } + """ + ctx.CheckLinkFlag('-s', run = 1, extension = '.cpp', code = c) + +### debug + +if defenv['DEBUG']: + defenv.Append(CCFLAGS = '-g') + +### stub environment + +stub_env = defenv.Clone() +cross_env(stub_env) + +if not defenv['DEBUG']: + stub_env.Append(CCFLAGS = '-Os') # optimize for size +stub_env.Append(CCFLAGS = '-Wall') # all warnings +stub_env.Append(CCFLAGS = '-x c') # force compile as c +stub_env.Append(CCFLAGS = '-fno-strict-aliasing') # not safe for strict aliasing + +if not defenv['DEBUG'] and defenv['STRIP']: + stub_env.Append(LINKFLAGS = '-s') # strip +stub_env.Append(LINKFLAGS = '-mwindows') # build windows executables +stub_env.Append(LINKFLAGS = '$NODEFLIBS_FLAG') # no standard libraries +stub_env.Append(LINKFLAGS = '$ALIGN_FLAG') # 512 bytes align +stub_env.Append(LINKFLAGS = '-Wl,-e,_WinMain@16') # entry point +stub_env.Append(LINKFLAGS = '$MAP_FLAG') # generate map file + +### makensis environment + +makensis_env = defenv.Clone() + +if not defenv['DEBUG']: + makensis_env.Append(CCFLAGS = '-O2') # optimize +makensis_env.Append(CCFLAGS = '-Wall') # all warnings +makensis_env.Append(CXXFLAGS = '-Wno-non-virtual-dtor') # ignore virtual dtor warnings + +conf = FlagsConfigure(makensis_env) +conf.CheckCompileFlag('-m32') # +conf.CheckLinkFlag('-m32') # +conf.CheckLinkFlag('$MAP_FLAG') # generate map file +if not defenv['DEBUG'] and defenv['STRIP']: + TestStrip(conf) # strip +conf.Finish() + +### plugin environment + +plugin_env = defenv.Clone() +cross_env(plugin_env) + +if not defenv['DEBUG']: + plugin_env.Append(CCFLAGS = '-Os') # optimize for size +plugin_env.Append(CCFLAGS = '-Wall') # level 3 warnings +plugin_env.Append(CCFLAGS = '-fno-strict-aliasing') # not safe for strict aliasing + +if not defenv['DEBUG'] and defenv['STRIP']: + plugin_env.Append(LINKFLAGS = '-s') # strip +plugin_env.Append(LINKFLAGS = '-mwindows') # build windows executables +plugin_env.Append(LINKFLAGS = '$ALIGN_FLAG') # 512 bytes align +plugin_env.Append(LINKFLAGS = '$MAP_FLAG') # generate map file + +### cross-platform util environment + +cp_util_env = defenv.Clone() + +if not defenv['DEBUG']: + cp_util_env.Append(CCFLAGS = '-O2') # optimize +cp_util_env.Append(CCFLAGS = '-Wall') # all warnings +cp_util_env.Append(CCFLAGS = '-fno-strict-aliasing') # not safe for strict aliasing + +conf = FlagsConfigure(cp_util_env) +conf.CheckLinkFlag('$MAP_FLAG') # generate map file +if not defenv['DEBUG'] and defenv['STRIP']: + TestStrip(conf) # strip +conf.Finish() + +### util environment + +util_env = cp_util_env.Clone() +cross_env(util_env) + +util_env.Append(LINKFLAGS = '-mwindows') # build windows executables +util_env.Append(LINKFLAGS = '$ALIGN_FLAG') # 512 bytes align + +### test environment + +test_env = defenv.Clone() + +### weird GCC requirements + +# +# GCC puts new PE sections, added by code, between other sections. +# This is not good for the .ndata section because makensis changes +# its size dynamically. This is not good if RVAs to sections below +# it are saved in other places. The RVAs will point to garbage. +# +# To fix this, a linker script is provided. The linker script makes +# sure the sections will be written in the correct order. +# + +stub_env.Append(LINKFLAGS = '-T %s' % File('linker_script').abspath) + +# +# GCC requires some functions from the CRT to be present, if certain +# operations are done. For example, if a small string is assigned to +# a larger buffer, GCC 3.4+ uses memset to fill the remaining of the +# buffer with zeros. +# + +def check_requirement(ctx, func, trigger): + ctx.Message('Checking for %s requirement... ' % func) + + flags = ctx.env['LINKFLAGS'] + + ctx.env.Append(LINKFLAGS = '$NODEFLIBS_FLAG') + ctx.env.Append(LINKFLAGS = '-Wl,-e,___main') + + test = """ + int __main() { + %s + return 0; + } + """ % trigger + + result = not ctx.TryLink(test, '.c') + ctx.Result(result) + + ctx.env['LINKFLAGS'] = flags + + return result + +def add_file_to_emitter(env, emitter_name, file): + try: + original_emitter = env[emitter_name] + if type(original_emitter) == list: + original_emitter = original_emitter[0] + except KeyError: + original_emitter = None + + def emitter(target, source, env): + if original_emitter: + target, source = original_emitter(target, source, env) + + if '$NODEFLIBS_FLAG' not in env['LINKFLAGS']: + return target, source + + return target, source + [file] + + env[emitter_name] = emitter + +def add_file(file): + file = File(file) + add_file_to_emitter(stub_env, 'PROGEMITTER', file) + add_file_to_emitter(util_env, 'PROGEMITTER', file) + add_file_to_emitter(plugin_env, 'SHLIBEMITTER', file) + +cenv = defenv.Clone() +cross_env(cenv) +conf = cenv.Configure(custom_tests = { 'CheckRequirement' : check_requirement }) + +memcpy_test = """ +struct s // gcc 3 +{ + char c[128]; +} t = { "test" }; +char a[] = // gcc 4 + {'/', 'F', 'I' ,'L', 'L', 'S', 'C', 'R', 'E', 'E', 'N', 0}; +int i; +for (i = 0; i < 100; i++) // avoid a and t being optimized out +{ + i += a[i] ^ t.c[i]; +} +return i; +""" + +memset_test = """ +char c[128] = "test"; +c[0] = '6'; // avoid c being optimized out +return c[1]; // avoid c being optimized out +""" + +if conf.CheckRequirement('memcpy', memcpy_test): + add_file('memcpy.c') + +if conf.CheckRequirement('memset', memset_test): + add_file('memset.c') + +conf.Finish() + +# +# Some platforms, like FreeBSD, require -pthread flag to be passed +# instead of -lpthread. +# + +conf = FlagsConfigure(makensis_env) +conf.CheckLinkFlag('-pthread') +conf.Finish() + +# +# GCC doesn't define __BIG_ENDIAN__ or __LITTLE_ENDIAN__, so manually check +# for the endianess and define __BIG_ENDIAN__ if needed. +# + +def check_big_endian(ctx): + ctx.Message('Checking for __BIG_ENDIAN__... ') + + test = """ + int main() { + #ifdef __BIG_ENDIAN__ + // already defined, no need to define again + return 0; + #else + int i = 1; + char *c = (char *) &i; + return c[0] != 1; + #endif + } + """ + + result = not ctx.TryRun(test, '.c')[0] + ctx.Result(result) + return result + +conf = defenv.Configure(custom_tests = { 'CheckBigEndian' : check_big_endian }) +if conf.CheckBigEndian(): + makensis_env.Append(CPPDEFINES = ['__BIG_ENDIAN__']) + test_env.Append(CPPDEFINES = ['__BIG_ENDIAN__']) +conf.Finish() + +if makensis_env['PLATFORM'] == 'hpux': + makensis_env.Append(CPPDEFINES = ['NSIS_HPUX_ALLOW_UNALIGNED_DATA_ACCESS']) + makensis_conf = makensis_env.Configure() + makensis_conf.CheckLib("unalign") + makensis_conf.CheckLib("hppa") + makensis_conf.Finish() + +### return + +Return('stub_env makensis_env plugin_env util_env cp_util_env test_env') |