From 35460fc91cf5311a4cbaee3c577ad8a95ccab1a1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Fri, 25 Apr 2008 18:16:25 +0900 Subject: [PATCH] scons: Teach scons about user-land windows. Actually, more like get rid of all our hacks when compiling for user-land windows. Only MSVC is supported atm though. --- SConstruct | 37 +------------ common.py | 159 ++++++++++++++++++++++++++++++++++++++++++++++++++++- winddk.py | 101 ---------------------------------- 3 files changed, 158 insertions(+), 139 deletions(-) diff --git a/SConstruct b/SConstruct index 4785e39ec56..9b46e6ade2b 100644 --- a/SConstruct +++ b/SConstruct @@ -65,7 +65,7 @@ platform = env['platform'] # derived options x86 = machine == 'x86' gcc = platform in ('linux', 'freebsd', 'darwin') -msvc = platform in ('win32', 'winddk') +msvc = platform in ('windows', 'winddk') Export([ 'debug', @@ -84,8 +84,6 @@ Export([ # TODO: put the compiler specific settings in separate files # TODO: auto-detect as much as possible -common.generate(env) - if platform == 'winddk': env.Tool('winddk', ['.']) @@ -96,37 +94,7 @@ if platform == 'winddk': env['CRT_INC_PATH'], ]) -# Optimization flags -if gcc: - if debug: - env.Append(CFLAGS = '-O0 -g3') - env.Append(CXXFLAGS = '-O0 -g3') - else: - env.Append(CFLAGS = '-O3 -g3') - env.Append(CXXFLAGS = '-O3 -g3') - - env.Append(CFLAGS = '-Wall -Wmissing-prototypes -Wno-long-long -ffast-math -pedantic') - env.Append(CXXFLAGS = '-Wall -pedantic') - - # Be nice to Eclipse - env.Append(CFLAGS = '-fmessage-length=0') - env.Append(CXXFLAGS = '-fmessage-length=0') - -if msvc: - cflags = [ - #'/Wp64', # enable 64 bit porting warnings - ] - env.Append(CFLAGS = cflags) - env.Append(CXXFLAGS = cflags) - # Put debugging information in a separate .pdb file for each object file as - # descrived in the scons manpage - env['CCPDBFLAGS'] = '/Zi /Fd${TARGET}.pdb' - -# Defines -if debug: - env.Append(CPPDEFINES = ['DEBUG']) -else: - env.Append(CPPDEFINES = ['NDEBUG']) +common.generate(env) # Includes @@ -188,7 +156,6 @@ if llvm: # See also http://www.scons.org/wiki/UsingPkgConfig env.ParseConfig('llvm-config --cflags --ldflags --libs') env.Append(CPPDEFINES = ['MESA_LLVM']) - env.Append(CXXFLAGS = ['-Wno-long-long']) # Force C++ linkage env['LINK'] = env['CXX'] diff --git a/common.py b/common.py index b836a8b41db..51cbd90f1df 100644 --- a/common.py +++ b/common.py @@ -34,7 +34,7 @@ default_machine = _machine_map.get(default_machine, 'generic') if default_platform in ('linux', 'freebsd', 'darwin'): default_dri = 'yes' -elif default_platform in ('winddk',): +elif default_platform in ('winddk', 'windows'): default_dri = 'no' else: default_dri = 'no' @@ -51,7 +51,7 @@ def AddOptions(opts): opts.Add(EnumOption('machine', 'use machine-specific assembly code', default_machine, allowed_values=('generic', 'x86', 'x86_64'))) opts.Add(EnumOption('platform', 'target platform', default_platform, - allowed_values=('linux', 'cell', 'winddk'))) + allowed_values=('linux', 'cell', 'windows', 'winddk'))) opts.Add(BoolOption('llvm', 'use LLVM', 'no')) opts.Add(BoolOption('dri', 'build DRI drivers', default_dri)) @@ -133,8 +133,161 @@ def generate(env): # FIXME: this is already too late #if env.get('quiet', False): # quietCommandLines(env) - createConvenienceLibBuilder(env) + + # shortcuts + debug = env['debug'] + machine = env['machine'] + platform = env['platform'] + x86 = env['machine'] == 'x86' + gcc = env['platform'] in ('linux', 'freebsd', 'darwin') + msvc = env['platform'] in ('windows', 'winddk') + + # C preprocessor options + cppdefines = [] + if debug: + cppdefines += ['DEBUG'] + else: + cppdefines += ['NDEBUG'] + if platform == 'windows': + cppdefines += [ + 'WIN32', + '_WINDOWS', + '_UNICODE', + 'UNICODE', + # http://msdn2.microsoft.com/en-us/library/6dwk3a1z.aspx, + 'WIN32_LEAN_AND_MEAN', + 'VC_EXTRALEAN', + ] + if debug: + cppdefines += ['_DEBUG'] + if platform == 'winddk': + # Mimic WINDDK's builtin flags. See also: + # - WINDDK's bin/makefile.new i386mk.inc for more info. + # - buildchk_wxp_x86.log files, generated by the WINDDK's build + # - http://alter.org.ua/docs/nt_kernel/vc8_proj/ + cppdefines += [ + ('_X86_', '1'), + ('i386', '1'), + 'STD_CALL', + ('CONDITION_HANDLING', '1'), + ('NT_INST', '0'), + ('WIN32', '100'), + ('_NT1X_', '100'), + ('WINNT', '1'), + ('_WIN32_WINNT', '0x0501'), # minimum required OS version + ('WINVER', '0x0501'), + ('_WIN32_IE', '0x0603'), + ('WIN32_LEAN_AND_MEAN', '1'), + ('DEVL', '1'), + ('__BUILDMACHINE__', 'WinDDK'), + ('FPO', '0'), + ] + if debug: + cppdefines += [('DBG', 1)] + if platform == 'windows': + cppdefines += ['PIPE_SUBSYSTEM_USER'] + if platform == 'winddk': + cppdefines += ['PIPE_SUBSYSTEM_KERNEL'] + env.Append(CPPDEFINES = cppdefines) + + # C compiler options + cflags = [] + if gcc: + if debug: + cflags += ['-O0', '-g3'] + else: + cflags += ['-O3', '-g3'] + cflags += [ + '-Wall', + '-Wmissing-prototypes', + '-Wno-long-long', + '-ffast-math', + '-pedantic', + '-fmessage-length=0', # be nice to Eclipse + ] + if msvc: + # See also: + # - http://msdn2.microsoft.com/en-us/library/y0zzbyt4.aspx + # - cl /? + if debug: + cflags += [ + '/Od', # disable optimizations + '/Oi', # enable intrinsic functions + '/Oy-', # disable frame pointer omission + ] + else: + cflags += [ + '/Ox', # maximum optimizations + '/Oi', # enable intrinsic functions + '/Os', # favor code space + ] + if platform == 'windows': + cflags += [ + # TODO + #'/Wp64', # enable 64 bit porting warnings + ] + if platform == 'winddk': + cflags += [ + '/Zl', # omit default library name in .OBJ + '/Zp8', # 8bytes struct member alignment + '/Gy', # separate functions for linker + '/Gm-', # disable minimal rebuild + '/W3', # warning level + '/WX', # treat warnings as errors + '/Gz', # __stdcall Calling convention + '/GX-', # disable C++ EH + '/GR-', # disable C++ RTTI + '/GF', # enable read-only string pooling + '/GS', # enable security checks + '/G6', # optimize for PPro, P-II, P-III + '/Ze', # enable extensions + #'/Gi-', # ??? + '/QIfdiv-', # disable Pentium FDIV fix + #'/hotpatch', # ??? + #'/Z7', #enable old-style debug info + ] + # Put debugging information in a separate .pdb file for each object file as + # descrived in the scons manpage + env['CCPDBFLAGS'] = '/Zi /Fd${TARGET}.pdb' + env.Append(CFLAGS = cflags) + env.Append(CXXFLAGS = cflags) + # Linker options + if platform == 'winddk': + # See also: + # - http://msdn2.microsoft.com/en-us/library/y0zzbyt4.aspx + env.Append(LINKFLAGS = [ + '/merge:_PAGE=PAGE', + '/merge:_TEXT=.text', + '/section:INIT,d', + '/opt:ref', + '/opt:icf', + '/ignore:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221', + '/incremental:no', + '/fullbuild', + '/release', + '/nodefaultlib', + '/wx', + '/debug', + '/debugtype:cv', + '/version:5.1', + '/osversion:5.1', + '/functionpadmin:5', + '/safeseh', + '/pdbcompress', + '/stack:0x40000,0x1000', + '/driver', + '/align:0x80', + '/subsystem:native,5.01', + '/base:0x10000', + + '/entry:DrvEnableDriver', + ]) + + + createConvenienceLibBuilder(env) + + # for debugging #print env.Dump() diff --git a/winddk.py b/winddk.py index c112329cd69..58de1838576 100644 --- a/winddk.py +++ b/winddk.py @@ -89,105 +89,6 @@ def get_winddk_paths(env, version=None): exe_path = string.join(exe_paths, os.pathsep ) return (include_path, lib_path, exe_path) -def set_winddk_flags(env): - """Mimic WINDDK's builtin flags. - - See also: - - WINDDK's bin/makefile.new i386mk.inc for more info. - - buildchk_wxp_x86.log files, generated by the WINDDK's build - - http://alter.org.ua/docs/nt_kernel/vc8_proj/ - """ - - cppdefines = [ - ('_X86_', '1'), - ('i386', '1'), - 'STD_CALL', - ('CONDITION_HANDLING', '1'), - ('NT_INST', '0'), - ('WIN32', '100'), - ('_NT1X_', '100'), - ('WINNT', '1'), - ('_WIN32_WINNT', '0x0501'), # minimum required OS version - ('WINVER', '0x0501'), - ('_WIN32_IE', '0x0603'), - ('WIN32_LEAN_AND_MEAN', '1'), - ('DEVL', '1'), - ('__BUILDMACHINE__', 'WinDDK'), - ('FPO', '0'), - ] - if env.get('DEBUG', False): - cppdefines += [ - ('DBG', 1), - ] - env.Append(CPPDEFINES = cppdefines) - - # See also: - # - http://msdn2.microsoft.com/en-us/library/y0zzbyt4.aspx - # - cl /? - cflags = [ - '/Zl', # omit default library name in .OBJ - '/Zp8', # 8bytes struct member alignment - '/Gy', # separate functions for linker - '/Gm-', # disable minimal rebuild - '/W3', # warning level - '/WX', # treat warnings as errors - '/Gz', # __stdcall Calling convention - '/GX-', # disable C++ EH - '/GR-', # disable C++ RTTI - '/GF', # enable read-only string pooling - '/GS', # enable security checks - '/G6', # optimize for PPro, P-II, P-III - '/Ze', # enable extensions - #'/Gi-', # ??? - '/QIfdiv-', # disable Pentium FDIV fix - #'/hotpatch', # ??? - #'/Z7', #enable old-style debug info - ] - if env.get('debug', False): - cflags += [ - '/Od', # disable optimizations - '/Oi', # enable intrinsic functions - '/Oy-', # disable frame pointer omission - ] - else: - cflags += [ - '/Ox', # maximum optimizations - '/Oi', # enable intrinsic functions - '/Os', # favor code space - ] - env.Append(CFLAGS = cflags) - env.Append(CXXFLAGS = cflags) - - # See also: - # - http://msdn2.microsoft.com/en-us/library/y0zzbyt4.aspx - env.Append(LINKFLAGS = [ - '/merge:_PAGE=PAGE', - '/merge:_TEXT=.text', - '/section:INIT,d', - '/opt:ref', - '/opt:icf', - '/ignore:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221', - '/incremental:no', - '/fullbuild', - '/release', - '/nodefaultlib', - '/wx', - '/debug', - '/debugtype:cv', - '/version:5.1', - '/osversion:5.1', - '/functionpadmin:5', - '/safeseh', - '/pdbcompress', - '/stack:0x40000,0x1000', - '/driver', - '/align:0x80', - '/subsystem:native,5.01', - '/base:0x10000', - - '/entry:DrvEnableDriver', - ]) - def validate_vars(env): """Validate the PCH and PCHSTOP construction variables.""" if env.has_key('PCH') and env['PCH']: @@ -314,8 +215,6 @@ def generate(env): SCons.Tool.mslink.generate(env) - set_winddk_flags(env) - if not env.has_key('ENV'): env['ENV'] = {} -- 2.30.2