summaryrefslogtreecommitdiff
path: root/common.py
diff options
context:
space:
mode:
authorJosé Fonseca <jrfonseca@tungstengraphics.com>2008-04-25 18:16:25 +0900
committerJosé Fonseca <jrfonseca@tungstengraphics.com>2008-04-25 18:16:25 +0900
commit35460fc91cf5311a4cbaee3c577ad8a95ccab1a1 (patch)
tree93a729c942bac01233206eda24b61e32e57c27ce /common.py
parentb4c7a48d5c9ed2f9535a17d6c05cd55178c7880a (diff)
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.
Diffstat (limited to 'common.py')
-rw-r--r--common.py159
1 files changed, 156 insertions, 3 deletions
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()