mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			122 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # First attempt at automatically generating CodeWarior projects
 | |
| import os
 | |
| import MacOS
 | |
| import string
 | |
| 
 | |
| Error="gencwproject.Error"
 | |
| #
 | |
| # These templates are executed in-order.
 | |
| # 
 | |
| TEMPLATELIST= [
 | |
| 	("tmp_allsources", "file", "template-allsources.xml", "sources"),
 | |
| 	("tmp_linkorder", "file", "template-linkorder.xml", "sources"),
 | |
| 	("tmp_grouplist", "file", "template-grouplist.xml", "sources"),
 | |
| 	("tmp_alllibraries", "file", "template-alllibraries.xml", "libraries"),
 | |
| 	("tmp_linkorderlib", "file", "template-linkorderlib.xml", "libraries"),
 | |
| 	("tmp_grouplistlib", "file", "template-grouplistlib.xml", "libraries"),
 | |
| 	("tmp_extrasearchdirs", "file", "template-searchdirs.xml", "extrasearchdirs"),
 | |
| 	("tmp_projectxmldata", "file", "template.prj.xml", None)
 | |
| ]
 | |
| 
 | |
| class ProjectBuilder:
 | |
| 	def __init__(self, dict, templatelist=TEMPLATELIST, templatename=None):
 | |
| 		if templatename == None:
 | |
| 			if hasattr(MacOS, 'runtimemodel'):
 | |
| 				templatename = 'template-%s'%MacOS.runtimemodel
 | |
| 			else:
 | |
| 				templatename = 'template'
 | |
| 		if os.sep in templatename:
 | |
| 			templatedir = templatename
 | |
| 		else:
 | |
| 			try:
 | |
| 				packagedir = os.path.split(__file__)[0]
 | |
| 			except NameError:
 | |
| 				packagedir = os.curdir
 | |
| 			templatedir = os.path.join(packagedir, templatename)
 | |
| 		if not os.path.exists(templatedir):
 | |
| 			raise Error, "Cannot find templatedir %s"%templatedir
 | |
| 		self.dict = dict
 | |
| 		if not dict.has_key('prefixname'):
 | |
| 			dict['prefixname'] = 'mwerks_plugin_config.h'
 | |
| 		self.templatelist = templatelist
 | |
| 		self.templatedir = templatedir
 | |
| 		
 | |
| 	def generate(self):
 | |
| 		for tmpl in self.templatelist:
 | |
| 			self._generate_one_template(tmpl)
 | |
| 		
 | |
| 	def _generate_one_template(self, tmpl):
 | |
| 		resultname, datasource, dataname, key = tmpl
 | |
| 		result = ''
 | |
| 		if key:
 | |
| 			# This is a multi-element rule. Run for every item in dict[key]
 | |
| 			if self.dict.has_key(key):
 | |
| 				keyvalues = self.dict[key]
 | |
| 				try:
 | |
| 					if not type(keyvalues) in (type(()), type([])):
 | |
| 						raise Error, "List or tuple expected for %s"%key
 | |
| 					for curkeyvalue in keyvalues:
 | |
| 						if string.lower(curkeyvalue[:10]) == '{compiler}':
 | |
| 							curkeyvalue = curkeyvalue[10:]
 | |
| 							self.dict['pathtype'] = 'CodeWarrior'
 | |
| 						elif string.lower(curkeyvalue[:9]) == '{project}':
 | |
| 							curkeyvalue = curkeyvalue[9:]
 | |
| 							self.dict['pathtype'] = 'Project'
 | |
| 						elif curkeyvalue[0] == '{':
 | |
| 							raise Error, "Unknown {} escape in %s"%curkeyvalue
 | |
| 						elif os.path.isabs(curkeyvalue):
 | |
| 							self.dict['pathtype'] = 'Absolute'
 | |
| 						else:
 | |
| 							self.dict['pathtype'] = 'Project'
 | |
| 						if curkeyvalue[-2:] == ':*':
 | |
| 							curkeyvalue = curkeyvalue[:-2]
 | |
| 							self.dict['recursive'] = 'true'
 | |
| 						else:
 | |
| 							self.dict['recursive'] = 'false'
 | |
| 						self.dict[key] = curkeyvalue
 | |
| 						curkeyvalueresult = self._generate_one_value(datasource, dataname)
 | |
| 						result = result + curkeyvalueresult
 | |
| 				finally:
 | |
| 					# Restore the list
 | |
| 					self.dict[key] = keyvalues
 | |
| 					self.dict['pathtype'] = None
 | |
| 					del self.dict['pathtype']
 | |
| 					self.dict['recursive'] = None
 | |
| 					del self.dict['recursive']
 | |
| 		else:
 | |
| 			# Not a multi-element rule. Simply generate
 | |
| 			result = self._generate_one_value(datasource, dataname)
 | |
| 		# And store the result
 | |
| 		self.dict[resultname] = result
 | |
| 		
 | |
| 	def _generate_one_value(self, datasource, dataname):
 | |
| 		if datasource == 'file':
 | |
| 			filepath = os.path.join(self.templatedir, dataname)
 | |
| 			fp = open(filepath, "r")
 | |
| 			format = fp.read()
 | |
| 		elif datasource == 'string':
 | |
| 			format = dataname
 | |
| 		else:
 | |
| 			raise Error, 'Datasource should be file or string, not %s'%datasource
 | |
| 		return format % self.dict
 | |
| 		
 | |
| def _test():
 | |
| 	dict = {
 | |
| 		"mac_projectxmlname" : "controlstrip.prj.xml",	# The XML filename (full path)
 | |
| 		"mac_exportname" : "controlstrip.prj.exp",	# Export file (relative to project)
 | |
| 		"mac_outputdir" : ":",	# The directory where the DLL is put (relative to project)
 | |
| 		"mac_dllname" : "controlstrip.ppc.slb",	# The DLL filename (within outputdir)
 | |
| 		"mac_targetname" : "controlstrip.ppc",	# The targetname within the project
 | |
| 		"sysprefix" : sys.prefix,	# Where the Python sources live
 | |
| 		"mac_sysprefixtype" : "Absolute",	# Type of previous pathname
 | |
| 		"sources" : ["controlstripmodule.c"],
 | |
| 		"extrasearchdirs": [],	# -I and -L, in unix terms
 | |
| 	}
 | |
| 	pb = ProjectBuilder(dict)
 | |
| 	pb.generate()
 | |
| 	fp = open(dict["mac_projectxmlname"], "w")
 | |
| 	fp.write(dict["tmp_projectxmldata"])
 | |
| 	
 | |
| if __name__ == '__main__':
 | |
| 	_test()
 | |
| 		
 | 
