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.
This commit is contained in:
José Fonseca
2008-04-25 18:16:25 +09:00
parent b4c7a48d5c
commit 35460fc91c
3 changed files with 158 additions and 139 deletions

159
common.py
View File

@@ -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()