Move setting of ioready 'wait' earlier in call chain, to
[python/dscho.git] / Mac / scripts / BuildApplet.py
blob64a3d5eb95b8428e73f53c77fe4b4340b28f8383
1 """Create an applet from a Python script.
3 This puts up a dialog asking for a Python source file ('TEXT').
4 The output is a file with the same name but its ".py" suffix dropped.
5 It is created by copying an applet template and then adding a 'PYC '
6 resource named __main__ containing the compiled, marshalled script.
7 """
10 import sys
11 sys.stdout = sys.stderr
13 import os
14 import MacOS
15 import EasyDialogs
16 import buildtools
17 import getopt
19 def main():
20 try:
21 buildapplet()
22 except buildtools.BuildError, detail:
23 EasyDialogs.Message(detail)
26 def buildapplet():
27 buildtools.DEBUG=1
29 # Find the template
30 # (there's no point in proceeding if we can't find it)
32 template = buildtools.findtemplate()
34 # Ask for source text if not specified in sys.argv[1:]
36 if not sys.argv[1:]:
37 filename = EasyDialogs.AskFileForOpen(message='Select Python source or applet:',
38 typeList=('TEXT', 'APPL'))
39 if not filename:
40 return
41 tp, tf = os.path.split(filename)
42 if tf[-3:] == '.py':
43 tf = tf[:-3]
44 else:
45 tf = tf + '.applet'
46 dstfilename = EasyDialogs.AskFileForSave(message='Save application as:',
47 savedFileName=tf)
48 if not dstfilename: return
49 cr, tp = MacOS.GetCreatorAndType(filename)
50 if tp == 'APPL':
51 buildtools.update(template, filename, dstfilename)
52 else:
53 buildtools.process(template, filename, dstfilename, 1)
54 else:
56 SHORTOPTS = "o:r:ne:v?"
57 LONGOPTS=("output=", "resource=", "noargv", "extra=", "verbose", "help")
58 try:
59 options, args = getopt.getopt(sys.argv[1:], SHORTOPTS, LONGOPTS)
60 except getopt.error:
61 usage()
62 if options and len(args) > 1:
63 sys.stderr.write("Cannot use options when specifying multiple input files")
64 sys.exit(1)
65 dstfilename = None
66 rsrcfilename = None
67 raw = 0
68 extras = []
69 verbose = None
70 for opt, arg in options:
71 if opt in ('-o', '--output'):
72 dstfilename = arg
73 elif opt in ('-r', '--resource'):
74 rsrcfilename = arg
75 elif opt in ('-n', '--noargv'):
76 raw = 1
77 elif opt in ('-e', '--extra'):
78 if ':' in arg:
79 arg = arg.split(':')
80 extras.append(arg)
81 elif opt in ('-v', '--verbose'):
82 verbose = Verbose()
83 elif opt in ('-?', '--help'):
84 usage()
85 # On OS9 always be verbose
86 if sys.platform == 'mac' and not verbose:
87 verbose = 'default'
88 # Loop over all files to be processed
89 for filename in args:
90 cr, tp = MacOS.GetCreatorAndType(filename)
91 if tp == 'APPL':
92 buildtools.update(template, filename, dstfilename)
93 else:
94 buildtools.process(template, filename, dstfilename, 1,
95 rsrcname=rsrcfilename, others=extras, raw=raw, progress=verbose)
97 def usage():
98 print "BuildApplet creates an application from a Python source file"
99 print "Usage:"
100 print " BuildApplet interactive, single file, no options"
101 print " BuildApplet src1.py src2.py ... non-interactive multiple file"
102 print " BuildApplet [options] src.py non-interactive single file"
103 print "Options:"
104 print " --output o Output file; default based on source filename, short -o"
105 print " --resource r Resource file; default based on source filename, short -r"
106 print " --noargv Build applet without drag-and-drop sys.argv emulation, short -n, OSX only"
107 print " --extra src[:dst] Extra file to put in .app bundle, short -e, OSX only"
108 print " --verbose Verbose, short -v"
109 print " --help This message, short -?"
110 sys.exit(1)
112 class Verbose:
113 """This class mimics EasyDialogs.ProgressBar but prints to stderr"""
114 def __init__(self, *args):
115 if args and args[0]:
116 self.label(args[0])
118 def set(self, *args):
119 pass
121 def inc(self, *args):
122 pass
124 def label(self, str):
125 sys.stderr.write(str+'\n')
127 if __name__ == '__main__':
128 main()