py-cvs-2001_07_13 (Rev 1.3) merge
[python/dscho.git] / Mac / Lib / mkcwproject / cwxmlgen.py
blobef6f93a63d43c98dfc6d5913919a6845b362288a
1 # First attempt at automatically generating CodeWarior projects
2 import os
3 import MacOS
4 import string
6 Error="gencwproject.Error"
8 # These templates are executed in-order.
9 #
10 TEMPLATELIST= [
11 ("tmp_allsources", "file", "template-allsources.xml", "sources"),
12 ("tmp_linkorder", "file", "template-linkorder.xml", "sources"),
13 ("tmp_grouplist", "file", "template-grouplist.xml", "sources"),
14 ("tmp_alllibraries", "file", "template-alllibraries.xml", "libraries"),
15 ("tmp_linkorderlib", "file", "template-linkorderlib.xml", "libraries"),
16 ("tmp_grouplistlib", "file", "template-grouplistlib.xml", "libraries"),
17 ("tmp_extrasearchdirs", "file", "template-searchdirs.xml", "extrasearchdirs"),
18 ("tmp_projectxmldata", "file", "template.prj.xml", None)
21 class ProjectBuilder:
22 def __init__(self, dict, templatelist=TEMPLATELIST, templatename=None):
23 if templatename == None:
24 if hasattr(MacOS, 'runtimemodel'):
25 templatename = 'template-%s'%MacOS.runtimemodel
26 else:
27 templatename = 'template'
28 if os.sep in templatename:
29 templatedir = templatename
30 else:
31 try:
32 packagedir = os.path.split(__file__)[0]
33 except NameError:
34 packagedir = os.curdir
35 templatedir = os.path.join(packagedir, templatename)
36 if not os.path.exists(templatedir):
37 raise Error, "Cannot find templatedir %s"%templatedir
38 self.dict = dict
39 if not dict.has_key('prefixname'):
40 dict['prefixname'] = 'mwerks_plugin_config.h'
41 self.templatelist = templatelist
42 self.templatedir = templatedir
44 def generate(self):
45 for tmpl in self.templatelist:
46 self._generate_one_template(tmpl)
48 def _generate_one_template(self, tmpl):
49 resultname, datasource, dataname, key = tmpl
50 result = ''
51 if key:
52 # This is a multi-element rule. Run for every item in dict[key]
53 if self.dict.has_key(key):
54 keyvalues = self.dict[key]
55 try:
56 if not type(keyvalues) in (type(()), type([])):
57 raise Error, "List or tuple expected for %s"%key
58 for curkeyvalue in keyvalues:
59 if string.lower(curkeyvalue[:10]) == '{compiler}':
60 curkeyvalue = curkeyvalue[10:]
61 self.dict['pathtype'] = 'CodeWarrior'
62 elif string.lower(curkeyvalue[:9]) == '{project}':
63 curkeyvalue = curkeyvalue[9:]
64 self.dict['pathtype'] = 'Project'
65 elif curkeyvalue[0] == '{':
66 raise Error, "Unknown {} escape in %s"%curkeyvalue
67 elif os.path.isabs(curkeyvalue):
68 self.dict['pathtype'] = 'Absolute'
69 else:
70 self.dict['pathtype'] = 'Project'
71 if curkeyvalue[-2:] == ':*':
72 curkeyvalue = curkeyvalue[:-2]
73 self.dict['recursive'] = 'true'
74 else:
75 self.dict['recursive'] = 'false'
76 self.dict[key] = curkeyvalue
77 curkeyvalueresult = self._generate_one_value(datasource, dataname)
78 result = result + curkeyvalueresult
79 finally:
80 # Restore the list
81 self.dict[key] = keyvalues
82 self.dict['pathtype'] = None
83 del self.dict['pathtype']
84 self.dict['recursive'] = None
85 del self.dict['recursive']
86 else:
87 # Not a multi-element rule. Simply generate
88 result = self._generate_one_value(datasource, dataname)
89 # And store the result
90 self.dict[resultname] = result
92 def _generate_one_value(self, datasource, dataname):
93 if datasource == 'file':
94 filepath = os.path.join(self.templatedir, dataname)
95 fp = open(filepath, "r")
96 format = fp.read()
97 elif datasource == 'string':
98 format = dataname
99 else:
100 raise Error, 'Datasource should be file or string, not %s'%datasource
101 return format % self.dict
103 def _test():
104 dict = {
105 "mac_projectxmlname" : "controlstrip.prj.xml", # The XML filename (full path)
106 "mac_exportname" : "controlstrip.prj.exp", # Export file (relative to project)
107 "mac_outputdir" : ":", # The directory where the DLL is put (relative to project)
108 "mac_dllname" : "controlstrip.ppc.slb", # The DLL filename (within outputdir)
109 "mac_targetname" : "controlstrip.ppc", # The targetname within the project
110 "sysprefix" : sys.prefix, # Where the Python sources live
111 "mac_sysprefixtype" : "Absolute", # Type of previous pathname
112 "sources" : ["controlstripmodule.c"],
113 "extrasearchdirs": [], # -I and -L, in unix terms
115 pb = ProjectBuilder(dict)
116 pb.generate()
117 fp = open(dict["mac_projectxmlname"], "w")
118 fp.write(dict["tmp_projectxmldata"])
120 if __name__ == '__main__':
121 _test()