| 
									
										
										
										
											1998-07-31 09:44:58 +00:00
										 |  |  | """Create a standalone application from a Python script.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This puts up a dialog asking for a Python source file ('TEXT'). | 
					
						
							|  |  |  | The output is a file with the same name but its ".py" suffix dropped. | 
					
						
							|  |  |  | It is created by copying an applet template, all used shared libs and  | 
					
						
							|  |  |  | then adding 'PYC ' resources containing compiled versions of all used  | 
					
						
							| 
									
										
										
										
											1999-11-04 10:30:13 +00:00
										 |  |  | modules written in Python and the main script itself, as __main__. | 
					
						
							| 
									
										
										
										
											1998-07-31 09:44:58 +00:00
										 |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import string | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | import macfs | 
					
						
							|  |  |  | import MacOS | 
					
						
							|  |  |  | import Res | 
					
						
							|  |  |  | import Dlg | 
					
						
							|  |  |  | import EasyDialogs | 
					
						
							|  |  |  | import buildtools | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Hmmm... | 
					
						
							|  |  |  | MACFREEZEPATH = os.path.join(sys.prefix, ":Mac:Tools:macfreeze") | 
					
						
							|  |  |  | if MACFREEZEPATH not in sys.path: | 
					
						
							|  |  |  | 	sys.path.append(MACFREEZEPATH) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import macgen_bin | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # dialog, items | 
					
						
							|  |  |  | DLG_ID = 400 | 
					
						
							|  |  |  | OK_BUTTON = 1 | 
					
						
							|  |  |  | CANCEL_BUTTON = 2 | 
					
						
							|  |  |  | GENFAT_BUTTON = 4 | 
					
						
							|  |  |  | GENPPC_BUTTON = 5 | 
					
						
							|  |  |  | GEN68K_BUTTON = 6 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-24 19:44:17 +00:00
										 |  |  | # Define this if we cannot generate 68/fat binaries (Python 1.6) | 
					
						
							|  |  |  | PPC_ONLY=1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-07-31 09:44:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  | 	Res.GetResource('DITL', DLG_ID) | 
					
						
							|  |  |  | except Res.Error: | 
					
						
							| 
									
										
										
										
											2000-06-20 21:59:25 +00:00
										 |  |  | 	Res.FSpOpenResFile("BuildApplication.rsrc", 1) | 
					
						
							| 
									
										
										
										
											1998-07-31 09:44:58 +00:00
										 |  |  | else: | 
					
						
							|  |  |  | 	pass # we're an applet | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def main(): | 
					
						
							|  |  |  | 	try: | 
					
						
							|  |  |  | 		buildapplication() | 
					
						
							|  |  |  | 	except buildtools.BuildError, detail: | 
					
						
							|  |  |  | 		EasyDialogs.Message(detail) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def buildapplication(debug = 0): | 
					
						
							|  |  |  | 	buildtools.DEBUG = debug | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	# Ask for source text if not specified in sys.argv[1:] | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if not sys.argv[1:]: | 
					
						
							|  |  |  | 		srcfss, ok = macfs.PromptGetFile('Select Python source:', 'TEXT') | 
					
						
							|  |  |  | 		if not ok: | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		filename = srcfss.as_pathname() | 
					
						
							|  |  |  | 	else: | 
					
						
							|  |  |  | 		if sys.argv[2:]: | 
					
						
							|  |  |  | 			raise buildtools.BuildError, "please select one file at a time" | 
					
						
							|  |  |  | 		filename = sys.argv[1] | 
					
						
							|  |  |  | 	tp, tf = os.path.split(filename) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	# interact with user | 
					
						
							|  |  |  | 	architecture, ok = interact(tf) | 
					
						
							|  |  |  | 	if not ok: | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	if tf[-3:] == '.py': | 
					
						
							|  |  |  | 		tf = tf[:-3] | 
					
						
							|  |  |  | 	else: | 
					
						
							|  |  |  | 		tf = tf + '.app' | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	dstfss, ok = macfs.StandardPutFile('Save application as:', tf) | 
					
						
							|  |  |  | 	if not ok: | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	dstfilename = dstfss.as_pathname() | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	macgen_bin.generate(filename, dstfilename, None, architecture, 1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class radio: | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def __init__(self, dlg, *items): | 
					
						
							|  |  |  | 		self.items = {} | 
					
						
							|  |  |  | 		for item in items: | 
					
						
							| 
									
										
										
										
											1999-12-23 14:33:20 +00:00
										 |  |  | 			ctl = dlg.GetDialogItemAsControl(item) | 
					
						
							|  |  |  | 			self.items[item] = ctl | 
					
						
							| 
									
										
										
										
											1998-07-31 09:44:58 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def set(self, setitem): | 
					
						
							|  |  |  | 		for item, ctl in self.items.items(): | 
					
						
							|  |  |  | 			if item == setitem: | 
					
						
							|  |  |  | 				ctl.SetControlValue(1) | 
					
						
							|  |  |  | 			else: | 
					
						
							|  |  |  | 				ctl.SetControlValue(0) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def get(self): | 
					
						
							|  |  |  | 		for item, ctl in self.items.items(): | 
					
						
							|  |  |  | 			if ctl.GetControlValue(): | 
					
						
							|  |  |  | 				return item | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def hasitem(self, item): | 
					
						
							|  |  |  | 		return self.items.has_key(item) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def interact(scriptname): | 
					
						
							| 
									
										
										
										
											2000-07-24 19:44:17 +00:00
										 |  |  | 	if PPC_ONLY: | 
					
						
							|  |  |  | 		return 'pwpc' | 
					
						
							| 
									
										
										
										
											1998-07-31 09:44:58 +00:00
										 |  |  | 	d = Dlg.GetNewDialog(DLG_ID, -1) | 
					
						
							|  |  |  | 	if not d: | 
					
						
							|  |  |  | 		print "Can't get DLOG resource with id =", DLG_ID | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	d.SetDialogDefaultItem(OK_BUTTON) | 
					
						
							|  |  |  | 	d.SetDialogCancelItem(CANCEL_BUTTON) | 
					
						
							|  |  |  | 	Dlg.ParamText(scriptname, "", "", "") | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	radiogroup = radio(d, GENFAT_BUTTON, GENPPC_BUTTON, GEN68K_BUTTON) | 
					
						
							|  |  |  | 	radiogroup.set(GENFAT_BUTTON) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	gentype = 'fat' | 
					
						
							|  |  |  | 	while 1: | 
					
						
							|  |  |  | 		n = Dlg.ModalDialog(None) | 
					
						
							|  |  |  | 		if n == OK_BUTTON or n == CANCEL_BUTTON: | 
					
						
							|  |  |  | 			break | 
					
						
							|  |  |  | 		elif radiogroup.hasitem(n): | 
					
						
							|  |  |  | 			radiogroup.set(n) | 
					
						
							|  |  |  | 	genitem = radiogroup.get() | 
					
						
							|  |  |  | 	del radiogroup | 
					
						
							|  |  |  | 	del d | 
					
						
							|  |  |  | 	if genitem == GENFAT_BUTTON: | 
					
						
							|  |  |  | 		gentype = 'fat' | 
					
						
							|  |  |  | 	elif genitem == GENPPC_BUTTON: | 
					
						
							|  |  |  | 		gentype = 'pwpc' | 
					
						
							|  |  |  | 	elif genitem == GEN68K_BUTTON: | 
					
						
							|  |  |  | 		gentype = 'm68k' | 
					
						
							|  |  |  | 	return gentype, n == OK_BUTTON | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  | 	main() |