blob: c3218a37c05776cb828abd3688bc2d6d12ee45f9 [file] [log] [blame]
Jack Jansen76167fe2000-09-15 22:44:08 +00001# First attempt at automatically generating CodeWarior projects
2import os
Jack Jansen50f6f6f2001-01-23 22:34:50 +00003import MacOS
Jack Jansen76167fe2000-09-15 22:44:08 +00004
5Error="gencwproject.Error"
6#
7# These templates are executed in-order.
8#
9TEMPLATELIST= [
10 ("tmp_allsources", "file", "template-allsources.xml", "sources"),
11 ("tmp_linkorder", "file", "template-linkorder.xml", "sources"),
12 ("tmp_grouplist", "file", "template-grouplist.xml", "sources"),
Jack Jansencb54be82000-11-26 23:02:38 +000013 ("tmp_alllibraries", "file", "template-alllibraries.xml", "libraries"),
14 ("tmp_linkorderlib", "file", "template-linkorderlib.xml", "libraries"),
15 ("tmp_grouplistlib", "file", "template-grouplistlib.xml", "libraries"),
Jack Jansen07642c32000-09-22 23:26:55 +000016 ("tmp_extrasearchdirs", "file", "template-searchdirs.xml", "extrasearchdirs"),
Jack Jansen76167fe2000-09-15 22:44:08 +000017 ("tmp_projectxmldata", "file", "template.prj.xml", None)
18]
19
20class ProjectBuilder:
Jack Jansen50f6f6f2001-01-23 22:34:50 +000021 def __init__(self, dict, templatelist=TEMPLATELIST, templatename=None):
22 if templatename == None:
23 if hasattr(MacOS, 'runtimemodel'):
24 templatename = 'template-%s'%MacOS.runtimemodel
25 else:
26 templatename = 'template'
27 if os.sep in templatename:
28 templatedir = templatename
29 else:
Jack Jansen76167fe2000-09-15 22:44:08 +000030 try:
31 packagedir = os.path.split(__file__)[0]
32 except NameError:
33 packagedir = os.curdir
Jack Jansen50f6f6f2001-01-23 22:34:50 +000034 templatedir = os.path.join(packagedir, templatename)
Jack Jansen76167fe2000-09-15 22:44:08 +000035 if not os.path.exists(templatedir):
Jack Jansen50f6f6f2001-01-23 22:34:50 +000036 raise Error, "Cannot find templatedir %s"%templatedir
Jack Jansen76167fe2000-09-15 22:44:08 +000037 self.dict = dict
Jack Jansencb54be82000-11-26 23:02:38 +000038 if not dict.has_key('prefixname'):
39 dict['prefixname'] = 'mwerks_plugin_config.h'
Jack Jansen76167fe2000-09-15 22:44:08 +000040 self.templatelist = templatelist
41 self.templatedir = templatedir
42
43 def generate(self):
44 for tmpl in self.templatelist:
45 self._generate_one_template(tmpl)
46
47 def _generate_one_template(self, tmpl):
48 resultname, datasource, dataname, key = tmpl
49 result = ''
50 if key:
51 # This is a multi-element rule. Run for every item in dict[key]
52 if self.dict.has_key(key):
53 keyvalues = self.dict[key]
54 try:
55 if not type(keyvalues) in (type(()), type([])):
56 raise Error, "List or tuple expected for %s"%key
57 for curkeyvalue in keyvalues:
Jack Jansencb54be82000-11-26 23:02:38 +000058 if os.path.isabs(curkeyvalue):
59 self.dict['pathtype'] = 'Absolute'
60 else:
61 self.dict['pathtype'] = 'Project'
Jack Jansenaee9d6b2000-12-03 22:38:34 +000062 if curkeyvalue[-2:] == ':*':
63 curkeyvalue = curkeyvalue[:-2]
64 self.dict['recursive'] = 'true'
65 else:
66 self.dict['recursive'] = 'false'
67 self.dict[key] = curkeyvalue
Jack Jansen76167fe2000-09-15 22:44:08 +000068 curkeyvalueresult = self._generate_one_value(datasource, dataname)
69 result = result + curkeyvalueresult
70 finally:
71 # Restore the list
72 self.dict[key] = keyvalues
Jack Jansencb54be82000-11-26 23:02:38 +000073 self.dict['pathtype'] = None
74 del self.dict['pathtype']
Jack Jansenaee9d6b2000-12-03 22:38:34 +000075 self.dict['recursive'] = None
76 del self.dict['recursive']
Jack Jansen76167fe2000-09-15 22:44:08 +000077 else:
78 # Not a multi-element rule. Simply generate
79 result = self._generate_one_value(datasource, dataname)
80 # And store the result
81 self.dict[resultname] = result
82
83 def _generate_one_value(self, datasource, dataname):
84 if datasource == 'file':
85 filepath = os.path.join(self.templatedir, dataname)
86 fp = open(filepath, "r")
87 format = fp.read()
88 elif datasource == 'string':
89 format = dataname
90 else:
91 raise Error, 'Datasource should be file or string, not %s'%datasource
92 return format % self.dict
93
94def _test():
95 dict = {
Jack Jansen07642c32000-09-22 23:26:55 +000096 "mac_projectxmlname" : "controlstrip.prj.xml", # The XML filename (full path)
97 "mac_exportname" : "controlstrip.prj.exp", # Export file (relative to project)
98 "mac_outputdir" : ":", # The directory where the DLL is put (relative to project)
99 "mac_dllname" : "controlstrip.ppc.slb", # The DLL filename (within outputdir)
100 "mac_targetname" : "controlstrip.ppc", # The targetname within the project
101 "sysprefix" : sys.prefix, # Where the Python sources live
102 "mac_sysprefixtype" : "Absolute", # Type of previous pathname
103 "sources" : ["controlstripmodule.c"],
104 "extrasearchdirs": [], # -I and -L, in unix terms
Jack Jansen76167fe2000-09-15 22:44:08 +0000105 }
106 pb = ProjectBuilder(dict)
107 pb.generate()
108 fp = open(dict["mac_projectxmlname"], "w")
109 fp.write(dict["tmp_projectxmldata"])
110
111if __name__ == '__main__':
112 _test()
113