| 
									
										
										
										
											1995-09-01 12:03:32 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # fullbuild creates everything that needs to be created before a | 
					
						
							|  |  |  | # distribution can be made, and puts it all in the right place. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # It expects the projects to be in the places where Jack likes them: | 
					
						
							| 
									
										
										
										
											1997-09-01 15:37:07 +00:00
										 |  |  | # in directories named like 'build.mac'. That is fixable, | 
					
						
							| 
									
										
										
										
											1995-09-01 12:03:32 +00:00
										 |  |  | # however. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # NOTE: You should proably make a copy of python with which to execute this | 
					
						
							|  |  |  | # script, rebuilding running programs does not work... | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-09-01 15:37:07 +00:00
										 |  |  | MACBUILDNO=":Mac:Include:macbuildno.h" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-09-01 12:03:32 +00:00
										 |  |  | import os | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import macfs | 
					
						
							| 
									
										
										
										
											1996-02-21 15:28:49 +00:00
										 |  |  | import MacOS | 
					
						
							| 
									
										
										
										
											1996-04-10 14:51:14 +00:00
										 |  |  | import EasyDialogs | 
					
						
							| 
									
										
										
										
											1997-09-01 15:37:07 +00:00
										 |  |  | import regex | 
					
						
							|  |  |  | import string | 
					
						
							| 
									
										
										
										
											1995-09-01 12:03:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | import aetools | 
					
						
							| 
									
										
										
										
											1996-02-21 15:28:49 +00:00
										 |  |  | import AppleEvents | 
					
						
							| 
									
										
										
										
											1995-09-01 12:03:32 +00:00
										 |  |  | from Metrowerks_Shell_Suite import Metrowerks_Shell_Suite | 
					
						
							| 
									
										
										
										
											1997-08-27 14:10:29 +00:00
										 |  |  | from CodeWarrior_Standard_Suite import CodeWarrior_Standard_Suite | 
					
						
							| 
									
										
										
										
											1997-05-06 16:15:32 +00:00
										 |  |  | from Required_Suite import Required_Suite | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import Res | 
					
						
							|  |  |  | import Dlg | 
					
						
							| 
									
										
										
										
											1995-09-01 12:03:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-07-31 09:45:27 +00:00
										 |  |  | import buildtools | 
					
						
							| 
									
										
										
										
											1997-05-06 16:15:32 +00:00
										 |  |  | import cfmfile | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Dialog resource. Note that the item numbers should correspond | 
					
						
							|  |  |  | # to those in the DITL resource. Also note that the order is important: | 
					
						
							|  |  |  | # things are built in this order, so there should be no forward dependencies. | 
					
						
							|  |  |  | DIALOG_ID = 512 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | I_OK=1 | 
					
						
							|  |  |  | I_CANCEL=2 | 
					
						
							| 
									
										
										
										
											1997-09-09 13:57:15 +00:00
										 |  |  | I_INC_BUILDNO=19 | 
					
						
							| 
									
										
										
										
											1997-05-06 16:15:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-08-27 14:10:29 +00:00
										 |  |  | I_CORE=3 | 
					
						
							| 
									
										
										
										
											1997-05-06 16:15:32 +00:00
										 |  |  | I_PPC_PLUGINS=4 | 
					
						
							|  |  |  | I_PPC_EXTENSIONS=5 | 
					
						
							| 
									
										
										
										
											1997-08-27 14:10:29 +00:00
										 |  |  | I_68K_PLUGINS=6 | 
					
						
							|  |  |  | I_68K_EXTENSIONS=7 | 
					
						
							|  |  |  | I_PPC_FULL=8 | 
					
						
							|  |  |  | I_PPC_SMALL=9 | 
					
						
							|  |  |  | I_68K_FULL=10 | 
					
						
							|  |  |  | I_68K_SMALL=11 | 
					
						
							|  |  |  | I_APPLETS=12 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | N_BUTTONS=13 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class MwShell(Metrowerks_Shell_Suite, CodeWarrior_Standard_Suite, | 
					
						
							|  |  |  | 				Required_Suite, aetools.TalkTo): | 
					
						
							| 
									
										
										
										
											1995-09-01 12:03:32 +00:00
										 |  |  | 	pass | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-04-10 14:51:14 +00:00
										 |  |  | RUNNING=[] | 
					
						
							| 
									
										
										
										
											1995-09-01 12:03:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def buildmwproject(top, creator, projects): | 
					
						
							|  |  |  | 	"""Build projects with an MW compiler""" | 
					
						
							| 
									
										
										
										
											1996-09-20 15:30:52 +00:00
										 |  |  | 	mgr = MwShell(creator, start=1) | 
					
						
							| 
									
										
										
										
											1996-02-21 15:28:49 +00:00
										 |  |  | 	mgr.send_timeout = AppleEvents.kNoTimeOut | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											1995-09-01 12:03:32 +00:00
										 |  |  | 	for file in projects: | 
					
						
							| 
									
										
										
										
											1997-08-27 14:10:29 +00:00
										 |  |  | 		if type(file) == type(()): | 
					
						
							|  |  |  | 			file, target = file | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			target = '' | 
					
						
							| 
									
										
										
										
											1995-09-01 12:03:32 +00:00
										 |  |  | 		file = os.path.join(top, file) | 
					
						
							| 
									
										
										
										
											1999-01-30 18:27:12 +00:00
										 |  |  | 		try: | 
					
						
							|  |  |  | 			fss = macfs.FSSpec(file) | 
					
						
							|  |  |  | 		except ValueError: | 
					
						
							|  |  |  | 			print '** file not found:', file | 
					
						
							|  |  |  | 			continue | 
					
						
							| 
									
										
										
										
											1997-08-27 14:10:29 +00:00
										 |  |  | 		print 'Building', file, target | 
					
						
							| 
									
										
										
										
											1999-01-30 18:27:12 +00:00
										 |  |  | 		try: | 
					
						
							|  |  |  | 			mgr.open(fss) | 
					
						
							|  |  |  | 		except aetools.Error, detail: | 
					
						
							|  |  |  | 			print '**', detail, file | 
					
						
							|  |  |  | 			continue | 
					
						
							| 
									
										
										
										
											1997-08-27 14:10:29 +00:00
										 |  |  | 		if target: | 
					
						
							|  |  |  | 			try: | 
					
						
							|  |  |  | 				mgr.Set_Current_Target(target) | 
					
						
							|  |  |  | 			except aetools.Error, arg: | 
					
						
							|  |  |  | 				print '**', file, target, 'Cannot select:', arg | 
					
						
							| 
									
										
										
										
											1996-02-21 15:28:49 +00:00
										 |  |  | 		try: | 
					
						
							|  |  |  | 			mgr.Make_Project() | 
					
						
							| 
									
										
										
										
											1996-09-20 15:30:52 +00:00
										 |  |  | 		except aetools.Error, arg: | 
					
						
							| 
									
										
										
										
											1997-08-27 14:10:29 +00:00
										 |  |  | 			print '**', file, target, 'Failed:', arg | 
					
						
							| 
									
										
										
										
											1995-09-01 12:03:32 +00:00
										 |  |  | 		mgr.Close_Project() | 
					
						
							| 
									
										
										
										
											1996-04-10 14:51:14 +00:00
										 |  |  | ##	mgr.quit() | 
					
						
							| 
									
										
										
										
											1995-09-01 12:03:32 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | def buildapplet(top, dummy, list): | 
					
						
							| 
									
										
										
										
											1997-05-06 16:15:32 +00:00
										 |  |  | 	"""Create python applets""" | 
					
						
							| 
									
										
										
										
											1998-07-31 09:45:27 +00:00
										 |  |  | 	template = buildtools.findtemplate() | 
					
						
							| 
									
										
										
										
											1999-02-01 01:21:18 +00:00
										 |  |  | 	for src, dst in list: | 
					
						
							| 
									
										
										
										
											1995-09-01 12:03:32 +00:00
										 |  |  | 		if src[-3:] != '.py': | 
					
						
							|  |  |  | 			raise 'Should end in .py', src | 
					
						
							|  |  |  | 		base = os.path.basename(src) | 
					
						
							|  |  |  | 		src = os.path.join(top, src) | 
					
						
							| 
									
										
										
										
											1999-02-01 01:21:18 +00:00
										 |  |  | 		dst = os.path.join(top, dst) | 
					
						
							| 
									
										
										
										
											1995-09-01 12:03:32 +00:00
										 |  |  | 		try: | 
					
						
							|  |  |  | 			os.unlink(dst) | 
					
						
							|  |  |  | 		except os.error: | 
					
						
							|  |  |  | 			pass | 
					
						
							|  |  |  | 		print 'Building applet', dst | 
					
						
							| 
									
										
										
										
											1998-07-31 09:45:27 +00:00
										 |  |  | 		buildtools.process(template, src, dst, 1) | 
					
						
							| 
									
										
										
										
											1997-05-06 16:15:32 +00:00
										 |  |  | 		 | 
					
						
							|  |  |  | def buildfat(top, dummy, list): | 
					
						
							|  |  |  | 	"""Build fat binaries""" | 
					
						
							|  |  |  | 	for dst, src1, src2 in list: | 
					
						
							|  |  |  | 		dst = os.path.join(top, dst) | 
					
						
							|  |  |  | 		src1 = os.path.join(top, src1) | 
					
						
							|  |  |  | 		src2 = os.path.join(top, src2) | 
					
						
							|  |  |  | 		print 'Building fat binary', dst | 
					
						
							|  |  |  | 		cfmfile.mergecfmfiles((src1, src2), dst) | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											1997-09-09 13:57:15 +00:00
										 |  |  | def handle_dialog(filename): | 
					
						
							| 
									
										
										
										
											1997-05-06 16:15:32 +00:00
										 |  |  | 	"""Handle selection dialog, return list of selected items""" | 
					
						
							|  |  |  | 	d = Dlg.GetNewDialog(DIALOG_ID, -1) | 
					
						
							|  |  |  | 	d.SetDialogDefaultItem(I_OK) | 
					
						
							|  |  |  | 	d.SetDialogCancelItem(I_CANCEL) | 
					
						
							|  |  |  | 	results = [0]*N_BUTTONS | 
					
						
							|  |  |  | 	while 1: | 
					
						
							|  |  |  | 		n = Dlg.ModalDialog(None) | 
					
						
							|  |  |  | 		if n == I_OK: | 
					
						
							|  |  |  | 			break | 
					
						
							|  |  |  | 		if n == I_CANCEL: | 
					
						
							|  |  |  | 			return [] | 
					
						
							| 
									
										
										
										
											1997-09-09 13:57:15 +00:00
										 |  |  | 		if n == I_INC_BUILDNO: | 
					
						
							|  |  |  | 			incbuildno(filename) | 
					
						
							|  |  |  | 			continue | 
					
						
							| 
									
										
										
										
											1997-05-06 16:15:32 +00:00
										 |  |  | 		if n < len(results): | 
					
						
							|  |  |  | 			results[n] = (not results[n]) | 
					
						
							|  |  |  | 			tp, h, rect = d.GetDialogItem(n) | 
					
						
							|  |  |  | 			h.as_Control().SetControlValue(results[n]) | 
					
						
							|  |  |  | 	rv = [] | 
					
						
							|  |  |  | 	for i in range(len(results)): | 
					
						
							|  |  |  | 		if results[i]: | 
					
						
							|  |  |  | 			rv.append(i) | 
					
						
							|  |  |  | 	return rv | 
					
						
							| 
									
										
										
										
											1995-09-01 12:03:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # The build instructions. Entries are (routine, arg, list-of-files) | 
					
						
							|  |  |  | # XXXX We could also include the builds for stdwin and such here... | 
					
						
							| 
									
										
										
										
											1997-05-06 16:15:32 +00:00
										 |  |  | BUILD_DICT = { | 
					
						
							| 
									
										
										
										
											1997-08-27 14:10:29 +00:00
										 |  |  | I_CORE : (buildmwproject, "CWIE", [ | 
					
						
							| 
									
										
										
										
											1999-01-28 17:46:50 +00:00
										 |  |  | 		(":Mac:Build:PythonCore.prj", "PythonCore"), | 
					
						
							|  |  |  | 		(":Mac:Build:Python.prj", "PythonFAT"), | 
					
						
							|  |  |  | 		(":Mac:Build:PythonApplet.prj", "PythonAppletFAT"), | 
					
						
							| 
									
										
										
										
											1997-05-06 16:15:32 +00:00
										 |  |  | 	]), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | I_PPC_PLUGINS : (buildmwproject, "CWIE", [ | 
					
						
							| 
									
										
										
										
											1999-01-28 17:46:50 +00:00
										 |  |  | 		(":Mac:Build:PlugIns.prj",	"PlugIns.ppc"), | 
					
						
							| 
									
										
										
										
											1997-05-06 16:15:32 +00:00
										 |  |  | 	]), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | I_68K_PLUGINS : (buildmwproject, "CWIE", [ | 
					
						
							| 
									
										
										
										
											1999-01-28 17:46:50 +00:00
										 |  |  | 		(":Mac:Build:PlugIns.prj",	"PlugIns.CFM68K"), | 
					
						
							| 
									
										
										
										
											1997-05-06 16:15:32 +00:00
										 |  |  | 	]), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | I_68K_FULL : (buildmwproject, "CWIE", [ | 
					
						
							| 
									
										
										
										
											1999-01-28 17:46:50 +00:00
										 |  |  | 		(":Mac:Build:PythonStandalone.prj", "Python68K"), | 
					
						
							| 
									
										
										
										
											1997-05-06 16:15:32 +00:00
										 |  |  | 	]), | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | I_68K_SMALL : (buildmwproject, "CWIE", [ | 
					
						
							| 
									
										
										
										
											1999-01-28 17:46:50 +00:00
										 |  |  | 		(":Mac:Build:PythonStandSmall.prj", "PythonSmall68K"), | 
					
						
							| 
									
										
										
										
											1997-05-06 16:15:32 +00:00
										 |  |  | 	]), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | I_PPC_FULL : (buildmwproject, "CWIE", [ | 
					
						
							| 
									
										
										
										
											1999-01-28 17:46:50 +00:00
										 |  |  | 		(":Mac:Build:PythonStandalone.prj", "PythonStandalone"), | 
					
						
							| 
									
										
										
										
											1997-05-06 16:15:32 +00:00
										 |  |  | 	]), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | I_PPC_SMALL : (buildmwproject, "CWIE", [ | 
					
						
							| 
									
										
										
										
											1999-01-28 17:46:50 +00:00
										 |  |  | 		(":Mac:Build:PythonStandSmall.prj", "PythonStandSmall"), | 
					
						
							| 
									
										
										
										
											1997-05-06 16:15:32 +00:00
										 |  |  | 	]), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | I_PPC_EXTENSIONS : (buildmwproject, "CWIE", [ | 
					
						
							| 
									
										
										
										
											1997-08-27 14:10:29 +00:00
										 |  |  | 		(":Extensions:Imaging:_imaging.prj", "_imaging.ppc"), | 
					
						
							|  |  |  | 		(":Extensions:Imaging:_tkinter.prj", "_tkinter.ppc"), | 
					
						
							|  |  |  | 		(":Extensions:NumPy:numpymodules.prj", "numpymodules.ppc"), | 
					
						
							| 
									
										
										
										
											1997-05-06 16:15:32 +00:00
										 |  |  | 	]), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | I_68K_EXTENSIONS : (buildmwproject, "CWIE", [ | 
					
						
							| 
									
										
										
										
											1997-08-27 14:10:29 +00:00
										 |  |  | 		(":Extensions:Imaging:_imaging.prj", "_imaging.CFM68K"), | 
					
						
							|  |  |  | 		(":Extensions:Imaging:_tkinter.prj", "_tkinter.CFM68K"), | 
					
						
							|  |  |  | 		(":Extensions:NumPy:numpymodules.prj", "numpymodules.CFM68K"), | 
					
						
							| 
									
										
										
										
											1997-05-06 16:15:32 +00:00
										 |  |  | 	]), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | I_APPLETS : (buildapplet, None, [ | 
					
						
							| 
									
										
										
										
											1999-02-01 01:21:18 +00:00
										 |  |  | 		(":Mac:scripts:EditPythonPrefs.py", "EditPythonPrefs"), | 
					
						
							|  |  |  | 		(":Mac:scripts:BuildApplet.py", "BuildApplet"), | 
					
						
							|  |  |  | 		(":Mac:scripts:BuildApplication.py", "BuildApplication"), | 
					
						
							|  |  |  | 		(":Mac:scripts:ConfigurePython.py", "ConfigurePython"), | 
					
						
							|  |  |  | 		(":Mac:Tools:IDE:PythonIDE.py", "Python IDE"), | 
					
						
							| 
									
										
										
										
											1997-05-06 16:15:32 +00:00
										 |  |  | 	]), | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											1997-09-01 15:37:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def incbuildno(filename): | 
					
						
							|  |  |  | 	fp = open(filename) | 
					
						
							|  |  |  | 	line = fp.readline() | 
					
						
							|  |  |  | 	fp.close() | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	pat = regex.compile('#define BUILD \([0-9][0-9]*\)') | 
					
						
							|  |  |  | 	pat.match(line) | 
					
						
							|  |  |  | 	buildno = pat.group(1) | 
					
						
							|  |  |  | 	if not buildno: | 
					
						
							|  |  |  | 		raise 'Incorrect macbuildno.h line', line | 
					
						
							|  |  |  | 	new = string.atoi(buildno) + 1 | 
					
						
							|  |  |  | 	fp = open(filename, 'w') | 
					
						
							|  |  |  | 	fp.write('#define BUILD %d\n'%new) | 
					
						
							|  |  |  | 	fp.close() | 
					
						
							| 
									
										
										
										
											1995-09-01 12:03:32 +00:00
										 |  |  | 				 | 
					
						
							|  |  |  | def main(): | 
					
						
							| 
									
										
										
										
											1997-05-06 16:15:32 +00:00
										 |  |  | 	try: | 
					
						
							|  |  |  | 		h = Res.OpenResFile('fullbuild.rsrc') | 
					
						
							|  |  |  | 	except Res.Error: | 
					
						
							|  |  |  | 		pass	# Assume we already have acces to our own resource | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-09-01 12:03:32 +00:00
										 |  |  | 	dir, ok = macfs.GetDirectory('Python source folder:') | 
					
						
							|  |  |  | 	if not ok: | 
					
						
							|  |  |  | 		sys.exit(0) | 
					
						
							|  |  |  | 	dir = dir.as_pathname() | 
					
						
							| 
									
										
										
										
											1997-05-06 16:15:32 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											1997-09-09 13:57:15 +00:00
										 |  |  | 	todo = handle_dialog(os.path.join(dir, MACBUILDNO)) | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											1997-05-06 16:15:32 +00:00
										 |  |  | 	instructions = [] | 
					
						
							|  |  |  | 	for i in todo: | 
					
						
							|  |  |  | 		instructions.append(BUILD_DICT[i]) | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	for routine, arg, list in instructions: | 
					
						
							| 
									
										
										
										
											1997-05-07 15:52:12 +00:00
										 |  |  | 		routine(dir, arg, list) | 
					
						
							| 
									
										
										
										
											1997-05-06 16:15:32 +00:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											1995-09-01 12:03:32 +00:00
										 |  |  | 	print "All done!" | 
					
						
							|  |  |  | 	sys.exit(1)	 | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  | 	main() | 
					
						
							|  |  |  | 	 |