1995-07-29 10:48:41 -03:00
|
|
|
"""Create an applet 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 and then adding a 'PYC '
|
|
|
|
resource named __main__ containing the compiled, marshalled script.
|
|
|
|
"""
|
|
|
|
|
1995-09-01 08:54:11 -03:00
|
|
|
|
1995-07-29 10:48:41 -03:00
|
|
|
import sys
|
|
|
|
sys.stdout = sys.stderr
|
|
|
|
|
|
|
|
import os
|
|
|
|
import MacOS
|
2009-09-06 07:00:26 -03:00
|
|
|
try:
|
|
|
|
import EasyDialogs
|
|
|
|
except ImportError:
|
|
|
|
EasyDialogs = None
|
1998-07-31 06:44:23 -03:00
|
|
|
import buildtools
|
2002-06-09 19:08:52 -03:00
|
|
|
import getopt
|
1995-07-29 10:48:41 -03:00
|
|
|
|
2006-06-07 17:18:44 -03:00
|
|
|
if not sys.executable.startswith(sys.exec_prefix):
|
|
|
|
# Oh, the joys of using a python script to bootstrap applicatin bundles
|
|
|
|
# sys.executable points inside the current application bundle. Because this
|
|
|
|
# path contains blanks (two of them actually) this path isn't usable on
|
|
|
|
# #! lines. Reset sys.executable to point to the embedded python interpreter
|
2006-06-07 17:40:06 -03:00
|
|
|
sys.executable = os.path.join(sys.prefix,
|
2006-06-07 17:18:44 -03:00
|
|
|
'Resources/Python.app/Contents/MacOS/Python')
|
|
|
|
|
|
|
|
# Just in case we're not in a framework:
|
|
|
|
if not os.path.exists(sys.executable):
|
|
|
|
sys.executable = os.path.join(sys.exec_prefix, 'bin/python')
|
|
|
|
|
1998-07-31 06:44:23 -03:00
|
|
|
def main():
|
2004-07-18 03:16:08 -03:00
|
|
|
try:
|
|
|
|
buildapplet()
|
|
|
|
except buildtools.BuildError, detail:
|
2009-09-06 07:00:26 -03:00
|
|
|
if EasyDialogs is None:
|
|
|
|
print detail
|
|
|
|
else:
|
|
|
|
EasyDialogs.Message(detail)
|
1995-07-29 10:48:41 -03:00
|
|
|
|
1995-09-01 08:54:11 -03:00
|
|
|
|
1998-07-31 06:44:23 -03:00
|
|
|
def buildapplet():
|
2004-07-18 03:16:08 -03:00
|
|
|
buildtools.DEBUG=1
|
|
|
|
|
|
|
|
# Find the template
|
|
|
|
# (there's no point in proceeding if we can't find it)
|
|
|
|
|
|
|
|
template = buildtools.findtemplate()
|
|
|
|
|
|
|
|
# Ask for source text if not specified in sys.argv[1:]
|
|
|
|
|
|
|
|
if not sys.argv[1:]:
|
2009-09-06 07:00:26 -03:00
|
|
|
if EasyDialogs is None:
|
|
|
|
usage()
|
|
|
|
sys.exit(1)
|
|
|
|
|
2004-07-18 03:16:08 -03:00
|
|
|
filename = EasyDialogs.AskFileForOpen(message='Select Python source or applet:',
|
|
|
|
typeList=('TEXT', 'APPL'))
|
|
|
|
if not filename:
|
|
|
|
return
|
|
|
|
tp, tf = os.path.split(filename)
|
|
|
|
if tf[-3:] == '.py':
|
|
|
|
tf = tf[:-3]
|
|
|
|
else:
|
|
|
|
tf = tf + '.applet'
|
|
|
|
dstfilename = EasyDialogs.AskFileForSave(message='Save application as:',
|
|
|
|
savedFileName=tf)
|
|
|
|
if not dstfilename: return
|
|
|
|
cr, tp = MacOS.GetCreatorAndType(filename)
|
|
|
|
if tp == 'APPL':
|
|
|
|
buildtools.update(template, filename, dstfilename)
|
|
|
|
else:
|
|
|
|
buildtools.process(template, filename, dstfilename, 1)
|
|
|
|
else:
|
|
|
|
|
2004-12-27 11:51:03 -04:00
|
|
|
SHORTOPTS = "o:r:ne:v?PR"
|
|
|
|
LONGOPTS=("output=", "resource=", "noargv", "extra=", "verbose", "help", "python=", "destroot=")
|
2004-07-18 03:16:08 -03:00
|
|
|
try:
|
|
|
|
options, args = getopt.getopt(sys.argv[1:], SHORTOPTS, LONGOPTS)
|
|
|
|
except getopt.error:
|
|
|
|
usage()
|
|
|
|
if options and len(args) > 1:
|
|
|
|
sys.stderr.write("Cannot use options when specifying multiple input files")
|
|
|
|
sys.exit(1)
|
|
|
|
dstfilename = None
|
|
|
|
rsrcfilename = None
|
|
|
|
raw = 0
|
|
|
|
extras = []
|
|
|
|
verbose = None
|
2004-12-27 11:51:03 -04:00
|
|
|
destroot = ''
|
2004-07-18 03:16:08 -03:00
|
|
|
for opt, arg in options:
|
|
|
|
if opt in ('-o', '--output'):
|
|
|
|
dstfilename = arg
|
|
|
|
elif opt in ('-r', '--resource'):
|
|
|
|
rsrcfilename = arg
|
|
|
|
elif opt in ('-n', '--noargv'):
|
|
|
|
raw = 1
|
|
|
|
elif opt in ('-e', '--extra'):
|
|
|
|
if ':' in arg:
|
|
|
|
arg = arg.split(':')
|
|
|
|
extras.append(arg)
|
|
|
|
elif opt in ('-P', '--python'):
|
|
|
|
# This is a very dirty trick. We set sys.executable
|
|
|
|
# so that bundlebuilder will use this in the #! line
|
|
|
|
# for the applet bootstrap.
|
|
|
|
sys.executable = arg
|
|
|
|
elif opt in ('-v', '--verbose'):
|
|
|
|
verbose = Verbose()
|
|
|
|
elif opt in ('-?', '--help'):
|
|
|
|
usage()
|
2004-12-27 11:51:03 -04:00
|
|
|
elif opt in ('-d', '--destroot'):
|
|
|
|
destroot = arg
|
2004-07-18 03:16:08 -03:00
|
|
|
# Loop over all files to be processed
|
|
|
|
for filename in args:
|
|
|
|
cr, tp = MacOS.GetCreatorAndType(filename)
|
|
|
|
if tp == 'APPL':
|
|
|
|
buildtools.update(template, filename, dstfilename)
|
|
|
|
else:
|
|
|
|
buildtools.process(template, filename, dstfilename, 1,
|
2004-12-27 11:51:03 -04:00
|
|
|
rsrcname=rsrcfilename, others=extras, raw=raw,
|
|
|
|
progress=verbose, destroot=destroot)
|
2002-06-09 19:08:52 -03:00
|
|
|
|
|
|
|
def usage():
|
2004-07-18 03:16:08 -03:00
|
|
|
print "BuildApplet creates an application from a Python source file"
|
|
|
|
print "Usage:"
|
|
|
|
print " BuildApplet interactive, single file, no options"
|
|
|
|
print " BuildApplet src1.py src2.py ... non-interactive multiple file"
|
|
|
|
print " BuildApplet [options] src.py non-interactive single file"
|
|
|
|
print "Options:"
|
|
|
|
print " --output o Output file; default based on source filename, short -o"
|
|
|
|
print " --resource r Resource file; default based on source filename, short -r"
|
|
|
|
print " --noargv Build applet without drag-and-drop sys.argv emulation, short -n, OSX only"
|
|
|
|
print " --extra src[:dst] Extra file to put in .app bundle, short -e, OSX only"
|
|
|
|
print " --verbose Verbose, short -v"
|
|
|
|
print " --help This message, short -?"
|
|
|
|
sys.exit(1)
|
1995-07-29 10:48:41 -03:00
|
|
|
|
2002-06-09 19:08:52 -03:00
|
|
|
class Verbose:
|
2004-07-18 03:16:08 -03:00
|
|
|
"""This class mimics EasyDialogs.ProgressBar but prints to stderr"""
|
|
|
|
def __init__(self, *args):
|
|
|
|
if args and args[0]:
|
|
|
|
self.label(args[0])
|
|
|
|
|
|
|
|
def set(self, *args):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def inc(self, *args):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def label(self, str):
|
|
|
|
sys.stderr.write(str+'\n')
|
1995-07-29 10:48:41 -03:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
2004-07-18 03:16:08 -03:00
|
|
|
main()
|