diff engine/SConscript @ 0:4a0efb7baf70

* Datasets becomes the new trunk and retires after that :-)
author mvbarracuda@33b003aa-7bff-0310-803a-e67f0ece8222
date Sun, 29 Jun 2008 18:44:17 +0000
parents
children b3838661971f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/engine/SConscript	Sun Jun 29 18:44:17 2008 +0000
@@ -0,0 +1,279 @@
+import os, sys
+from utils.util_scripts.path import path as upath
+Import('env')
+
+joinpath = os.path.join
+_sep = os.path.sep
+enginepath = upath('.')
+extensionpath = upath('./extensions')
+
+def is_implfile(fname):
+	return fname.endswith('.cpp') or fname.endswith('.cxx') or fname.endswith('.m')
+
+def is_headerfile(fname):
+	return fname.endswith('.hpp') or fname.endswith('.h')
+
+def generate_swig_wrappers(target, source, env):
+	from string import Template
+	swigoutdir = joinpath('engine', 'swigwrappers')
+
+	def generate_language_specifics(lang):
+		swigpath = ''
+		if sys.platform == 'win32':
+			swigpath = '"' + os.environ['_SWIG'] + '"\\'
+
+		print "   Generating language specific wrappers for " + lang
+		
+		langoutdir = joinpath(swigoutdir, lang)
+		templatefile = joinpath(langoutdir,"fife.i.templ")
+		
+		template = Template(open(templatefile).read())
+		inclusions = sorted(['%include ' + str(f) for f in source])
+		inclusions = '\n'.join(inclusions)
+		interfacefile = joinpath(langoutdir, 'fife.i')
+		open(interfacefile, 'w').write(template.substitute(inclusions=inclusions))
+
+		includepath = joinpath('engine', 'core')
+		# added -w511 to ignore warnings for "Can't use keyword arguments with overloaded functions"
+		pipe = os.popen(swigpath +'swig -w511 -c++ -%s -I%s -outdir %s %s' % (lang, includepath, langoutdir, interfacefile))
+		if pipe.close():
+			print "\nError while running swig, stopped"
+			Exit(1)
+
+	print "Running swig..."
+	generate_language_specifics(env['script'])
+	print "Swig completed"
+
+def swig_wrapper_emitter(target, source, env):
+	target_append = []
+	for t in target:
+		t = str(t)
+		if t.endswith('.py'):
+			t = t[:-3]
+		else:
+			continue
+		target_append.append(t + '.i')
+		target_append.append(t + '_wrap.cxx')
+		target_append.append(t + '_wrap.h')
+	for t in target_append:
+		target.append(t)
+	return target, source
+
+swig_wrapper_builder = Builder(action = generate_swig_wrappers, suffix = '.py', source_suffix = '.i', emitter = swig_wrapper_emitter)
+env.Append(BUILDERS = {'SwigWrappers': swig_wrapper_builder})
+
+
+def remove_based_on_dir_filter(dirfilters, files):
+	abspaths = []
+	for pathstr in dirfilters:
+		abspaths.append(os.path.abspath(joinpath(*pathstr.split('/'))))
+
+	result = []
+	for f in files:
+		filtered = False
+		for p in abspaths:
+			if str(f.abspath()).find(p) != -1:
+				filtered = True
+				break
+		if not filtered:
+			result.append(f)
+	return result
+
+def check_for_duplicate_files(files):
+	dupePaths = {}; dupes = []
+	for f in files:
+		fname = os.path.basename(f)
+		try:
+			dupePaths[fname].append(f)
+		except KeyError:
+			dupePaths[fname] = [f]
+	for fname, paths in dupePaths.items():
+		if len(paths) > 1:
+			dupes.append('%s -> %s' % (fname, ', '.join(paths)))
+	if dupes:
+		print "\nError found: All cpp file names must be unique in FIFE, the following were not:"
+		for l in dupes: print l
+		Exit(1)
+
+msvcbuildpath = joinpath('build', 'win32', 'build_environments', 'visual_studio_8')
+
+def generate_msvc_project(target, source, env):
+	def create_dict_tree(source_dict):
+		for f in source_dict.keys():
+			parts = f.split(os.path.sep, 1)
+			if len(parts) > 1:
+				try:
+					source_dict[parts[0]][parts[1]] = {}
+				except KeyError:
+					source_dict[parts[0]] = {}
+					source_dict[parts[0]][parts[1]] = {}
+				del source_dict[f]
+		for k, d in source_dict.items():
+			create_dict_tree(d)
+		return source_dict
+	
+	def get_msvc_repr(d, tabcount=2, curpath=''):
+		retstr = []
+		for k in sorted(d.keys()):
+			newpath = os.path.join(curpath, k)
+			if len(d[k].keys()):
+				retstr.append(tabcount * '\t' + '<Filter Name="%s">' % k)
+				retstr.append(get_msvc_repr(d[k], tabcount+1, newpath))
+				retstr.append(tabcount * '\t' + '</Filter>')
+			else:
+				newpath = os.path.join('..', '..', '..', '..', 'engine', newpath)
+				retstr.append(tabcount * '\t' + '<File RelativePath="%s"></File>' % newpath.replace('/','\\'))
+		return '\n'.join(retstr)
+			
+	vcpaths = [os.path.abspath(str(f)).split('%sengine%s' % (_sep, _sep))[-1] for f in source]
+	xmlstr = get_msvc_repr(create_dict_tree(dict([[p, {}] for p in vcpaths])))
+	projtxt = open(joinpath(msvcbuildpath, 'engine_template.xml'), 'r').read()
+	projtxt = projtxt.replace('__FILE_INSERTION_POINT__', xmlstr)
+
+	oldprojtxt = ''
+	try:
+		oldprojtxt = open(str(target[0]), 'r').read()
+	except:
+		pass
+
+	if(oldprojtxt <> projtxt):
+		open(str(target[0]), 'w').write(projtxt)
+		print "FIFE msvc project file succesfully created (%s)" % os.path.abspath(str(target[0]))
+	else:
+		print "FIFE msvc project file already up-to-date (%s)" % os.path.abspath(str(target[0]))
+
+msvc_project_builder = Builder(action = generate_msvc_project, suffix = '.vcproj')
+env.Append(BUILDERS = {'MSVCProject': msvc_project_builder})
+
+msvcbuildpath9 = joinpath('build', 'win32', 'build_environments', 'visual_studio_9')
+
+def generate_msvc_project9(target, source, env):
+	def create_dict_tree(source_dict):
+		for f in source_dict.keys():
+			parts = f.split(os.path.sep, 1)
+			if len(parts) > 1:
+				try:
+					source_dict[parts[0]][parts[1]] = {}
+				except KeyError:
+					source_dict[parts[0]] = {}
+					source_dict[parts[0]][parts[1]] = {}
+				del source_dict[f]
+		for k, d in source_dict.items():
+			create_dict_tree(d)
+		return source_dict
+	
+	def get_msvc_repr(d, tabcount=2, curpath=''):
+		retstr = []
+		for k in sorted(d.keys()):
+			newpath = os.path.join(curpath, k)
+			if len(d[k].keys()):
+				retstr.append(tabcount * '\t' + '<Filter Name="%s">' % k)
+				retstr.append(get_msvc_repr(d[k], tabcount+1, newpath))
+				retstr.append(tabcount * '\t' + '</Filter>')
+			else:
+				newpath = os.path.join('..', '..', '..', '..', 'engine', newpath)
+				retstr.append(tabcount * '\t' + '<File RelativePath="%s"></File>' % newpath.replace('/','\\'))
+		return '\n'.join(retstr)
+			
+	vcpaths = [os.path.abspath(str(f)).split('%sengine%s' % (_sep, _sep))[-1] for f in source]
+	xmlstr = get_msvc_repr(create_dict_tree(dict([[p, {}] for p in vcpaths])))
+	projtxt = open(joinpath(msvcbuildpath9, 'engine_template.xml'), 'r').read()
+	projtxt = projtxt.replace('__FILE_INSERTION_POINT__', xmlstr)
+
+	oldprojtxt = ''
+	try:
+		oldprojtxt = open(str(target[0]), 'r').read()
+	except:
+		pass
+
+	if(oldprojtxt <> projtxt):
+		open(str(target[0]), 'w').write(projtxt)
+		print "FIFE msvc9 project file succesfully created (%s)" % os.path.abspath(str(target[0]))
+	else:
+		print "FIFE msvc9 project file already up-to-date (%s)" % os.path.abspath(str(target[0]))
+
+msvc_project_builder9 = Builder(action = generate_msvc_project9, suffix = '.vcproj')
+env.Append(BUILDERS = {'MSVCProject9': msvc_project_builder9})
+
+cbbuildpath = joinpath('build', 'win32', 'build_environments', 'code_blocks')
+
+def generate_codeblocks_project(target, source, env):
+	codeblocksHeaderDef = \
+	'''		<Unit filename="..\..\..\engine\%s">
+				<Option compilerVar=""/>
+				<Option compile="0"/>
+				<Option link="0"/>
+				<Option target="default"/>
+			</Unit>'''
+	
+	codeblocksCppDef = \
+	'''		<Unit filename="..\..\..\..\engine\%s">
+				<Option compilerVar="CPP"/>
+				<Option target="default"/>
+			</Unit>'''
+	xmlstr = []
+	for f in source:
+		newf = os.path.abspath(str(f)).split('%sengine%s' % (_sep, _sep))[-1]
+		newf = newf.replace('/', '\\')
+		if str(f) in headerfiles:
+			xmlstr.append(codeblocksHeaderDef % newf)
+		else:
+			xmlstr.append(codeblocksCppDef % newf)
+	projtxt = open(joinpath(cbbuildpath, 'engine_template.xml'), 'r').read()
+	projtxt = projtxt.replace('__FILE_INSERTION_POINT__', '\n'.join(xmlstr))
+	open(str(target[0]), 'w').write(projtxt)
+	print "FIFE code::blocks project file succesfully created (%s)" % os.path.abspath(str(target[0]))
+
+codeblocks_project_builder = Builder(action = generate_codeblocks_project, suffix = '.cbp')
+env.Append(BUILDERS = {'CodeblocksProject': codeblocks_project_builder})
+
+variated_dirs = eval(open(joinpath('config', 'variated_dirs'), 'r').read())
+# filter out swigwrappers. fife_wrap.cxx is appended manually
+# as it might not exist yet during SConscript parsing
+filteredpaths = ['swigwrappers']
+for flag, paths in variated_dirs.items():
+	value = None
+	if flag.find('-') != -1:
+		flag, value = flag.split('-')
+	if (value and (not env[flag] == value)) or (not env[flag]):
+		filteredpaths.extend(paths)
+
+tmpfiles = remove_based_on_dir_filter(filteredpaths, list(enginepath.walkfiles('*.i')))
+interfacefiles = []
+for f in tmpfiles:
+	if f.startswith('.' + _sep):
+		interfacefiles.append(f[2:])
+	else:
+		interfacefiles.append(f)
+
+swig = env.SwigWrappers('swigwrappers/python/fife', interfacefiles)
+env.Install('$PREFIX/lib/python2.5/site-packages/fife', ['swigwrappers/python/fife.py'])
+
+allfiles = list(enginepath.walkfiles())
+headerfiles = [f for f in allfiles if is_headerfile(f)]
+implfiles = [f for f in allfiles if is_implfile(f)]
+extensionfiles = list(extensionpath.walkfiles('*.py'))
+
+filtered_prj_paths = eval(open(joinpath('config', 'removed_from_project_files'), 'r').read())
+filtered_prj_paths = [joinpath(*p.split('/')) for p in filtered_prj_paths]
+projectfiles = [str(f) for f in remove_based_on_dir_filter(filtered_prj_paths, headerfiles + implfiles)]
+
+projectfiles.append('./swigwrappers/%s/fife_wrap.cxx' % env['script'])
+
+msvcproj = env.MSVCProject(joinpath('..', msvcbuildpath, 'fife'), projectfiles)
+msvcproj9 = env.MSVCProject9(joinpath('..', msvcbuildpath9, 'fife'), projectfiles)
+cbproj = env.CodeblocksProject(joinpath('..', cbbuildpath, 'fife_engine'), projectfiles)
+
+if not env['projectfiles_only']:
+	env.Append(CPPPATH = ['#/engine/core', '#/engine/swigwrappers'])
+	compilefiles = [str(f) for f in remove_based_on_dir_filter(filteredpaths, implfiles)]
+	compilefiles.append('./swigwrappers/%s/fife_wrap.cxx' % env['script'])
+	if sys.platform == 'darwin':
+		flib = env.SharedLibrary('fife', compilefiles, LINKFLAGS=['-Wl'])
+	else:
+		flib = env.SharedLibrary('fife', compilefiles, LINKFLAGS=['-Wl,-rpath,../../ext/install/lib,-rpath,../ext/install/lib,-rpath,ext/install/lib'])
+	if sys.platform != 'win32':
+		env.Command('swigwrappers/%s/_fife.so' % env['script'], flib, [Copy('$TARGET', '$SOURCE')])
+		if sys.platform != 'darwin':
+			env.Install('$PREFIX/lib/python2.5/site-packages/fife', flib)
+#			env.Install('$PREFIX/lib/python2.5/site-packages/fife', [str(f) for f in extensionfiles])