|     28  |     28  | 
|     29 Options: |     29 Options: | 
|     30 """) |     30 """) | 
|     31  |     31  | 
|     32 import os, sys |     32 import os, sys | 
|     33 env = Environment() #(ENV = {'PATH' : os.environ['PATH']}) |     33  | 
|         |     34 EnsurePythonVersion(2, 3) | 
|         |     35 EnsureSConsVersion(0, 97) | 
|         |     36  | 
|     34 Decider('MD5-timestamp') |     37 Decider('MD5-timestamp') | 
|     35  |     38 SConsignFile('build/.sconsign.dblite') | 
|     36 opt = Options(['.optioncache']) |     39  | 
|         |     40 if sys.platform == 'win32': | 
|         |     41 	tools = ['mingw'] | 
|         |     42 else: | 
|         |     43 	tools = ['default'] | 
|         |     44  | 
|         |     45 env = Environment(tools = tools) | 
|         |     46  | 
|         |     47 opt = Options(['build/.optioncache']) | 
|     37 opt.AddOptions( |     48 opt.AddOptions( | 
|     38 	BoolOption('intelc', 'use Intel C++ Compiler, if available', True), |         | 
|     39 	BoolOption('simd', 'allow SSE intrinsics', True), |     49 	BoolOption('simd', 'allow SSE intrinsics', True), | 
|     40 	('precision', 'floating point number precision (single/double)', "single"), |     50 	('precision', 'floating point number precision (single/double)', "single"), | 
|     41 	('flags', 'add additional compiler flags', ""), |     51 	('flags', 'add additional compiler flags', ""), | 
|     42 	BoolOption('force_flags', "use only flags specified by 'flags' option (do not autodetect arch/sse flags)", False), |     52 	BoolOption('force_flags', "use only flags specified by 'flags' option (do not autodetect arch/sse flags)", False), | 
|     43 	BoolOption('profile', "enable gcc's profiling support (-pg)", False), |     53 	BoolOption('profile', "enable gcc's profiling support (-pg)", False), | 
|     44 ) |     54 ) | 
|     45 if env['PLATFORM'] == 'win32': |     55 if env['PLATFORM'] == 'win32': | 
|     46 	opt.AddOptions( |     56 	opt.AddOptions( | 
|         |     57 		BoolOption('msvc', 'use Microsoft Visual C++ Compiler, if available', True), | 
|     47 		('pythonpath', 'path to Python installation', |     58 		('pythonpath', 'path to Python installation', | 
|     48 			'C:\\Python%c%c' % (sys.version[0], sys.version[2])), |     59 			'C:\\Python%c%c' % (sys.version[0], sys.version[2])), | 
|     49 		) |     60 	) | 
|         |     61 else: | 
|         |     62 	opt.AddOptions( | 
|         |     63 		BoolOption('intelc', 'use Intel C++ Compiler, if available', True), | 
|         |     64 	) | 
|         |     65  | 
|         |     66  | 
|     50 opt.Update(env) |     67 opt.Update(env) | 
|     51 opt.Save('.optioncache', env) |     68 opt.Save('build/.optioncache', env) | 
|     52 Help(opt.GenerateHelpText(env)) |     69 Help(opt.GenerateHelpText(env)) | 
|     53  |     70  | 
|     54  |     71  | 
|     55 ### configure |     72 ### configure | 
|     56  |     73  | 
|     81 		context.Result(intelc) |     98 		context.Result(intelc) | 
|     82 	return intelc |     99 	return intelc | 
|     83  |    100  | 
|     84 def CheckGCC(context): |    101 def CheckGCC(context): | 
|     85 	global gcc, gccversion |    102 	global gcc, gccversion | 
|     86 	context.Message('Checking for GCC... ') |    103 	context.Message('Checking for GCC compiler... ') | 
|     87 	gcc = "g++" in env['TOOLS'] |    104 	gcc = "g++" in env['TOOLS'] | 
|     88 	if gcc: |    105 	if gcc: | 
|     89 		gccversion = env['CCVERSION'] |    106 		gccversion = env['CCVERSION'] | 
|     90 		context.Result(gccversion) |    107 		context.Result(gccversion) | 
|     91 	else: |    108 	else: | 
|     92 		gccversion = '' |    109 		gccversion = '' | 
|     93 		context.Result(False) |    110 		context.Result(False) | 
|     94 	return gcc |    111 	return gcc | 
|     95  |    112  | 
|         |    113 def CheckMSVC(context): | 
|         |    114 	global msvc, msvcversion | 
|         |    115 	context.Message('Checking for MSVC compiler... ') | 
|         |    116 	testenv = Environment() | 
|         |    117 	msvc = "msvc" in testenv['TOOLS'] | 
|         |    118 	if msvc: | 
|         |    119 		msvcversion = testenv['MSVS_VERSION'] | 
|         |    120 		context.Result(msvcversion) | 
|         |    121 	else: | 
|         |    122 		msvcversion = '' | 
|         |    123 		context.Result(False) | 
|         |    124 	return msvc | 
|         |    125  | 
|     96 def CheckCPUFlags(context): |    126 def CheckCPUFlags(context): | 
|     97 	global cpu, cpuflags_gcc, cpuflags_intelc |    127 	global cpu, cpuflags_gcc, cpuflags_intelc | 
|     98 	context.Message('Checking CPU arch and flags... ') |    128 	context.Message('Checking CPU arch and flags... ') | 
|     99 	env.Execute('@$CC tools/cpuflags.c -o tools/cpuflags') |    129 	env.Execute('@$CC tools/cpuflags.c -o tools/cpuflags') | 
|    100 	(cpu, cpuflags_gcc, cpuflags_intelc) = os.popen('tools'+os.sep+'cpuflags %s %s' |    130 	(cpu, cpuflags_gcc, cpuflags_intelc) = os.popen('tools'+os.sep+'cpuflags %s %s' | 
|    101 		% (''.join(gccversion.rsplit('.',1)), intelcversion) ).read().split('\n')[:3] |    131 		% (''.join(gccversion.rsplit('.',1)), intelcversion) ).read().split('\n')[:3] | 
|    102 	context.Result(cpu) |    132 	context.Result(cpu) | 
|    103 	return True |    133 	return True | 
|    104  |    134  | 
|    105 conf = Configure(env, |    135 conf_dir = "#/build/.sconf_temp" | 
|         |    136 log_file="#/build/config.log" | 
|         |    137 config_h="#/include/config.h" | 
|         |    138 conf = Configure(env, conf_dir=conf_dir, log_file=log_file, config_h=config_h, | 
|    106 	custom_tests = { |    139 	custom_tests = { | 
|    107 		'CheckPlatform' : CheckPlatform, 'CheckCPUFlags' : CheckCPUFlags, |    140 		'CheckPlatform' : CheckPlatform, 'CheckCPUFlags' : CheckCPUFlags, | 
|    108 		'CheckIntelC' : CheckIntelC, 'CheckGCC' : CheckGCC}) |    141 		'CheckIntelC' : CheckIntelC, 'CheckGCC' : CheckGCC, 'CheckMSVC' : CheckMSVC}) | 
|    109 conf.CheckPlatform() |    142 conf.CheckPlatform() | 
|         |    143  | 
|    110 conf.CheckGCC() |    144 conf.CheckGCC() | 
|    111 conf.CheckIntelC() |    145 if platform == 'win32': | 
|    112 conf.CheckCPUFlags() |    146 	conf.CheckMSVC() | 
|    113  |    147 	intelc = False | 
|    114 if intelc and conf.env['intelc']: |    148 else: | 
|    115 	Tool("intelc").generate(conf.env) |    149 	conf.CheckIntelC() | 
|         |    150 	msvc=False | 
|         |    151  | 
|         |    152 if intelc or gcc: | 
|         |    153 	conf.CheckCPUFlags() | 
|         |    154  | 
|         |    155 if intelc and (not gcc or conf.env['intelc']): | 
|         |    156 	Tool('intelc').generate(conf.env) | 
|    116 	cc = 'intelc' |    157 	cc = 'intelc' | 
|         |    158 elif msvc and (not gcc or conf.env['msvc']): | 
|         |    159 	Tool('default').generate(conf.env) | 
|         |    160 	conf.Define("MSVC") | 
|         |    161 	cc = 'msvc' | 
|    117 elif gcc: |    162 elif gcc: | 
|    118 	cc = 'gcc' |    163 	cc = 'gcc' | 
|         |    164 else: | 
|         |    165 	cc = 'none' | 
|         |    166  | 
|         |    167 if platform == 'win32' and cc == 'gcc': | 
|         |    168 	conf.env.Append(LIBPATH=["C:/mingw/lib", "C:/msys/mingw/lib"]) | 
|         |    169 	conf.env.Append(CPPPATH=["C:/mingw/include", "C:/msys/mingw/include"]) | 
|    119  |    170  | 
|    120 add_flags = '' |    171 add_flags = '' | 
|    121 if cc == 'gcc': |    172 if cc == 'gcc': | 
|    122 	add_flags += cpuflags_gcc + ' -ffast-math ' |    173 	add_flags += cpuflags_gcc + ' -ffast-math ' | 
|    123 if cc == 'intelc': |    174 if cc == 'intelc': | 
|    124 	add_flags += cpuflags_intelc + ' ' |    175 	add_flags += cpuflags_intelc + ' ' | 
|         |    176 if cc == 'msvc': | 
|         |    177 	add_flags += '/fp:fast ' | 
|         |    178 	if conf.env['simd']: | 
|         |    179 		add_flags += '/arch:SSE ' | 
|    125  |    180  | 
|    126 if conf.env['force_flags']: |    181 if conf.env['force_flags']: | 
|    127 	add_flags = conf.env['flags'] + ' ' |    182 	add_flags = conf.env['flags'] + ' ' | 
|    128 else: |    183 else: | 
|    129 	add_flags += conf.env['flags'] + ' ' |    184 	add_flags += conf.env['flags'] + ' ' | 
|    130  |    185  | 
|    131 if conf.env['precision'] == 'double': |    186 if conf.env['precision'] == 'double': | 
|    132 	add_flags += '-DPYRIT_DOUBLE ' |    187 	conf.Define("PYRIT_DOUBLE") | 
|    133 elif cc == 'gcc': |    188 elif cc == 'gcc': | 
|    134 	add_flags += '-fsingle-precision-constant ' |    189 	add_flags += '-fsingle-precision-constant ' | 
|    135  |    190  | 
|    136 if not conf.env['simd']: |    191 if not conf.env['simd'] or conf.env['precision'] == 'double': | 
|    137 	add_flags += '-DNO_SSE ' |    192 	conf.Define("NO_SIMD") | 
|    138  |    193  | 
|    139 if cc == 'intelc': |    194 if cc == 'intelc': | 
|    140 	conf.env.Append(CCFLAGS="-O3 -w1 " + add_flags) |    195 	conf.env.Append(CCFLAGS="-O3 -w1 " + add_flags) | 
|    141 elif cc == 'gcc': |    196 elif cc == 'gcc': | 
|    142 	conf.env.Append(CCFLAGS="-O3 -Wall -pipe " + add_flags) |    197 	conf.env.Append(CCFLAGS="-O3 -Wall -pipe " + add_flags) | 
|    143 	# CCFLAGS= -fno-strict-aliasing |    198 elif cc == 'msvc': | 
|         |    199 	conf.env.Append(CCFLAGS="/Ox /Ob2 /GS- /Gy /GF /GR- /Zp16 /MD /EHsc /vmb " + add_flags) | 
|    144 else: |    200 else: | 
|    145 	print "No supported compiler found." |    201 	print "No supported compiler found." | 
|    146 	Exit(1) |    202 	Exit(1) | 
|    147  |    203  | 
|    148 print "Using compiler: " + cc |    204 print "Using compiler: " + cc | 
|    149 print "Additional flags: " + add_flags |    205 print "Additional flags: " + add_flags | 
|    150  |    206  | 
|    151 if conf.CheckLibWithHeader('png', 'png.h', 'C'): |    207 pthread = True | 
|    152 	conf.env.Append(CCFLAGS='-DHAVE_PNG') |    208 if conf.env['PLATFORM'] == 'win32': | 
|    153 	conf.env.Append(LIBS=['png']) |    209 	if cc == 'msvc': | 
|    154  |    210 		if not conf.CheckLib('pthreadVC2'): | 
|    155 if not conf.CheckCHeader('pthread.h'): |    211 			pthread = False | 
|         |    212 		conf.env.Append(LIBS=["pthreadVC2"]) | 
|         |    213 	elif cc == 'gcc': | 
|         |    214 		if not conf.CheckLib('pthreadGC2'): | 
|         |    215 			pthread = False | 
|         |    216 		conf.env.Append(LIBS=["pthreadGC2"]) | 
|         |    217 else: | 
|         |    218 	conf.env.Append(CCFLAGS="-pthread ") | 
|         |    219  | 
|         |    220 if not pthread: | 
|    156 	print 'Error: Cannot build without pthread.' |    221 	print 'Error: Cannot build without pthread.' | 
|    157 	Exit(1) |    222 	Exit(1) | 
|    158  |    223  | 
|    159 if conf.env['PLATFORM'] == 'win32': |    224 if conf.CheckLibWithHeader('png', 'png.h', 'C'): | 
|    160 	conf.env.Append(LIBS=["pthreadGC2"]) |    225 	conf.Define('HAVE_PNG') | 
|    161 else: |    226 	conf.env.Append(LIBS=['png']) | 
|    162 	conf.env.Append(CCFLAGS="-pthread ") |    227 elif conf.CheckLib('libpng13'): | 
|         |    228 	conf.Define('HAVE_PNG') | 
|         |    229 	conf.env.Append(LIBS=['libpng13']) | 
|    163  |    230  | 
|    164 if conf.env['profile'] and cc == 'gcc': |    231 if conf.env['profile'] and cc == 'gcc': | 
|    165 	conf.env.Append(CCFLAGS="-pg", LINKFLAGS="-pg") |    232 	conf.env.Append(CCFLAGS="-pg", LINKFLAGS="-pg") | 
|    166  |    233  | 
|    167 env = conf.Finish() |    234 env = conf.Finish() | 
|    168  |    235  | 
|         |    236 # configure SDL | 
|         |    237 sdlenv = env.Clone() | 
|         |    238 if cc != 'msvc': | 
|         |    239 	try: | 
|         |    240 		sdlenv.ParseConfig('sh sdl-config --cflags') | 
|         |    241 		sdlenv.ParseConfig('sh sdl-config --libs') | 
|         |    242 	except: | 
|         |    243 		pass | 
|         |    244 else: | 
|         |    245 	sdlenv.Append(LIBS=['SDL', 'SDLmain']) | 
|         |    246  | 
|         |    247 conf = Configure(sdlenv, conf_dir=conf_dir, log_file=log_file, config_h=config_h) | 
|         |    248 have_sdl = False | 
|         |    249 if conf.CheckLib('SDL'): | 
|         |    250 	have_sdl = True | 
|         |    251 else: | 
|         |    252 	print "SDL not found, some demos will not built." | 
|         |    253 sdlenv = conf.Finish() | 
|         |    254  | 
|         |    255 if cc == 'msvc': | 
|         |    256 	sdlenv.Append(LINKFLAGS="/SUBSYSTEM:WINDOWS") | 
|    169  |    257  | 
|    170 ### build targets |    258 ### build targets | 
|    171  |    259  | 
|    172 lib = SConscript('src/SConscript', build_dir='build/lib', duplicate=0, exports={'env':env,'buildmodule':False}) |    260 Export('env sdlenv cc') | 
|    173 pymodule = SConscript('src/SConscript', build_dir='build/pymodule', duplicate=0, exports={'env':env,'buildmodule':True}) |    261 lib = SConscript('src/SConscript', build_dir='build/lib', duplicate=0, | 
|    174  |    262 	exports={'buildmodule':False}) | 
|    175 SConscript('ccdemos/SConscript', build_dir='build/ccdemos', duplicate=0, exports='env lib') |    263 pymodule = SConscript('src/SConscript', build_dir='build/pymodule', duplicate=0, | 
|         |    264 	exports={'buildmodule':True}) | 
|         |    265  | 
|         |    266 if have_sdl: | 
|         |    267 	SConscript('ccdemos/SConscript', build_dir='build/ccdemos', duplicate=0, | 
|         |    268 		exports='lib') | 
|         |    269  | 
|    176 SConscript('demos/SConscript', exports='pymodule') |    270 SConscript('demos/SConscript', exports='pymodule') | 
|         |    271 SConscript('tests/SConscript', build_dir='build/tests', duplicate=0, exports='lib') | 
|         |    272 SConscript('models/SConscript') | 
|         |    273  | 
|    177 env.Alias('demos', ['cc-demos', 'python-demos']) |    274 env.Alias('demos', ['cc-demos', 'python-demos']) | 
|    178  |         | 
|    179 SConscript('tests/SConscript', build_dir='build/tests', duplicate=0, exports='env lib') |         | 
|    180  |         | 
|    181 SConscript('models/SConscript') |         | 
|    182  |         | 
|    183 env.Alias('libs', ['static-lib', 'python-module']) |    275 env.Alias('libs', ['static-lib', 'python-module']) | 
|    184  |         | 
|    185 env.Alias('docs', Command('docs/html', [], 'doxygen')) |    276 env.Alias('docs', Command('docs/html', [], 'doxygen')) | 
|    186 env.Clean('docs', ['docs/html']) |    277 env.Clean('docs', ['docs/html']) | 
|    187  |         | 
|    188 env.Alias('no-docs', ['libs', 'demos', 'models']) |    278 env.Alias('no-docs', ['libs', 'demos', 'models']) | 
|    189 env.Alias('no-download', ['libs', 'demos', 'local-models']) |    279 env.Alias('no-download', ['libs', 'demos', 'local-models']) | 
|    190  |         | 
|    191 env.Alias('all', ['no-docs', 'docs']) |    280 env.Alias('all', ['no-docs', 'docs']) | 
|    192  |         | 
|    193 env.Alias('pyrit', 'no-download') |    281 env.Alias('pyrit', 'no-download') | 
|    194 Default('pyrit') |    282 Default('pyrit') |