cpython/Mac/scripts/buildappbundle.py

105 lines
2.8 KiB
Python
Executable File

#! /usr/bin/env python
# XXX This will be replaced by a main program in Mac/Lib/bundlebuilder.py,
# but for now this is kept so Jack won't need to change his scripts...
"""\
buildappbundle creates an application bundle
Usage:
buildappbundle [options] executable
Options:
--output o Output file; default executable with .app appended, short -o
--link Symlink the executable instead of copying it, short -l
--plist file Plist file (default: generate one), short -p
--nib file Main nib file or lproj folder for Cocoa program, short -n
--resource r Extra resource file to be copied to Resources, short -r
--creator c 4-char creator code (default: '????'), short -c
--verbose increase verbosity level (default: quiet), short -v
--help This message, short -? or -h
"""
import sys
import os
import getopt
from bundlebuilder import AppBuilder
from plistlib import Plist
def usage():
print __doc__
sys.exit(1)
def main():
output = None
symlink = 0
creator = "????"
plist = None
nib = None
resources = []
verbosity = 0
SHORTOPTS = "o:ln:r:p:c:v?h"
LONGOPTS=("output=", "link", "nib=", "resource=", "plist=", "creator=", "help",
"verbose")
try:
options, args = getopt.getopt(sys.argv[1:], SHORTOPTS, LONGOPTS)
except getopt.error:
usage()
if len(args) != 1:
usage()
executable = args[0]
for opt, arg in options:
if opt in ('-o', '--output'):
output = arg
elif opt in ('-l', '--link'):
symlink = 1
elif opt in ('-n', '--nib'):
nib = arg
elif opt in ('-r', '--resource'):
resources.append(arg)
elif opt in ('-c', '--creator'):
creator = arg
elif opt in ('-p', '--plist'):
plist = arg
elif opt in ('-v', '--verbose'):
verbosity += 1
elif opt in ('-?', '-h', '--help'):
usage()
if output is not None:
builddir, bundlename = os.path.split(output)
else:
builddir = os.curdir
bundlename = None # will be derived from executable
if plist is not None:
plist = Plist.fromFile(plist)
builder = AppBuilder(name=bundlename, executable=executable,
builddir=builddir, creator=creator, plist=plist, resources=resources,
symlink_exec=symlink, verbosity=verbosity)
if nib is not None:
resources.append(nib)
nibname, ext = os.path.splitext(os.path.basename(nib))
if ext == '.lproj':
# Special case: if the main nib is a .lproj we assum a directory
# and use the first nib from there. XXX Look: an arbitrary pick ;-)
files = os.listdir(nib)
for f in files:
if f[-4:] == '.nib':
nibname = os.path.split(f)[1][:-4]
break
else:
nibname = ""
if nibname:
builder.plist.NSMainNibFile = nibname
if not hasattr(builder.plist, "NSPrincipalClass"):
builder.plist.NSPrincipalClass = "NSApplication"
builder.setup()
builder.build()
if __name__ == '__main__':
main()