summaryrefslogtreecommitdiffstats
path: root/Mac/scripts/BuildApplication.py
diff options
context:
space:
mode:
Diffstat (limited to 'Mac/scripts/BuildApplication.py')
-rw-r--r--Mac/scripts/BuildApplication.py145
1 files changed, 145 insertions, 0 deletions
diff --git a/Mac/scripts/BuildApplication.py b/Mac/scripts/BuildApplication.py
new file mode 100644
index 0000000..957bf6c
--- /dev/null
+++ b/Mac/scripts/BuildApplication.py
@@ -0,0 +1,145 @@
+"""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
+modules wirrten in Python and the main script itself, as __main__.
+"""
+
+
+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 macmodulefinder
+import macgen_bin
+
+# dialog, items
+DLG_ID = 400
+OK_BUTTON = 1
+CANCEL_BUTTON = 2
+GENFAT_BUTTON = 4
+GENPPC_BUTTON = 5
+GEN68K_BUTTON = 6
+
+
+try:
+ Res.GetResource('DITL', DLG_ID)
+except Res.Error:
+ Res.OpenResFile("BuildApplication.rsrc")
+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]
+ logfile = tf[:-3] + '.log'
+ else:
+ tf = tf + '.app'
+ logfile = tf + '.log'
+
+ 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:
+ tp, h, rect = dlg.GetDialogItem(item)
+ self.items[item] = h.as_Control()
+
+ 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):
+ 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()