Updated for hfsplus module, new gusi libs.
[python/dscho.git] / Mac / scripts / fullbuild.py
blob4ae94f0418c99c7851da2a8bfdc9aa6ebcd0fe7d
2 # fullbuild creates everything that needs to be created before a
3 # distribution can be made, and puts it all in the right place.
5 # It expects the projects to be in the places where Jack likes them:
6 # in directories named like 'build.mac'. That is fixable,
7 # however.
9 # NOTE: You should proably make a copy of python with which to execute this
10 # script, rebuilding running programs does not work...
12 MACBUILDNO=":Mac:Include:macbuildno.h"
14 import os
15 import sys
16 import macfs
17 import MacOS
18 import EasyDialogs
19 import re
20 import string
21 import genpluginprojects
22 import macresource
24 import aetools
25 from Carbon import AppleEvents
27 OLDAESUPPORT = 0
29 if OLDAESUPPORT:
30 from Metrowerks_Shell_Suite import Metrowerks_Shell_Suite
31 from CodeWarrior_suite import CodeWarrior_suite
32 from Metrowerks_Standard_Suite import Metrowerks_Standard_Suite
33 from Required_Suite import Required_Suite
34 else:
35 import CodeWarrior
37 from Carbon import Res
38 from Carbon import Dlg
40 import buildtools
41 import cfmfile
43 # Dialog resource. Note that the item numbers should correspond
44 # to those in the DITL resource. Also note that the order is important:
45 # things are built in this order, so there should be no forward dependencies.
46 DIALOG_ID = 512
48 I_OK=1
49 I_CANCEL=2
50 # label 3
51 I_PPC_EXTLIBS=4
52 I_GEN_PROJECTS=5
53 I_GEN_PROJECTS_FORCE=6
54 I_GEN_IMGPROJECTS=7
55 I_GEN_IMGPROJECTS_FORCE=8
56 I_INC_BUILDNO=9
57 # label 10
58 I_PPC_CORE=11
59 I_PPC_PLUGINS=12
60 I_PPC_EXTENSIONS=13
61 # label 14
62 I_CARBON_CORE=15
63 I_CARBON_PLUGINS=16
64 I_CARBON_EXTENSIONS=17
65 I_INTERPRETER=18
66 # label 19
67 I_PPC_FULL=20
68 I_PPC_SMALL=21
69 # label 22
70 I_CARBON_FULL=23
71 I_CARBON_SMALL=24
72 # label 25
73 I_APPLETS=26
75 N_BUTTONS=27
77 if OLDAESUPPORT:
78 class MwShell(Metrowerks_Shell_Suite, CodeWarrior_suite, Metrowerks_Standard_Suite,
79 Required_Suite, aetools.TalkTo):
80 pass
81 else:
82 MwShell = CodeWarrior.CodeWarrior
84 RUNNING=[]
86 def buildmwproject(top, creator, projects):
87 """Build projects with an MW compiler"""
88 mgr = MwShell(creator, start=1)
89 mgr.send_timeout = AppleEvents.kNoTimeOut
91 failed = []
92 for file in projects:
93 if type(file) == type(()):
94 file, target = file
95 else:
96 target = ''
97 file = os.path.join(top, file)
98 try:
99 fss = macfs.FSSpec(file)
100 except MacOS.Error:
101 print '** file not found:', file
102 continue
103 print 'Building', file, target
104 try:
105 mgr.open(fss)
106 except aetools.Error, detail:
107 print '**', detail, file
108 continue
109 if target:
110 try:
111 mgr.Set_Current_Target(target)
112 except aetools.Error, arg:
113 print '**', file, target, 'Cannot select:', arg
114 try:
115 mgr.Make_Project()
116 except aetools.Error, arg:
117 print '**', file, target, 'Failed:', arg
118 failed.append(fss)
119 mgr.Close_Project()
120 if failed:
121 print 'Open failed projects and exit?',
122 rv = sys.stdin.readline()
123 if rv[0] in ('y', 'Y'):
124 for fss in failed:
125 mgr.open(fss)
126 sys.exit(0)
127 ## mgr.quit()
129 def buildapplet(top, dummy, list):
130 """Create python applets"""
131 for src, dst, tmpl in list:
132 template = buildtools.findtemplate(tmpl)
133 if src[-3:] != '.py':
134 raise 'Should end in .py', src
135 base = os.path.basename(src)
136 src = os.path.join(top, src)
137 dst = os.path.join(top, dst)
138 try:
139 os.unlink(dst)
140 except os.error:
141 pass
142 print 'Building applet', dst
143 try:
144 buildtools.process(template, src, dst, 1)
145 except buildtools.BuildError, arg:
146 print '**', dst, arg
148 def buildprojectfile(top, arg, list):
149 """Create CodeWarrior project files with a script"""
150 for folder, module, routine in list:
151 print "Generating project files with", module
152 sys.path.insert(0, os.path.join(top, folder))
153 m = __import__(module)
154 r = getattr(m, routine)
155 r(arg)
156 del sys.path[0]
158 def buildfat(top, dummy, list):
159 """Build fat binaries"""
160 for dst, src1, src2 in list:
161 dst = os.path.join(top, dst)
162 src1 = os.path.join(top, src1)
163 src2 = os.path.join(top, src2)
164 print 'Building fat binary', dst
165 cfmfile.mergecfmfiles((src1, src2), dst)
167 def buildcopy(top, dummy, list):
168 import macostools
169 for src, dst in list:
170 src = os.path.join(top, src)
171 dst = os.path.join(top, dst)
172 macostools.copy(src, dst, forcetype="APPL")
174 def handle_dialog(filename):
175 """Handle selection dialog, return list of selected items"""
176 d = Dlg.GetNewDialog(DIALOG_ID, -1)
177 d.SetDialogDefaultItem(I_OK)
178 d.SetDialogCancelItem(I_CANCEL)
179 results = [0]*N_BUTTONS
180 while 1:
181 n = Dlg.ModalDialog(None)
182 if n == I_OK:
183 break
184 if n == I_CANCEL:
185 return []
186 if n == I_INC_BUILDNO:
187 incbuildno(filename)
188 continue
189 if n < len(results):
190 results[n] = (not results[n])
191 ctl = d.GetDialogItemAsControl(n)
192 ctl.SetControlValue(results[n])
193 rv = []
194 for i in range(len(results)):
195 if results[i]:
196 rv.append(i)
197 return rv
200 # The build instructions. Entries are (routine, arg, list-of-files)
201 # XXXX We could also include the builds for stdwin and such here...
202 BUILD_DICT = {
203 I_GEN_PROJECTS : (buildprojectfile, 0, [
204 (":Mac:scripts", "genpluginprojects", "genallprojects")
207 I_GEN_PROJECTS_FORCE : (buildprojectfile, 1, [
208 (":Mac:scripts", "genpluginprojects", "genallprojects")
211 I_GEN_IMGPROJECTS : (buildprojectfile, 0, [
212 (":Extensions:img:Mac", "genimgprojects", "genallprojects")
215 I_GEN_IMGPROJECTS_FORCE : (buildprojectfile, 1, [
216 (":Extensions:img:Mac", "genimgprojects", "genallprojects")
219 I_INTERPRETER : (buildcopy, None, [
220 ("PythonInterpreterCarbon", "PythonInterpreter"),
223 I_PPC_CORE : (buildmwproject, "CWIE", [
224 (":Mac:Build:PythonCore.mcp", "PythonCore"),
225 (":Mac:Build:PythonInterpreter.mcp", "PythonInterpreterClassic"),
228 I_CARBON_CORE : (buildmwproject, "CWIE", [
229 (":Mac:Build:PythonCore.mcp", "PythonCoreCarbon"),
230 (":Mac:Build:PythonInterpreter.mcp", "PythonInterpreterCarbon"),
233 I_PPC_EXTLIBS : (buildmwproject, "CWIE", [
234 ## (":Mac:Build:buildlibs.mcp", "buildlibs ppc plus tcl/tk"),
235 (":Mac:Build:buildlibs.mcp", "buildlibs ppc"),
238 I_PPC_PLUGINS : (buildmwproject, "CWIE", [
239 (":Mac:Build:_weakref.mcp", "_weakref.ppc"),
240 (":Mac:Build:_symtable.mcp", "_symtable.ppc"),
241 (":Mac:Build:_testcapi.mcp", "_testcapi.ppc"),
242 (":Mac:Build:_hotshot.mcp", "_hotshot.ppc"),
243 (":Mac:Build:xx.mcp", "xx.ppc"),
244 (":Mac:Build:xxsubtype.mcp", "xxsubtype.ppc"),
245 (":Mac:Build:pyexpat.mcp", "pyexpat.ppc"),
246 (":Mac:Build:calldll.mcp", "calldll.ppc"),
247 (":Mac:Build:ctb.mcp", "ctb.ppc"),
248 (":Mac:Build:gdbm.mcp", "gdbm.ppc"),
249 (":Mac:Build:icglue.mcp", "icglue.ppc"),
250 (":Mac:Build:macspeech.mcp", "macspeech.ppc"),
251 (":Mac:Build:waste.mcp", "waste.ppc"),
252 (":Mac:Build:zlib.mcp", "zlib.ppc"),
253 ## (":Mac:Build:_tkinter.mcp", "_tkinter.ppc"),
254 (":Extensions:Imaging:_tkinter.mcp", "_tkinter.ppc"),
255 (":Mac:Build:ColorPicker.mcp", "ColorPicker.ppc"),
256 (":Mac:Build:Printing.mcp", "Printing.ppc"),
257 (":Mac:Build:_AE.mcp", "_AE.ppc"),
258 (":Mac:Build:_App.mcp", "_App.ppc"),
259 (":Mac:Build:_Cm.mcp", "_Cm.ppc"),
260 (":Mac:Build:_Ctl.mcp", "_Ctl.ppc"),
261 (":Mac:Build:_Dlg.mcp", "_Dlg.ppc"),
262 (":Mac:Build:_Drag.mcp", "_Drag.ppc"),
263 (":Mac:Build:_Evt.mcp", "_Evt.ppc"),
264 (":Mac:Build:_Fm.mcp", "_Fm.ppc"),
265 (":Mac:Build:_Help.mcp", "_Help.ppc"),
266 (":Mac:Build:_Icn.mcp", "_Icn.ppc"),
267 (":Mac:Build:_List.mcp", "_List.ppc"),
268 (":Mac:Build:_Menu.mcp", "_Menu.ppc"),
269 (":Mac:Build:_Mlte.mcp", "_Mlte.ppc"),
270 (":Mac:Build:_Qd.mcp", "_Qd.ppc"),
271 (":Mac:Build:_Qdoffs.mcp", "_Qdoffs.ppc"),
272 (":Mac:Build:_Qt.mcp", "_Qt.ppc"),
273 (":Mac:Build:_Res.mcp", "_Res.ppc"),
274 (":Mac:Build:_Scrap.mcp", "_Scrap.ppc"),
275 (":Mac:Build:_Snd.mcp", "_Snd.ppc"),
276 (":Mac:Build:_Sndihooks.mcp", "_Sndihooks.ppc"),
277 (":Mac:Build:_TE.mcp", "_TE.ppc"),
278 (":Mac:Build:_Win.mcp", "_Win.ppc"),
281 I_CARBON_PLUGINS : (buildmwproject, "CWIE", [
282 (":Mac:Build:_weakref.carbon.mcp", "_weakref.carbon"),
283 (":Mac:Build:_symtable.carbon.mcp", "_symtable.carbon"),
284 (":Mac:Build:_testcapi.carbon.mcp", "_testcapi.carbon"),
285 (":Mac:Build:_hotshot.carbon.mcp", "_hotshot.carbon"),
286 (":Mac:Build:xx.carbon.mcp", "xx.carbon"),
287 (":Mac:Build:xxsubtype.carbon.mcp", "xxsubtype.carbon"),
288 (":Mac:Build:pyexpat.carbon.mcp", "pyexpat.carbon"),
289 (":Mac:Build:calldll.carbon.mcp", "calldll.carbon"),
290 (":Mac:Build:gdbm.carbon.mcp", "gdbm.carbon"),
291 (":Mac:Build:icglue.carbon.mcp", "icglue.carbon"),
292 (":Mac:Build:waste.carbon.mcp", "waste.carbon"),
293 (":Mac:Build:zlib.carbon.mcp", "zlib.carbon"),
294 (":Mac:Build:_dummy_tkinter.mcp", "_tkinter.carbon"),
295 (":Mac:Build:hfsplus.carbon.mcp", "hfsplus.carbon"),
296 ## (":Extensions:Imaging:_tkinter.carbon.mcp", "_tkinter.carbon"),
297 (":Mac:Build:ColorPicker.carbon.mcp", "ColorPicker.carbon"),
298 (":Mac:Build:_AE.carbon.mcp", "_AE.carbon"),
299 (":Mac:Build:_App.carbon.mcp", "_App.carbon"),
300 (":Mac:Build:_CF.carbon.mcp", "_CF.carbon"),
301 (":Mac:Build:_Cm.carbon.mcp", "_Cm.carbon"),
302 (":Mac:Build:_Ctl.carbon.mcp", "_Ctl.carbon"),
303 (":Mac:Build:_Dlg.carbon.mcp", "_Dlg.carbon"),
304 (":Mac:Build:_Drag.carbon.mcp", "_Drag.carbon"),
305 (":Mac:Build:_Evt.carbon.mcp", "_Evt.carbon"),
306 (":Mac:Build:_Fm.carbon.mcp", "_Fm.carbon"),
307 (":Mac:Build:_Icn.carbon.mcp", "_Icn.carbon"),
308 (":Mac:Build:_List.carbon.mcp", "_List.carbon"),
309 (":Mac:Build:_Menu.carbon.mcp", "_Menu.carbon"),
310 (":Mac:Build:_Mlte.carbon.mcp", "_Mlte.carbon"),
311 (":Mac:Build:_Qd.carbon.mcp", "_Qd.carbon"),
312 (":Mac:Build:_Qdoffs.carbon.mcp", "_Qdoffs.carbon"),
313 (":Mac:Build:_Qt.carbon.mcp", "_Qt.carbon"),
314 (":Mac:Build:_Res.carbon.mcp", "_Res.carbon"),
315 (":Mac:Build:_Scrap.carbon.mcp", "_Scrap.carbon"),
316 (":Mac:Build:_Snd.carbon.mcp", "_Snd.carbon"),
317 (":Mac:Build:_Sndihooks.carbon.mcp", "_Sndihooks.carbon"),
318 (":Mac:Build:_TE.carbon.mcp", "_TE.carbon"),
319 (":Mac:Build:_Win.carbon.mcp", "_Win.carbon"),
323 I_PPC_FULL : (buildmwproject, "CWIE", [
324 (":Mac:Build:PythonStandalone.mcp", "PythonStandalone"),
327 I_PPC_SMALL : (buildmwproject, "CWIE", [
328 (":Mac:Build:PythonStandSmall.mcp", "PythonStandSmall"),
331 I_CARBON_FULL : (buildmwproject, "CWIE", [
332 (":Mac:Build:PythonStandalone.mcp", "PythonCarbonStandalone"),
335 I_CARBON_SMALL : (buildmwproject, "CWIE", [
336 (":Mac:Build:PythonStandSmall.mcp", "PythonStandSmallCarbon"),
339 I_PPC_EXTENSIONS : (buildmwproject, "CWIE", [
340 (":Extensions:Imaging:_imaging.mcp", "_imaging.ppc"),
341 ## (":Extensions:Imaging:_tkinter.mcp", "_tkinter.ppc"),
342 (":Extensions:img:Mac:imgmodules.mcp", "imgmodules.ppc"),
345 I_CARBON_EXTENSIONS : (buildmwproject, "CWIE", [
346 (":Extensions:Imaging:_imaging.mcp", "_imaging.carbon"),
347 ## (":Extensions:Imaging:_tkinter.mcp", "_tkinter.carbon"),
348 (":Extensions:img:Mac:imgmodules.mcp", "imgmodules.carbon"),
351 I_APPLETS : (buildapplet, None, [
352 (":Mac:scripts:EditPythonPrefs.py", "EditPythonPrefs", None),
353 (":Mac:scripts:BuildApplet.py", "BuildApplet", None),
354 (":Mac:scripts:BuildApplication.py", "BuildApplication", None),
355 (":Mac:scripts:ConfigurePython.py", "ConfigurePython", None),
356 (":Mac:scripts:ConfigurePython.py", "ConfigurePythonCarbon", "PythonInterpreterCarbon"),
357 (":Mac:scripts:ConfigurePython.py", "ConfigurePythonClassic", "PythonInterpreterClassic"),
358 (":Mac:Tools:IDE:PythonIDE.py", "Python IDE", None),
359 (":Mac:Tools:CGI:PythonCGISlave.py", ":Mac:Tools:CGI:PythonCGISlave", None),
360 (":Mac:Tools:CGI:BuildCGIApplet.py", ":Mac:Tools:CGI:BuildCGIApplet", None),
364 def incbuildno(filename):
365 fp = open(filename)
366 line = fp.readline()
367 fp.close()
369 pat = re.compile('#define BUILD ([0-9]+)')
370 m = pat.search(line)
371 if not m or not m.group(1):
372 raise 'Incorrect macbuildno.h line', line
373 buildno = m.group(1)
374 new = string.atoi(buildno) + 1
375 fp = open(filename, 'w')
376 fp.write('#define BUILD %d\n'%new)
377 fp.close()
379 def main():
380 macresource.need('DLOG', DIALOG_ID, 'fullbuild.rsrc')
381 dir, ok = macfs.GetDirectory('Python source folder:')
382 if not ok:
383 sys.exit(0)
384 dir = dir.as_pathname()
385 # Set genpluginprojects to use this folder (slight hack)
386 genpluginprojects.PYTHONDIR = dir
388 todo = handle_dialog(os.path.join(dir, MACBUILDNO))
390 instructions = []
391 for i in todo:
392 instructions.append(BUILD_DICT[i])
394 for routine, arg, list in instructions:
395 routine(dir, arg, list)
397 if todo:
398 print "All done!"
400 if __name__ == '__main__':
401 main()