blob: 281c6fea6dd79fd67bf90ec5f339284d21612ba7 [file] [log] [blame]
Just van Rossum224405f2002-11-22 11:10:49 +00001#! /usr/bin/env python
2
3# XXX This will be replaced by a main program in Mac/Lib/bundlebuilder.py,
4# but for now this is kept so Jack won't need to change his scripts...
5
6
7"""\
8buildappbundle creates an application bundle
9Usage:
10 buildappbundle [options] executable
11Options:
12 --output o Output file; default executable with .app appended, short -o
Just van Rossume6de56e2002-11-22 11:45:42 +000013 --link Symlink the executable instead of copying it, short -l
Just van Rossum224405f2002-11-22 11:10:49 +000014 --plist file Plist file (default: generate one), short -p
15 --nib file Main nib file or lproj folder for Cocoa program, short -n
16 --resource r Extra resource file to be copied to Resources, short -r
17 --creator c 4-char creator code (default: '????'), short -c
18 --verbose increase verbosity level (default: quiet), short -v
19 --help This message, short -? or -h
20"""
21
22
Jack Jansen65fe8dd2002-11-06 23:15:51 +000023import sys
24import os
Jack Jansen65fe8dd2002-11-06 23:15:51 +000025import getopt
Just van Rossum224405f2002-11-22 11:10:49 +000026from bundlebuilder import AppBuilder
27from plistlib import Plist
Jack Jansen65fe8dd2002-11-06 23:15:51 +000028
Just van Rossum224405f2002-11-22 11:10:49 +000029
Jack Jansen65fe8dd2002-11-06 23:15:51 +000030def usage():
Just van Rossum224405f2002-11-22 11:10:49 +000031 print __doc__
Jack Jansen65fe8dd2002-11-06 23:15:51 +000032 sys.exit(1)
33
Just van Rossum224405f2002-11-22 11:10:49 +000034
Jack Jansen65fe8dd2002-11-06 23:15:51 +000035def main():
Just van Rossum224405f2002-11-22 11:10:49 +000036 output = None
37 symlink = 0
38 creator = "????"
39 plist = None
40 nib = None
41 resources = []
42 verbosity = 0
43 SHORTOPTS = "o:ln:r:p:c:v?h"
44 LONGOPTS=("output=", "link", "nib=", "resource=", "plist=", "creator=", "help",
45 "verbose")
Jack Jansen65fe8dd2002-11-06 23:15:51 +000046 try:
47 options, args = getopt.getopt(sys.argv[1:], SHORTOPTS, LONGOPTS)
48 except getopt.error:
49 usage()
50 if len(args) != 1:
51 usage()
Just van Rossum224405f2002-11-22 11:10:49 +000052 executable = args[0]
Jack Jansen65fe8dd2002-11-06 23:15:51 +000053 for opt, arg in options:
54 if opt in ('-o', '--output'):
55 output = arg
56 elif opt in ('-l', '--link'):
Just van Rossum224405f2002-11-22 11:10:49 +000057 symlink = 1
Jack Jansen65fe8dd2002-11-06 23:15:51 +000058 elif opt in ('-n', '--nib'):
59 nib = arg
60 elif opt in ('-r', '--resource'):
61 resources.append(arg)
62 elif opt in ('-c', '--creator'):
63 creator = arg
64 elif opt in ('-p', '--plist'):
65 plist = arg
Just van Rossum224405f2002-11-22 11:10:49 +000066 elif opt in ('-v', '--verbose'):
67 verbosity += 1
68 elif opt in ('-?', '-h', '--help'):
Jack Jansen65fe8dd2002-11-06 23:15:51 +000069 usage()
Just van Rossum224405f2002-11-22 11:10:49 +000070 if output is not None:
71 builddir, bundlename = os.path.split(output)
72 else:
73 builddir = os.curdir
74 bundlename = None # will be derived from executable
75 if plist is not None:
76 plist = Plist.fromFile(plist)
77
78 builder = AppBuilder(name=bundlename, executable=executable,
79 builddir=builddir, creator=creator, plist=plist, resources=resources,
Just van Rossume6de56e2002-11-22 11:45:42 +000080 symlink_exec=symlink, verbosity=verbosity)
Just van Rossum224405f2002-11-22 11:10:49 +000081
82 if nib is not None:
83 resources.append(nib)
84 nibname, ext = os.path.splitext(os.path.basename(nib))
85 if ext == '.lproj':
86 # Special case: if the main nib is a .lproj we assum a directory
87 # and use the first nib from there. XXX Look: an arbitrary pick ;-)
88 files = os.listdir(nib)
89 for f in files:
90 if f[-4:] == '.nib':
91 nibname = os.path.split(f)[1][:-4]
92 break
93 else:
94 nibname = ""
95 if nibname:
96 builder.plist.NSMainNibFile = nibname
97 if not hasattr(builder.plist, "NSPrincipalClass"):
98 builder.plist.NSPrincipalClass = "NSApplication"
99 builder.setup()
100 builder.build()
101
102
Jack Jansen65fe8dd2002-11-06 23:15:51 +0000103if __name__ == '__main__':
104 main()