1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
# 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):
self._adddefaults(dict)
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'):
if hasattr(MacOS, 'runtimemodel') and MacOS.runtimemodel == "carbon":
dict['prefixname'] = 'mwerks_shcarbon_pch'
else:
dict['prefixname'] = 'mwerks_plugin_config.h'
self.templatelist = templatelist
self.templatedir = templatedir
def _adddefaults(self, dict):
# Set all suitable defaults set for values which were omitted.
if not dict.has_key('mac_outputdir'):
dict['mac_outputdir'] = ':lib:'
if not dict.has_key('stdlibraryflags'):
dict['stdlibraryflags'] = 'Debug'
if not dict.has_key('libraryflags'):
dict['libraryflags'] = 'Debug'
if not dict.has_key('initialize'):
dict['initialize'] = '__initialize'
if not dict.has_key('mac_sysprefixtype'):
if os.path.isabs(dict['sysprefix']):
dict['mac_sysprefixtype'] = 'Absolute'
else:
dict['mac_sysprefixtype'] = 'Project' # XXX not sure this is right...
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()
|