SConstruct
branchpyrit
changeset 104 2274a07510c1
parent 102 de3e9ea18f56
equal deleted inserted replaced
103:3b3257a410fe 104:2274a07510c1
    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))
    82 	context.Message('Platform is... ')
    68 	context.Message('Platform is... ')
    83 	if sys.platform[:5] == 'linux':
    69 	if sys.platform[:5] == 'linux':
    84 		platform = 'linux'
    70 		platform = 'linux'
    85 	elif env['PLATFORM'] == 'posix':
    71 	elif env['PLATFORM'] == 'posix':
    86 		platform = 'posix'
    72 		platform = 'posix'
    87 	elif env['PLATFORM'] == 'win32':
       
    88 		platform = 'win32'
       
    89 	context.Result(platform)
    73 	context.Result(platform)
    90 	return True
    74 	return True
    91 
    75 
    92 intelcversion = ''
    76 intelcversion = ''
    93 def CheckIntelC(context):
    77 def CheckIntelC(context):
   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)