|     37 EnsureSConsVersion(0, 97) |     37 EnsureSConsVersion(0, 97) | 
|     38  |     38  | 
|     39 Decider('MD5-timestamp') |     39 Decider('MD5-timestamp') | 
|     40 SConsignFile('build/.sconsign.dblite') |     40 SConsignFile('build/.sconsign.dblite') | 
|     41  |     41  | 
|     42 if sys.platform == 'win32': |     42 env = Environment(tools = ['default'], CPPPATH = ['.','#include','#build/include']) | 
|     43 	tools = ['mingw'] |         | 
|     44 else: |         | 
|     45 	tools = ['default'] |         | 
|     46  |         | 
|     47 env = Environment(tools = tools, CPPPATH = ['.','#include','#build/include']) |         | 
|     48  |     43  | 
|     49 vars = Variables(files=['build/.varscache']) |     44 vars = Variables(files=['build/.varscache']) | 
|     50 vars.AddVariables( |     45 vars.AddVariables( | 
|     51 	BoolVariable('simd', 'allow SSE intrinsics', True), |     46 	BoolVariable('simd', 'allow SSE intrinsics', True), | 
|     52 	('precision', 'floating point number precision (single/double)', "single"), |     47 	('precision', 'floating point number precision (single/double)', "single"), | 
|     53 	('flags', 'add additional compiler flags', ""), |     48 	('flags', 'add additional compiler flags', ""), | 
|     54 	BoolVariable('force_flags', "use only flags specified by 'flags' option (do not autodetect arch/sse flags)", False), |     49 	BoolVariable('force_flags', "use only flags specified by 'flags' option (do not autodetect arch/sse flags)", False), | 
|     55 	('ldflags', 'add additional linker flags', ""), |     50 	('ldflags', 'add additional linker flags', ""), | 
|     56 	BoolVariable('profile', "enable gcc's profiling support (-pg)", False), |     51 	BoolVariable('profile', "enable gcc's profiling support (-pg)", False), | 
|         |     52 	BoolVariable('intelc', 'use Intel C++ Compiler, if available', False), | 
|     57 ) |     53 ) | 
|     58 if env['PLATFORM'] == 'win32': |         | 
|     59 	vars.AddVariables( |         | 
|     60 		BoolVariable('mingw', 'use Mingw and GCC compiler, if available', False), |         | 
|     61 		('pythonpath', 'path to Python installation', |         | 
|     62 			'C:\\Python%c%c' % (sys.version[0], sys.version[2])), |         | 
|     63 	) |         | 
|     64 else: |         | 
|     65 	vars.AddVariables( |         | 
|     66 		BoolVariable('intelc', 'use Intel C++ Compiler, if available', False), |         | 
|     67 	) |         | 
|     68  |     54  | 
|     69  |     55  | 
|     70 vars.Update(env) |     56 vars.Update(env) | 
|     71 vars.Save('build/.varscache', env) |     57 vars.Save('build/.varscache', env) | 
|     72 Help(vars.GenerateHelpText(env)) |     58 Help(vars.GenerateHelpText(env)) | 
|    114 	else: |     98 	else: | 
|    115 		gccversion = '' |     99 		gccversion = '' | 
|    116 		context.Result(False) |    100 		context.Result(False) | 
|    117 	return gcc |    101 	return gcc | 
|    118  |    102  | 
|    119 def CheckMSVC(context): |         | 
|    120 	global msvc, msvcversion |         | 
|    121 	context.Message('Checking for MSVC compiler... ') |         | 
|    122 	testenv = Environment() |         | 
|    123 	msvc = "msvc" in testenv['TOOLS'] |         | 
|    124 	if msvc: |         | 
|    125 		msvcversion = testenv['MSVS_VERSION'] |         | 
|    126 		context.Result(msvcversion) |         | 
|    127 	else: |         | 
|    128 		msvcversion = '' |         | 
|    129 		context.Result(False) |         | 
|    130 	return msvc |         | 
|    131  |         | 
|    132 def CheckCPUFlags(context): |    103 def CheckCPUFlags(context): | 
|    133 	global cpu, cpuflags_gcc, cpuflags_intelc |    104 	global cpu, cpuflags_gcc, cpuflags_intelc | 
|    134 	context.Message('Checking CPU arch and flags... ') |    105 	context.Message('Checking CPU arch and flags... ') | 
|    135 	env.Execute('@$CC tools/cpuflags.c -o tools/cpuflags') |    106 	env.Execute('@$CC tools/cpuflags.c -o tools/cpuflags') | 
|    136 	(cpu, cpuflags_gcc, cpuflags_intelc) = os.popen('tools'+os.sep+'cpuflags %s %s' |    107 	(cpu, cpuflags_gcc, cpuflags_intelc) = os.popen('tools'+os.sep+'cpuflags %s %s' | 
|    142 log_file="#build/config.log" |    113 log_file="#build/config.log" | 
|    143 config_h="#build/include/config.h" |    114 config_h="#build/include/config.h" | 
|    144 conf = Configure(env, conf_dir=conf_dir, log_file=log_file, config_h=config_h, |    115 conf = Configure(env, conf_dir=conf_dir, log_file=log_file, config_h=config_h, | 
|    145     clean=False, help=False, |    116     clean=False, help=False, | 
|    146 	custom_tests = { |    117 	custom_tests = { | 
|    147 		'CheckPlatform' : CheckPlatform, 'CheckCPUFlags' : CheckCPUFlags, |    118 		'CheckPlatform' : CheckPlatform, | 
|    148 		'CheckIntelC' : CheckIntelC, 'CheckGCC' : CheckGCC, 'CheckMSVC' : CheckMSVC}) |    119 		'CheckCPUFlags' : CheckCPUFlags, | 
|         |    120 		'CheckIntelC' : CheckIntelC, | 
|         |    121 		'CheckGCC' : CheckGCC, | 
|         |    122 		}) | 
|    149 conf.CheckPlatform() |    123 conf.CheckPlatform() | 
|    150  |    124  | 
|    151 conf.CheckGCC() |    125 conf.CheckGCC() | 
|    152 if platform == 'win32': |    126 conf.CheckIntelC() | 
|    153 	conf.CheckMSVC() |         | 
|    154 	intelc = False |         | 
|    155 else: |         | 
|    156 	conf.CheckIntelC() |         | 
|    157 	msvc=False |         | 
|    158  |    127  | 
|    159 if intelc and (not gcc or conf.env['intelc']): |    128 if intelc and (not gcc or conf.env['intelc']): | 
|    160 	Tool('intelc').generate(conf.env) |    129 	Tool('intelc').generate(conf.env) | 
|    161 	cc = 'intelc' |    130 	cc = 'intelc' | 
|    162 elif msvc and (not gcc or not conf.env['mingw']): |         | 
|    163 	Tool('default').generate(conf.env) |         | 
|    164 	conf.Define("MSVC") |         | 
|    165 	cc = 'msvc' |         | 
|    166 elif gcc: |    131 elif gcc: | 
|    167 	cc = 'gcc' |    132 	cc = 'gcc' | 
|    168 else: |    133 else: | 
|    169 	cc = 'none' |    134 	cc = 'none' | 
|    170  |    135  | 
|    171 if cc == 'intelc' or cc == 'gcc': |    136 if cc == 'intelc' or cc == 'gcc': | 
|    172 	conf.CheckCPUFlags() |    137 	conf.CheckCPUFlags() | 
|    173  |         | 
|    174 if platform == 'win32' and cc == 'gcc': |         | 
|    175 	conf.env.Append(LIBPATH=["C:/mingw/lib", "C:/msys/mingw/lib"]) |         | 
|    176 	conf.env.Append(CPPPATH=["C:/mingw/include", "C:/msys/mingw/include"]) |         | 
|    177  |    138  | 
|    178 add_flags = '' |    139 add_flags = '' | 
|    179 if cc == 'gcc': |    140 if cc == 'gcc': | 
|    180 	add_flags += cpuflags_gcc + ' -ffast-math ' |    141 	add_flags += cpuflags_gcc + ' -ffast-math ' | 
|    181 if cc == 'intelc': |    142 if cc == 'intelc': | 
|    182 	add_flags += cpuflags_intelc + ' ' |    143 	add_flags += cpuflags_intelc + ' ' | 
|    183 if cc == 'msvc': |         | 
|    184 	add_flags += '/fp:fast ' |         | 
|    185 	if conf.env['simd']: |         | 
|    186 		add_flags += '/arch:SSE ' |         | 
|    187  |    144  | 
|    188 if conf.env['force_flags']: |    145 if conf.env['force_flags']: | 
|    189 	add_flags = conf.env['flags'] + ' ' |    146 	add_flags = conf.env['flags'] + ' ' | 
|    190 else: |    147 else: | 
|    191 	add_flags += conf.env['flags'] + ' ' |    148 	add_flags += conf.env['flags'] + ' ' | 
|    201 elif cc == 'gcc': |    158 elif cc == 'gcc': | 
|    202 	conf.env.Append(CCFLAGS="-O3 -Wall -pipe " + add_flags) |    159 	conf.env.Append(CCFLAGS="-O3 -Wall -pipe " + add_flags) | 
|    203 	# Other useful flags: |    160 	# Other useful flags: | 
|    204 	# -Wunsafe-loop-optimizations -Wpointer-arith -Wcast-align -Wconversion |    161 	# -Wunsafe-loop-optimizations -Wpointer-arith -Wcast-align -Wconversion | 
|    205 	# -Wmissing-noreturn -Winline -Wdisabled-optimization |    162 	# -Wmissing-noreturn -Winline -Wdisabled-optimization | 
|    206 elif cc == 'msvc': |         | 
|    207 	conf.env.Append(CCFLAGS="/Ox /Ob2 /GS- /Gy /GF /GR- /Zp16 /MD /EHsc /vmb " + add_flags) |         | 
|    208 else: |    163 else: | 
|    209 	print "No supported compiler found." |    164 	print "No supported compiler found." | 
|    210 	Exit(1) |    165 	Exit(1) | 
|    211  |    166  | 
|    212 print "Using compiler: " + cc |    167 print "Using compiler: " + cc | 
|    218 if conf.env['ldflags']: |    173 if conf.env['ldflags']: | 
|    219 	conf.env.Append(LINKFLAGS=conf.env['ldflags']) |    174 	conf.env.Append(LINKFLAGS=conf.env['ldflags']) | 
|    220  |    175  | 
|    221  |    176  | 
|    222 # configure pthread |    177 # configure pthread | 
|    223 pthread = True |    178 conf.env.Append(CCFLAGS="-pthread ") | 
|    224 if platform == 'win32': |         | 
|    225 	if cc == 'msvc': |         | 
|    226 		if not conf.CheckLib('pthreadVC2'): |         | 
|    227 			pthread = False |         | 
|    228 	elif cc == 'gcc': |         | 
|    229 		if not conf.CheckLib('pthreadGC2'): |         | 
|    230 			pthread = False |         | 
|    231 else: |         | 
|    232 	conf.env.Append(CCFLAGS="-pthread ") |         | 
|    233  |         | 
|    234 if not pthread: |         | 
|    235 	print 'Error: Cannot build without pthread.' |         | 
|    236 	Exit(1) |         | 
|    237  |    179  | 
|    238  |    180  | 
|    239 # configure libpng |    181 # configure libpng | 
|    240 conf.CheckLibWithHeader('zlib', 'zlib.h', 'C') |    182 conf.CheckLibWithHeader('zlib', 'zlib.h', 'C') | 
|    241 if conf.CheckLibWithHeader('libpng', 'png.h', 'C'): |    183 if conf.CheckLibWithHeader('libpng', 'png.h', 'C'): | 
|    245  |    187  | 
|    246  |    188  | 
|    247 # configure Python |    189 # configure Python | 
|    248 pyenv = env.Clone() |    190 pyenv = env.Clone() | 
|    249 have_python = True |    191 have_python = True | 
|    250 if platform == 'win32': |    192 try: | 
|    251 	pythonver = '%c%c' % (sys.version[0], sys.version[2]) |    193 	pyenv.ParseConfig('python-config --includes --libs') | 
|    252 	pythonlib = 'python'+pythonver |    194 except: | 
|    253 	pythonpath = [env['pythonpath']] |    195 	have_python = False | 
|    254 	pyenv.Append(CPPPATH=[s+'\\include' for s in pythonpath]) |         | 
|    255 	pyenv.Append(LIBPATH=[s+'\\libs' for s in pythonpath]) |         | 
|    256 	pyenv.Replace(SHLIBSUFFIX='.pyd') |         | 
|    257 	conf = Configure(pyenv, conf_dir=conf_dir, log_file=log_file, config_h=config_h, |         | 
|    258 	                 clean=False, help=False) |         | 
|    259 	if not conf.CheckLib(pythonlib): |         | 
|    260 		have_python = False |         | 
|    261 	pyenv = conf.Finish() |         | 
|    262 else: |         | 
|    263 	try: |         | 
|    264 		pyenv.ParseConfig('python-config --includes --libs') |         | 
|    265 	except: |         | 
|    266 		have_python = False |         | 
|    267  |    196  | 
|    268 if not have_python: |    197 if not have_python: | 
|    269 	print "Error: Python is required." |    198 	print "Error: Python is required." | 
|    270 	Exit(1) |    199 	Exit(1) | 
|    271  |    200  | 
|    272 # configure SDL |    201 # configure SDL | 
|    273 sdlenv = env.Clone() |    202 sdlenv = env.Clone() | 
|    274 if cc == 'msvc': |    203 try: | 
|    275 	sdlenv.Append(LIBS=['SDL', 'SDLmain']) |    204 	sdlenv.ParseConfig('sdl-config --cflags') | 
|    276 	sdlenv.Append(LINKFLAGS="/SUBSYSTEM:WINDOWS") |    205 	sdlenv.ParseConfig('sdl-config --libs') | 
|    277 else: |    206 except: | 
|    278 	try: |    207 	pass | 
|    279 		sdlenv.ParseConfig('sdl-config --cflags') |         | 
|    280 		sdlenv.ParseConfig('sdl-config --libs') |         | 
|    281 	except: |         | 
|    282 		pass |         | 
|    283  |    208  | 
|    284 def CheckSDL(context): |    209 def CheckSDL(context): | 
|    285 	global have_sdl |    210 	global have_sdl | 
|    286 	context.Message('Checking for SDL... ') |    211 	context.Message('Checking for SDL... ') | 
|    287 	if context.TryLink("#include <SDL.h>\n"+ |    212 	if context.TryLink("#include <SDL.h>\n"+ | 
|    302 ### build targets |    227 ### build targets | 
|    303  |    228  | 
|    304 Export('env pyenv sdlenv have_sdl cc') |    229 Export('env pyenv sdlenv have_sdl cc') | 
|    305 lib = SConscript('src/SConscript', variant_dir='build/lib', duplicate=0, |    230 lib = SConscript('src/SConscript', variant_dir='build/lib', duplicate=0, | 
|    306 	exports={'buildmodule':False}) |    231 	exports={'buildmodule':False}) | 
|    307 if cc == 'msvc': |    232 pymodule = SConscript('src/SConscript', variant_dir='build/pymodule', duplicate=0, | 
|    308 	(pymodule, modvcproj) = SConscript('src/SConscript', variant_dir='build/pymodule', duplicate=0, |    233 	exports={'buildmodule':True}) | 
|    309 		exports={'buildmodule':True}) |    234 SConscript('ccdemos/SConscript', variant_dir='build/ccdemos', duplicate=0, exports='lib') | 
|    310 	ccdemvcproj = SConscript('ccdemos/SConscript', variant_dir='build/ccdemos', duplicate=0, exports='lib') |    235 SConscript('demos/SConscript', exports='pymodule') | 
|    311 	demosvcproj = SConscript('demos/SConscript', exports='pymodule') |         | 
|    312 else: |         | 
|    313 	pymodule = SConscript('src/SConscript', variant_dir='build/pymodule', duplicate=0, |         | 
|    314 		exports={'buildmodule':True}) |         | 
|    315 	SConscript('ccdemos/SConscript', variant_dir='build/ccdemos', duplicate=0, exports='lib') |         | 
|    316 	SConscript('demos/SConscript', exports='pymodule') |         | 
|    317  |    236  | 
|    318 SConscript('tests/SConscript', variant_dir='build/tests', duplicate=0, exports='lib') |    237 SConscript('tests/SConscript', variant_dir='build/tests', duplicate=0, exports='lib') | 
|    319 SConscript('models/SConscript') |    238 SConscript('models/SConscript') | 
|    320  |    239  | 
|    321 env.Alias('demos', ['cc-demos', 'python-demos']) |    240 env.Alias('demos', ['cc-demos', 'python-demos']) | 
|    325 env.Alias('no-docs', ['libs', 'demos', 'models']) |    244 env.Alias('no-docs', ['libs', 'demos', 'models']) | 
|    326 env.Alias('no-download', ['libs', 'demos', 'local-models']) |    245 env.Alias('no-download', ['libs', 'demos', 'local-models']) | 
|    327 env.Alias('all', ['no-docs', 'docs']) |    246 env.Alias('all', ['no-docs', 'docs']) | 
|    328 env.Alias('pyrit', 'no-download') |    247 env.Alias('pyrit', 'no-download') | 
|    329 Default('pyrit') |    248 Default('pyrit') | 
|    330  |         | 
|    331 if cc == 'msvc': |         | 
|    332 	vcsol = env.MSVSSolution( |         | 
|    333 		target = 'pyrit' + env['MSVSSOLUTIONSUFFIX'], |         | 
|    334 		projects = [modvcproj, ccdemvcproj, demosvcproj], |         | 
|    335 		variant = 'Release') |         | 
|    336  |         | 
|    337 	env.Depends(vcsol, [modvcproj, ccdemvcproj, demosvcproj]); |         | 
|    338 	env.Alias('vcproj', vcsol) |         |