blob: 3d3e4b286e411bcc13e4af16cfbf3e955ec1ff32 [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 Jansen4a4adf42001-01-24 16:04:50 +00004import string
Jack Jansen76167fe2000-09-15 22:44:08 +00005
6Error="gencwproject.Error"
7#
8# These templates are executed in-order.
9#
10TEMPLATELIST= [
11 ("tmp_allsources", "file", "template-allsources.xml", "sources"),
12 ("tmp_linkorder", "file", "template-linkorder.xml", "sources"),
13 ("tmp_grouplist", "file", "template-grouplist.xml", "sources"),
Jack Jansencb54be82000-11-26 23:02:38 +000014 ("tmp_alllibraries", "file", "template-alllibraries.xml", "libraries"),
15 ("tmp_linkorderlib", "file", "template-linkorderlib.xml", "libraries"),
16 ("tmp_grouplistlib", "file", "template-grouplistlib.xml", "libraries"),
Jack Jansen07642c32000-09-22 23:26:55 +000017 ("tmp_extrasearchdirs", "file", "template-searchdirs.xml", "extrasearchdirs"),
Jack Jansen76167fe2000-09-15 22:44:08 +000018 ("tmp_projectxmldata", "file", "template.prj.xml", None)
19]
20
21class ProjectBuilder:
Jack Jansen50f6f6f2001-01-23 22:34:50 +000022 def __init__(self, dict, templatelist=TEMPLATELIST, templatename=None):
Jack Jansen81feb6c2001-12-14 14:31:15 +000023 self._adddefaults(dict)
Jack Jansen50f6f6f2001-01-23 22:34:50 +000024 if templatename == None:
25 if hasattr(MacOS, 'runtimemodel'):
26 templatename = 'template-%s'%MacOS.runtimemodel
27 else:
28 templatename = 'template'
29 if os.sep in templatename:
30 templatedir = templatename
31 else:
Jack Jansen76167fe2000-09-15 22:44:08 +000032 try:
33 packagedir = os.path.split(__file__)[0]
34 except NameError:
35 packagedir = os.curdir
Jack Jansen50f6f6f2001-01-23 22:34:50 +000036 templatedir = os.path.join(packagedir, templatename)
Jack Jansen76167fe2000-09-15 22:44:08 +000037 if not os.path.exists(templatedir):
Jack Jansen50f6f6f2001-01-23 22:34:50 +000038 raise Error, "Cannot find templatedir %s"%templatedir
Jack Jansen76167fe2000-09-15 22:44:08 +000039 self.dict = dict
Jack Jansencb54be82000-11-26 23:02:38 +000040 if not dict.has_key('prefixname'):
Just van Rossumf3456912001-08-11 10:07:23 +000041 if hasattr(MacOS, 'runtimemodel') and MacOS.runtimemodel == "carbon":
Jack Jansen440a36f2002-06-26 20:36:12 +000042 dict['prefixname'] = 'mwerks_shcarbon_pch'
Just van Rossumf3456912001-08-11 10:07:23 +000043 else:
44 dict['prefixname'] = 'mwerks_plugin_config.h'
Jack Jansen76167fe2000-09-15 22:44:08 +000045 self.templatelist = templatelist
46 self.templatedir = templatedir
Jack Jansen81feb6c2001-12-14 14:31:15 +000047
48 def _adddefaults(self, dict):
49 # Set all suitable defaults set for values which were omitted.
50 if not dict.has_key('mac_outputdir'):
51 dict['mac_outputdir'] = ':lib:'
52 if not dict.has_key('stdlibraryflags'):
53 dict['stdlibraryflags'] = 'Debug'
54 if not dict.has_key('libraryflags'):
55 dict['libraryflags'] = 'Debug'
Jack Jansenb66e1a32002-05-23 22:34:18 +000056 if not dict.has_key('initialize'):
57 dict['initialize'] = '__initialize'
Jack Jansen81feb6c2001-12-14 14:31:15 +000058 if not dict.has_key('mac_sysprefixtype'):
59 if os.path.isabs(dict['sysprefix']):
60 dict['mac_sysprefixtype'] = 'Absolute'
61 else:
62 dict['mac_sysprefixtype'] = 'Project' # XXX not sure this is right...
Jack Jansen76167fe2000-09-15 22:44:08 +000063
64 def generate(self):
65 for tmpl in self.templatelist:
66 self._generate_one_template(tmpl)
67
68 def _generate_one_template(self, tmpl):
69 resultname, datasource, dataname, key = tmpl
70 result = ''
71 if key:
72 # This is a multi-element rule. Run for every item in dict[key]
73 if self.dict.has_key(key):
74 keyvalues = self.dict[key]
75 try:
76 if not type(keyvalues) in (type(()), type([])):
77 raise Error, "List or tuple expected for %s"%key
78 for curkeyvalue in keyvalues:
Jack Jansen4a4adf42001-01-24 16:04:50 +000079 if string.lower(curkeyvalue[:10]) == '{compiler}':
80 curkeyvalue = curkeyvalue[10:]
81 self.dict['pathtype'] = 'CodeWarrior'
82 elif string.lower(curkeyvalue[:9]) == '{project}':
83 curkeyvalue = curkeyvalue[9:]
84 self.dict['pathtype'] = 'Project'
85 elif curkeyvalue[0] == '{':
86 raise Error, "Unknown {} escape in %s"%curkeyvalue
87 elif os.path.isabs(curkeyvalue):
Jack Jansencb54be82000-11-26 23:02:38 +000088 self.dict['pathtype'] = 'Absolute'
89 else:
90 self.dict['pathtype'] = 'Project'
Jack Jansenaee9d6b2000-12-03 22:38:34 +000091 if curkeyvalue[-2:] == ':*':
92 curkeyvalue = curkeyvalue[:-2]
93 self.dict['recursive'] = 'true'
94 else:
95 self.dict['recursive'] = 'false'
96 self.dict[key] = curkeyvalue
Jack Jansen76167fe2000-09-15 22:44:08 +000097 curkeyvalueresult = self._generate_one_value(datasource, dataname)
98 result = result + curkeyvalueresult
99 finally:
100 # Restore the list
101 self.dict[key] = keyvalues
Jack Jansencb54be82000-11-26 23:02:38 +0000102 self.dict['pathtype'] = None
103 del self.dict['pathtype']
Jack Jansenaee9d6b2000-12-03 22:38:34 +0000104 self.dict['recursive'] = None
105 del self.dict['recursive']
Jack Jansen76167fe2000-09-15 22:44:08 +0000106 else:
107 # Not a multi-element rule. Simply generate
108 result = self._generate_one_value(datasource, dataname)
109 # And store the result
110 self.dict[resultname] = result
111
112 def _generate_one_value(self, datasource, dataname):
113 if datasource == 'file':
114 filepath = os.path.join(self.templatedir, dataname)
115 fp = open(filepath, "r")
116 format = fp.read()
117 elif datasource == 'string':
118 format = dataname
119 else:
120 raise Error, 'Datasource should be file or string, not %s'%datasource
121 return format % self.dict
122
123def _test():
124 dict = {
Jack Jansen07642c32000-09-22 23:26:55 +0000125 "mac_projectxmlname" : "controlstrip.prj.xml", # The XML filename (full path)
126 "mac_exportname" : "controlstrip.prj.exp", # Export file (relative to project)
127 "mac_outputdir" : ":", # The directory where the DLL is put (relative to project)
128 "mac_dllname" : "controlstrip.ppc.slb", # The DLL filename (within outputdir)
129 "mac_targetname" : "controlstrip.ppc", # The targetname within the project
130 "sysprefix" : sys.prefix, # Where the Python sources live
131 "mac_sysprefixtype" : "Absolute", # Type of previous pathname
132 "sources" : ["controlstripmodule.c"],
133 "extrasearchdirs": [], # -I and -L, in unix terms
Jack Jansen76167fe2000-09-15 22:44:08 +0000134 }
135 pb = ProjectBuilder(dict)
136 pb.generate()
137 fp = open(dict["mac_projectxmlname"], "w")
138 fp.write(dict["tmp_projectxmldata"])
139
140if __name__ == '__main__':
141 _test()
142