| #! /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() |