summaryrefslogtreecommitdiffstats
path: root/Mac
diff options
context:
space:
mode:
authorJack Jansen <jack.jansen@cwi.nl>2002-11-06 23:15:51 (GMT)
committerJack Jansen <jack.jansen@cwi.nl>2002-11-06 23:15:51 (GMT)
commit65fe8dda1588017bb5f15c8ab2fdbfb3b3c0bac7 (patch)
tree65e38ecf80a46b5dd60a33e06e771f5b2d7c54f9 /Mac
parentdc46175dc35d47df87e2955fec899cf471d3135f (diff)
downloadcpython-65fe8dda1588017bb5f15c8ab2fdbfb3b3c0bac7.zip
cpython-65fe8dda1588017bb5f15c8ab2fdbfb3b3c0bac7.tar.gz
cpython-65fe8dda1588017bb5f15c8ab2fdbfb3b3c0bac7.tar.bz2
Script to create .app bundles. Largely untested.
Diffstat (limited to 'Mac')
-rwxr-xr-xMac/scripts/buildappbundle.py160
1 files changed, 160 insertions, 0 deletions
diff --git a/Mac/scripts/buildappbundle.py b/Mac/scripts/buildappbundle.py
new file mode 100755
index 0000000..93ef14b
--- /dev/null
+++ b/Mac/scripts/buildappbundle.py
@@ -0,0 +1,160 @@
+import sys
+import os
+import shutil
+import getopt
+
+def buildappbundle(executable, output=None, copyfunc=None, creator=None,
+ plist=None, nib=None, resources=None):
+ if not output:
+ output = os.path.split(executable)[1] + '.app'
+ if not copyfunc:
+ copyfunc = shutil.copy2
+ if not creator:
+ creator='????'
+ if not resources:
+ resources = []
+ if nib:
+ resources = resources + [nib]
+ #
+ # Create the main directory structure
+ #
+ if not os.path.isdir(output):
+ os.mkdir(output)
+ contents = os.path.join(output, 'Contents')
+ if not os.path.isdir(contents):
+ os.mkdir(contents)
+ macos = os.path.join(contents, 'MacOS')
+ if not os.path.isdir(macos):
+ os.mkdir(macos)
+ #
+ # Create the executable
+ #
+ shortname = os.path.split(executable)[1]
+ execname = os.path.join(macos, shortname)
+ try:
+ os.remove(execname)
+ except OSError:
+ pass
+ copyfunc(executable, execname)
+ #
+ # Create the PkgInfo file
+ #
+ pkginfo = os.path.join(contents, 'PkgInfo')
+ open(pkginfo, 'wb').write('APPL'+creator)
+ if plist:
+ # A plist file is specified. Read it.
+ plistdata = open(plist).read()
+ else:
+ #
+ # If we have a main NIB we create the extra Cocoa specific info for the plist file
+ #
+ if not nib:
+ nibname = ""
+ else:
+ nibname, ext = os.path.splitext(os.path.split(nib)[1])
+ if ext == '.lproj':
+ # Special case: if the main nib is a .lproj we assum a directory
+ # and use the first nib from there
+ files = os.listdir(nib)
+ for f in files:
+ if f[-4:] == '.nib':
+ nibname = os.path.split(f)[1][:-4]
+ break
+ else:
+ nibname = ""
+ if nibname:
+ cocoainfo = """
+ <key>NSMainNibFile</key>
+ <string>%s</string>
+ <key>NSPrincipalClass</key>
+ <string>NSApplication</string>""" % nibname
+ else:
+ cocoainfo = ""
+ plistdata = \
+"""<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
+<plist version="0.9">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>%s</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleSignature</key>
+ <string>%s</string>
+ <key>CFBundleVersion</key>
+ <string>0.1</string>
+ %s
+</dict>
+</plist>
+""" % (shortname, creator, cocoainfo)
+ #
+ # Next, we create the plist file
+ #
+ infoplist = os.path.join(contents, 'Info.plist')
+ open(infoplist, 'w').write(plistdata)
+ #
+ # Finally, if there are nibs or other resources to copy we do so.
+ #
+ if resources:
+ resdir = os.path.join(contents, 'Resources')
+ for src in resources:
+ dst = os.path.join(resdir, os.path.split(src)[1])
+ if os.path.isdir(src):
+ shutil.copytree(src, dst)
+ else:
+ shutil.copy2(src, dst)
+
+def usage():
+ print "buildappbundle creates an application bundle"
+ print "Usage:"
+ print " buildappbundle [options] executable"
+ print "Options:"
+ print " --output o Output file; default executable with .app appended, short -o"
+ print " --link Symlink the executable (default: copy), short -l"
+ print " --plist file Plist file (default: generate one), short -p"
+ print " --nib file Main nib file or lproj folder for Cocoa program, short -n"
+ print " --resource r Extra resource file to be copied to Resources, short -r"
+ print " --creator c 4-char creator code (default: ????), short -c"
+ print " --help This message, short -?"
+ sys.exit(1)
+
+def main():
+ output=None
+ copyfunc=None
+ creator=None
+ plist=None
+ nib=None
+ resources=[]
+ SHORTOPTS = "o:ln:r:p:c:?"
+ LONGOPTS=("output=", "link", "nib=", "resource=", "plist=", "creator=", "help")
+ try:
+ options, args = getopt.getopt(sys.argv[1:], SHORTOPTS, LONGOPTS)
+ except getopt.error:
+ usage()
+ if len(args) != 1:
+ usage()
+ for opt, arg in options:
+ if opt in ('-o', '--output'):
+ output = arg
+ elif opt in ('-l', '--link'):
+ copyfunc = os.symlink
+ 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 ('-?', '--help'):
+ usage()
+ buildappbundle(args[0], output=output, copyfunc=copyfunc, creator=creator,
+ plist=plist, resources=resources)
+
+if __name__ == '__main__':
+ main()
+ \ No newline at end of file