blob: b29786f68a025b05d6a7f14ea12f8c17a7aeb43a [file] [log] [blame]
Jack Jansen76167fe2000-09-15 22:44:08 +00001# First attempt at automatically generating CodeWarior projects
2import os
3
4Error="gencwproject.Error"
5#
6# These templates are executed in-order.
7#
8TEMPLATELIST= [
9 ("tmp_allsources", "file", "template-allsources.xml", "sources"),
10 ("tmp_linkorder", "file", "template-linkorder.xml", "sources"),
11 ("tmp_grouplist", "file", "template-grouplist.xml", "sources"),
Jack Jansen07642c32000-09-22 23:26:55 +000012 ("tmp_extrasearchdirs", "file", "template-searchdirs.xml", "extrasearchdirs"),
Jack Jansen76167fe2000-09-15 22:44:08 +000013 ("tmp_projectxmldata", "file", "template.prj.xml", None)
14]
15
16class ProjectBuilder:
17 def __init__(self, dict, templatelist=TEMPLATELIST, templatedir=None):
18 if templatedir == None:
19 try:
20 packagedir = os.path.split(__file__)[0]
21 except NameError:
22 packagedir = os.curdir
23 templatedir = os.path.join(packagedir, 'template')
24 if not os.path.exists(templatedir):
25 raise Error, "Cannot file templatedir"
26 self.dict = dict
27 self.templatelist = templatelist
28 self.templatedir = templatedir
29
30 def generate(self):
31 for tmpl in self.templatelist:
32 self._generate_one_template(tmpl)
33
34 def _generate_one_template(self, tmpl):
35 resultname, datasource, dataname, key = tmpl
36 result = ''
37 if key:
38 # This is a multi-element rule. Run for every item in dict[key]
39 if self.dict.has_key(key):
40 keyvalues = self.dict[key]
41 try:
42 if not type(keyvalues) in (type(()), type([])):
43 raise Error, "List or tuple expected for %s"%key
44 for curkeyvalue in keyvalues:
45 self.dict[key] = curkeyvalue
46 curkeyvalueresult = self._generate_one_value(datasource, dataname)
47 result = result + curkeyvalueresult
48 finally:
49 # Restore the list
50 self.dict[key] = keyvalues
51 else:
52 # Not a multi-element rule. Simply generate
53 result = self._generate_one_value(datasource, dataname)
54 # And store the result
55 self.dict[resultname] = result
56
57 def _generate_one_value(self, datasource, dataname):
58 if datasource == 'file':
59 filepath = os.path.join(self.templatedir, dataname)
60 fp = open(filepath, "r")
61 format = fp.read()
62 elif datasource == 'string':
63 format = dataname
64 else:
65 raise Error, 'Datasource should be file or string, not %s'%datasource
66 return format % self.dict
67
68def _test():
69 dict = {
Jack Jansen07642c32000-09-22 23:26:55 +000070 "mac_projectxmlname" : "controlstrip.prj.xml", # The XML filename (full path)
71 "mac_exportname" : "controlstrip.prj.exp", # Export file (relative to project)
72 "mac_outputdir" : ":", # The directory where the DLL is put (relative to project)
73 "mac_dllname" : "controlstrip.ppc.slb", # The DLL filename (within outputdir)
74 "mac_targetname" : "controlstrip.ppc", # The targetname within the project
75 "sysprefix" : sys.prefix, # Where the Python sources live
76 "mac_sysprefixtype" : "Absolute", # Type of previous pathname
77 "sources" : ["controlstripmodule.c"],
78 "extrasearchdirs": [], # -I and -L, in unix terms
Jack Jansen76167fe2000-09-15 22:44:08 +000079 }
80 pb = ProjectBuilder(dict)
81 pb.generate()
82 fp = open(dict["mac_projectxmlname"], "w")
83 fp.write(dict["tmp_projectxmldata"])
84
85if __name__ == '__main__':
86 _test()
87