annotate Mac/Tools/bundlebuilder.py @ 70817:dd775b1561ba

Fix markup.
author Georg Brandl <georg@python.org>
date Tue, 14 Jun 2011 21:09:55 +0200
parents d06a3ebf306f
children ffc6e6b00949
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
50381
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1 #! /usr/bin/env python
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
2
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
3 """\
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
4 bundlebuilder.py -- Tools to assemble MacOS X (application) bundles.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
5
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
6 This module contains two classes to build so called "bundles" for
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
7 MacOS X. BundleBuilder is a general tool, AppBuilder is a subclass
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
8 specialized in building application bundles.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
9
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
10 [Bundle|App]Builder objects are instantiated with a bunch of keyword
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
11 arguments, and have a build() method that will do all the work. See
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
12 the class doc strings for a description of the constructor arguments.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
13
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
14 The module contains a main program that can be used in two ways:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
15
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
16 % python bundlebuilder.py [options] build
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
17 % python buildapp.py [options] build
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
18
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
19 Where "buildapp.py" is a user-supplied setup.py-like script following
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
20 this model:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
21
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
22 from bundlebuilder import buildapp
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
23 buildapp(<lots-of-keyword-args>)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
24
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
25 """
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
26
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
27
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
28 __all__ = ["BundleBuilder", "BundleBuilderError", "AppBuilder", "buildapp"]
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
29
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
30
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
31 import sys
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
32 import os, errno, shutil
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
33 import imp, marshal
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
34 import re
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
35 from copy import deepcopy
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
36 import getopt
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
37 from plistlib import Plist
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
38 from types import FunctionType as function
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
39
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
40 class BundleBuilderError(Exception): pass
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
41
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
42
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
43 class Defaults:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
44
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
45 """Class attributes that don't start with an underscore and are
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
46 not functions or classmethods are (deep)copied to self.__dict__.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
47 This allows for mutable default values.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
48 """
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
49
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
50 def __init__(self, **kwargs):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
51 defaults = self._getDefaults()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
52 defaults.update(kwargs)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
53 self.__dict__.update(defaults)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
54
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
55 def _getDefaults(cls):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
56 defaults = {}
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
57 for base in cls.__bases__:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
58 if hasattr(base, "_getDefaults"):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
59 defaults.update(base._getDefaults())
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
60 for name, value in list(cls.__dict__.items()):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
61 if name[0] != "_" and not isinstance(value,
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
62 (function, classmethod)):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
63 defaults[name] = deepcopy(value)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
64 return defaults
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
65 _getDefaults = classmethod(_getDefaults)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
66
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
67
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
68 class BundleBuilder(Defaults):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
69
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
70 """BundleBuilder is a barebones class for assembling bundles. It
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
71 knows nothing about executables or icons, it only copies files
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
72 and creates the PkgInfo and Info.plist files.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
73 """
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
74
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
75 # (Note that Defaults.__init__ (deep)copies these values to
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
76 # instance variables. Mutable defaults are therefore safe.)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
77
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
78 # Name of the bundle, with or without extension.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
79 name = None
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
80
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
81 # The property list ("plist")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
82 plist = Plist(CFBundleDevelopmentRegion = "English",
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
83 CFBundleInfoDictionaryVersion = "6.0")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
84
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
85 # The type of the bundle.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
86 type = "BNDL"
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
87 # The creator code of the bundle.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
88 creator = None
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
89
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
90 # the CFBundleIdentifier (this is used for the preferences file name)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
91 bundle_id = None
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
92
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
93 # List of files that have to be copied to <bundle>/Contents/Resources.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
94 resources = []
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
95
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
96 # List of (src, dest) tuples; dest should be a path relative to the bundle
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
97 # (eg. "Contents/Resources/MyStuff/SomeFile.ext).
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
98 files = []
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
99
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
100 # List of shared libraries (dylibs, Frameworks) to bundle with the app
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
101 # will be placed in Contents/Frameworks
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
102 libs = []
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
103
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
104 # Directory where the bundle will be assembled.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
105 builddir = "build"
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
106
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
107 # Make symlinks instead copying files. This is handy during debugging, but
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
108 # makes the bundle non-distributable.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
109 symlink = 0
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
110
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
111 # Verbosity level.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
112 verbosity = 1
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
113
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
114 # Destination root directory
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
115 destroot = ""
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
116
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
117 def setup(self):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
118 # XXX rethink self.name munging, this is brittle.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
119 self.name, ext = os.path.splitext(self.name)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
120 if not ext:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
121 ext = ".bundle"
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
122 bundleextension = ext
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
123 # misc (derived) attributes
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
124 self.bundlepath = pathjoin(self.builddir, self.name + bundleextension)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
125
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
126 plist = self.plist
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
127 plist.CFBundleName = self.name
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
128 plist.CFBundlePackageType = self.type
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
129 if self.creator is None:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
130 if hasattr(plist, "CFBundleSignature"):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
131 self.creator = plist.CFBundleSignature
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
132 else:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
133 self.creator = "????"
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
134 plist.CFBundleSignature = self.creator
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
135 if self.bundle_id:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
136 plist.CFBundleIdentifier = self.bundle_id
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
137 elif not hasattr(plist, "CFBundleIdentifier"):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
138 plist.CFBundleIdentifier = self.name
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
139
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
140 def build(self):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
141 """Build the bundle."""
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
142 builddir = self.builddir
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
143 if builddir and not os.path.exists(builddir):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
144 os.mkdir(builddir)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
145 self.message("Building %s" % repr(self.bundlepath), 1)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
146 if os.path.exists(self.bundlepath):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
147 shutil.rmtree(self.bundlepath)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
148 if os.path.exists(self.bundlepath + '~'):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
149 shutil.rmtree(self.bundlepath + '~')
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
150 bp = self.bundlepath
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
151
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
152 # Create the app bundle in a temporary location and then
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
153 # rename the completed bundle. This way the Finder will
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
154 # never see an incomplete bundle (where it might pick up
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
155 # and cache the wrong meta data)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
156 self.bundlepath = bp + '~'
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
157 try:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
158 os.mkdir(self.bundlepath)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
159 self.preProcess()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
160 self._copyFiles()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
161 self._addMetaFiles()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
162 self.postProcess()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
163 os.rename(self.bundlepath, bp)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
164 finally:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
165 self.bundlepath = bp
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
166 self.message("Done.", 1)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
167
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
168 def preProcess(self):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
169 """Hook for subclasses."""
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
170 pass
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
171 def postProcess(self):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
172 """Hook for subclasses."""
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
173 pass
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
174
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
175 def _addMetaFiles(self):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
176 contents = pathjoin(self.bundlepath, "Contents")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
177 makedirs(contents)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
178 #
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
179 # Write Contents/PkgInfo
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
180 assert len(self.type) == len(self.creator) == 4, \
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
181 "type and creator must be 4-byte strings."
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
182 pkginfo = pathjoin(contents, "PkgInfo")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
183 f = open(pkginfo, "wb")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
184 f.write((self.type + self.creator).encode('latin1'))
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
185 f.close()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
186 #
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
187 # Write Contents/Info.plist
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
188 infoplist = pathjoin(contents, "Info.plist")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
189 self.plist.write(infoplist)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
190
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
191 def _copyFiles(self):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
192 files = self.files[:]
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
193 for path in self.resources:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
194 files.append((path, pathjoin("Contents", "Resources",
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
195 os.path.basename(path))))
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
196 for path in self.libs:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
197 files.append((path, pathjoin("Contents", "Frameworks",
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
198 os.path.basename(path))))
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
199 if self.symlink:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
200 self.message("Making symbolic links", 1)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
201 msg = "Making symlink from"
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
202 else:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
203 self.message("Copying files", 1)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
204 msg = "Copying"
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
205 files.sort()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
206 for src, dst in files:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
207 if os.path.isdir(src):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
208 self.message("%s %s/ to %s/" % (msg, src, dst), 2)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
209 else:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
210 self.message("%s %s to %s" % (msg, src, dst), 2)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
211 dst = pathjoin(self.bundlepath, dst)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
212 if self.symlink:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
213 symlink(src, dst, mkdirs=1)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
214 else:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
215 copy(src, dst, mkdirs=1)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
216
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
217 def message(self, msg, level=0):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
218 if level <= self.verbosity:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
219 indent = ""
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
220 if level > 1:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
221 indent = (level - 1) * " "
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
222 sys.stderr.write(indent + msg + "\n")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
223
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
224 def report(self):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
225 # XXX something decent
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
226 pass
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
227
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
228
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
229 if __debug__:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
230 PYC_EXT = ".pyc"
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
231 else:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
232 PYC_EXT = ".pyo"
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
233
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
234 MAGIC = imp.get_magic()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
235 USE_ZIPIMPORT = "zipimport" in sys.builtin_module_names
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
236
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
237 # For standalone apps, we have our own minimal site.py. We don't need
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
238 # all the cruft of the real site.py.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
239 SITE_PY = """\
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
240 import sys
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
241 if not %(semi_standalone)s:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
242 del sys.path[1:] # sys.path[0] is Contents/Resources/
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
243 """
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
244
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
245 if USE_ZIPIMPORT:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
246 ZIP_ARCHIVE = "Modules.zip"
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
247 SITE_PY += "sys.path.append(sys.path[0] + '/%s')\n" % ZIP_ARCHIVE
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
248 def getPycData(fullname, code, ispkg):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
249 if ispkg:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
250 fullname += ".__init__"
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
251 path = fullname.replace(".", os.sep) + PYC_EXT
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
252 return path, MAGIC + '\0\0\0\0' + marshal.dumps(code)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
253
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
254 #
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
255 # Extension modules can't be in the modules zip archive, so a placeholder
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
256 # is added instead, that loads the extension from a specified location.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
257 #
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
258 EXT_LOADER = """\
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
259 def __load():
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
260 import imp, sys, os
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
261 for p in sys.path:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
262 path = os.path.join(p, "%(filename)s")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
263 if os.path.exists(path):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
264 break
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
265 else:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
266 assert 0, "file not found: %(filename)s"
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
267 mod = imp.load_dynamic("%(name)s", path)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
268
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
269 __load()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
270 del __load
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
271 """
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
272
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
273 MAYMISS_MODULES = ['mac', 'os2', 'nt', 'ntpath', 'dos', 'dospath',
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
274 'win32api', 'ce', '_winreg', 'nturl2path', 'sitecustomize',
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
275 'org.python.core', 'riscos', 'riscosenviron', 'riscospath'
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
276 ]
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
277
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
278 STRIP_EXEC = "/usr/bin/strip"
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
279
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
280 #
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
281 # We're using a stock interpreter to run the app, yet we need
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
282 # a way to pass the Python main program to the interpreter. The
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
283 # bootstrapping script fires up the interpreter with the right
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
284 # arguments. os.execve() is used as OSX doesn't like us to
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
285 # start a real new process. Also, the executable name must match
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
286 # the CFBundleExecutable value in the Info.plist, so we lie
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
287 # deliberately with argv[0]. The actual Python executable is
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
288 # passed in an environment variable so we can "repair"
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
289 # sys.executable later.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
290 #
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
291 BOOTSTRAP_SCRIPT = """\
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
292 #!%(hashbang)s
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
293
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
294 import sys, os
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
295 execdir = os.path.dirname(sys.argv[0])
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
296 executable = os.path.join(execdir, "%(executable)s")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
297 resdir = os.path.join(os.path.dirname(execdir), "Resources")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
298 libdir = os.path.join(os.path.dirname(execdir), "Frameworks")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
299 mainprogram = os.path.join(resdir, "%(mainprogram)s")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
300
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
301 sys.argv.insert(1, mainprogram)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
302 if %(standalone)s or %(semi_standalone)s:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
303 os.environ["PYTHONPATH"] = resdir
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
304 if %(standalone)s:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
305 os.environ["PYTHONHOME"] = resdir
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
306 else:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
307 pypath = os.getenv("PYTHONPATH", "")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
308 if pypath:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
309 pypath = ":" + pypath
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
310 os.environ["PYTHONPATH"] = resdir + pypath
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
311 os.environ["PYTHONEXECUTABLE"] = executable
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
312 os.environ["DYLD_LIBRARY_PATH"] = libdir
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
313 os.environ["DYLD_FRAMEWORK_PATH"] = libdir
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
314 os.execve(executable, sys.argv, os.environ)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
315 """
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
316
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
317
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
318 #
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
319 # Optional wrapper that converts "dropped files" into sys.argv values.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
320 #
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
321 ARGV_EMULATOR = """\
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
322 import argvemulator, os
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
323
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
324 argvemulator.ArgvCollector().mainloop()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
325 execfile(os.path.join(os.path.split(__file__)[0], "%(realmainprogram)s"))
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
326 """
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
327
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
328 #
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
329 # When building a standalone app with Python.framework, we need to copy
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
330 # a subset from Python.framework to the bundle. The following list
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
331 # specifies exactly what items we'll copy.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
332 #
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
333 PYTHONFRAMEWORKGOODIES = [
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
334 "Python", # the Python core library
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
335 "Resources/English.lproj",
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
336 "Resources/Info.plist",
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
337 "Resources/version.plist",
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
338 ]
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
339
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
340 def isFramework():
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
341 return sys.exec_prefix.find("Python.framework") > 0
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
342
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
343
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
344 LIB = os.path.join(sys.prefix, "lib", "python" + sys.version[:3])
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
345 SITE_PACKAGES = os.path.join(LIB, "site-packages")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
346
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
347
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
348 class AppBuilder(BundleBuilder):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
349
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
350 # Override type of the bundle.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
351 type = "APPL"
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
352
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
353 # platform, name of the subfolder of Contents that contains the executable.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
354 platform = "MacOS"
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
355
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
356 # A Python main program. If this argument is given, the main
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
357 # executable in the bundle will be a small wrapper that invokes
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
358 # the main program. (XXX Discuss why.)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
359 mainprogram = None
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
360
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
361 # The main executable. If a Python main program is specified
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
362 # the executable will be copied to Resources and be invoked
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
363 # by the wrapper program mentioned above. Otherwise it will
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
364 # simply be used as the main executable.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
365 executable = None
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
366
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
367 # The name of the main nib, for Cocoa apps. *Must* be specified
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
368 # when building a Cocoa app.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
369 nibname = None
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
370
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
371 # The name of the icon file to be copied to Resources and used for
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
372 # the Finder icon.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
373 iconfile = None
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
374
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
375 # Symlink the executable instead of copying it.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
376 symlink_exec = 0
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
377
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
378 # If True, build standalone app.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
379 standalone = 0
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
380
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
381 # If True, build semi-standalone app (only includes third-party modules).
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
382 semi_standalone = 0
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
383
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
384 # If set, use this for #! lines in stead of sys.executable
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
385 python = None
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
386
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
387 # If True, add a real main program that emulates sys.argv before calling
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
388 # mainprogram
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
389 argv_emulation = 0
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
390
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
391 # The following attributes are only used when building a standalone app.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
392
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
393 # Exclude these modules.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
394 excludeModules = []
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
395
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
396 # Include these modules.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
397 includeModules = []
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
398
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
399 # Include these packages.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
400 includePackages = []
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
401
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
402 # Strip binaries from debug info.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
403 strip = 0
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
404
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
405 # Found Python modules: [(name, codeobject, ispkg), ...]
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
406 pymodules = []
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
407
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
408 # Modules that modulefinder couldn't find:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
409 missingModules = []
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
410 maybeMissingModules = []
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
411
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
412 def setup(self):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
413 if ((self.standalone or self.semi_standalone)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
414 and self.mainprogram is None):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
415 raise BundleBuilderError("must specify 'mainprogram' when "
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
416 "building a standalone application.")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
417 if self.mainprogram is None and self.executable is None:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
418 raise BundleBuilderError("must specify either or both of "
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
419 "'executable' and 'mainprogram'")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
420
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
421 self.execdir = pathjoin("Contents", self.platform)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
422
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
423 if self.name is not None:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
424 pass
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
425 elif self.mainprogram is not None:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
426 self.name = os.path.splitext(os.path.basename(self.mainprogram))[0]
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
427 elif executable is not None:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
428 self.name = os.path.splitext(os.path.basename(self.executable))[0]
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
429 if self.name[-4:] != ".app":
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
430 self.name += ".app"
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
431
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
432 if self.executable is None:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
433 if not self.standalone and not isFramework():
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
434 self.symlink_exec = 1
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
435 if self.python:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
436 self.executable = self.python
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
437 else:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
438 self.executable = sys.executable
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
439
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
440 if self.nibname:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
441 self.plist.NSMainNibFile = self.nibname
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
442 if not hasattr(self.plist, "NSPrincipalClass"):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
443 self.plist.NSPrincipalClass = "NSApplication"
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
444
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
445 if self.standalone and isFramework():
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
446 self.addPythonFramework()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
447
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
448 BundleBuilder.setup(self)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
449
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
450 self.plist.CFBundleExecutable = self.name
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
451
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
452 if self.standalone or self.semi_standalone:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
453 self.findDependencies()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
454
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
455 def preProcess(self):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
456 resdir = "Contents/Resources"
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
457 if self.executable is not None:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
458 if self.mainprogram is None:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
459 execname = self.name
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
460 else:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
461 execname = os.path.basename(self.executable)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
462 execpath = pathjoin(self.execdir, execname)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
463 if not self.symlink_exec:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
464 self.files.append((self.destroot + self.executable, execpath))
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
465 self.execpath = execpath
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
466
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
467 if self.mainprogram is not None:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
468 mainprogram = os.path.basename(self.mainprogram)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
469 self.files.append((self.mainprogram, pathjoin(resdir, mainprogram)))
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
470 if self.argv_emulation:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
471 # Change the main program, and create the helper main program (which
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
472 # does argv collection and then calls the real main).
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
473 # Also update the included modules (if we're creating a standalone
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
474 # program) and the plist
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
475 realmainprogram = mainprogram
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
476 mainprogram = '__argvemulator_' + mainprogram
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
477 resdirpath = pathjoin(self.bundlepath, resdir)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
478 mainprogrampath = pathjoin(resdirpath, mainprogram)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
479 makedirs(resdirpath)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
480 open(mainprogrampath, "w").write(ARGV_EMULATOR % locals())
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
481 if self.standalone or self.semi_standalone:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
482 self.includeModules.append("argvemulator")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
483 self.includeModules.append("os")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
484 if "CFBundleDocumentTypes" not in self.plist:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
485 self.plist["CFBundleDocumentTypes"] = [
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
486 { "CFBundleTypeOSTypes" : [
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
487 "****",
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
488 "fold",
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
489 "disk"],
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
490 "CFBundleTypeRole": "Viewer"}]
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
491 # Write bootstrap script
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
492 executable = os.path.basename(self.executable)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
493 execdir = pathjoin(self.bundlepath, self.execdir)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
494 bootstrappath = pathjoin(execdir, self.name)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
495 makedirs(execdir)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
496 if self.standalone or self.semi_standalone:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
497 # XXX we're screwed when the end user has deleted
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
498 # /usr/bin/python
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
499 hashbang = "/usr/bin/python"
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
500 elif self.python:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
501 hashbang = self.python
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
502 else:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
503 hashbang = os.path.realpath(sys.executable)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
504 standalone = self.standalone
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
505 semi_standalone = self.semi_standalone
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
506 open(bootstrappath, "w").write(BOOTSTRAP_SCRIPT % locals())
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
507 os.chmod(bootstrappath, 0o775)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
508
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
509 if self.iconfile is not None:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
510 iconbase = os.path.basename(self.iconfile)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
511 self.plist.CFBundleIconFile = iconbase
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
512 self.files.append((self.iconfile, pathjoin(resdir, iconbase)))
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
513
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
514 def postProcess(self):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
515 if self.standalone or self.semi_standalone:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
516 self.addPythonModules()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
517 if self.strip and not self.symlink:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
518 self.stripBinaries()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
519
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
520 if self.symlink_exec and self.executable:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
521 self.message("Symlinking executable %s to %s" % (self.executable,
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
522 self.execpath), 2)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
523 dst = pathjoin(self.bundlepath, self.execpath)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
524 makedirs(os.path.dirname(dst))
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
525 os.symlink(os.path.abspath(self.executable), dst)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
526
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
527 if self.missingModules or self.maybeMissingModules:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
528 self.reportMissing()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
529
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
530 def addPythonFramework(self):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
531 # If we're building a standalone app with Python.framework,
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
532 # include a minimal subset of Python.framework, *unless*
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
533 # Python.framework was specified manually in self.libs.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
534 for lib in self.libs:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
535 if os.path.basename(lib) == "Python.framework":
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
536 # a Python.framework was specified as a library
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
537 return
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
538
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
539 frameworkpath = sys.exec_prefix[:sys.exec_prefix.find(
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
540 "Python.framework") + len("Python.framework")]
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
541
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
542 version = sys.version[:3]
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
543 frameworkpath = pathjoin(frameworkpath, "Versions", version)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
544 destbase = pathjoin("Contents", "Frameworks", "Python.framework",
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
545 "Versions", version)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
546 for item in PYTHONFRAMEWORKGOODIES:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
547 src = pathjoin(frameworkpath, item)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
548 dst = pathjoin(destbase, item)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
549 self.files.append((src, dst))
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
550
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
551 def _getSiteCode(self):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
552 return compile(SITE_PY % {"semi_standalone": self.semi_standalone},
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
553 "<-bundlebuilder.py->", "exec")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
554
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
555 def addPythonModules(self):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
556 self.message("Adding Python modules", 1)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
557
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
558 if USE_ZIPIMPORT:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
559 # Create a zip file containing all modules as pyc.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
560 import zipfile
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
561 relpath = pathjoin("Contents", "Resources", ZIP_ARCHIVE)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
562 abspath = pathjoin(self.bundlepath, relpath)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
563 zf = zipfile.ZipFile(abspath, "w", zipfile.ZIP_DEFLATED)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
564 for name, code, ispkg in self.pymodules:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
565 self.message("Adding Python module %s" % name, 2)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
566 path, pyc = getPycData(name, code, ispkg)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
567 zf.writestr(path, pyc)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
568 zf.close()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
569 # add site.pyc
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
570 sitepath = pathjoin(self.bundlepath, "Contents", "Resources",
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
571 "site" + PYC_EXT)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
572 writePyc(self._getSiteCode(), sitepath)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
573 else:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
574 # Create individual .pyc files.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
575 for name, code, ispkg in self.pymodules:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
576 if ispkg:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
577 name += ".__init__"
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
578 path = name.split(".")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
579 path = pathjoin("Contents", "Resources", *path) + PYC_EXT
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
580
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
581 if ispkg:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
582 self.message("Adding Python package %s" % path, 2)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
583 else:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
584 self.message("Adding Python module %s" % path, 2)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
585
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
586 abspath = pathjoin(self.bundlepath, path)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
587 makedirs(os.path.dirname(abspath))
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
588 writePyc(code, abspath)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
589
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
590 def stripBinaries(self):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
591 if not os.path.exists(STRIP_EXEC):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
592 self.message("Error: can't strip binaries: no strip program at "
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
593 "%s" % STRIP_EXEC, 0)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
594 else:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
595 import stat
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
596 self.message("Stripping binaries", 1)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
597 def walk(top):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
598 for name in os.listdir(top):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
599 path = pathjoin(top, name)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
600 if os.path.islink(path):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
601 continue
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
602 if os.path.isdir(path):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
603 walk(path)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
604 else:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
605 mod = os.stat(path)[stat.ST_MODE]
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
606 if not (mod & 0o100):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
607 continue
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
608 relpath = path[len(self.bundlepath):]
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
609 self.message("Stripping %s" % relpath, 2)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
610 inf, outf = os.popen4("%s -S \"%s\"" %
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
611 (STRIP_EXEC, path))
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
612 output = outf.read().strip()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
613 if output:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
614 # usually not a real problem, like when we're
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
615 # trying to strip a script
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
616 self.message("Problem stripping %s:" % relpath, 3)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
617 self.message(output, 3)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
618 walk(self.bundlepath)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
619
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
620 def findDependencies(self):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
621 self.message("Finding module dependencies", 1)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
622 import modulefinder
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
623 mf = modulefinder.ModuleFinder(excludes=self.excludeModules)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
624 if USE_ZIPIMPORT:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
625 # zipimport imports zlib, must add it manually
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
626 mf.import_hook("zlib")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
627 # manually add our own site.py
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
628 site = mf.add_module("site")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
629 site.__code__ = self._getSiteCode()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
630 mf.scan_code(site.__code__, site)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
631
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
632 # warnings.py gets imported implicitly from C
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
633 mf.import_hook("warnings")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
634
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
635 includeModules = self.includeModules[:]
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
636 for name in self.includePackages:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
637 includeModules.extend(list(findPackageContents(name).keys()))
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
638 for name in includeModules:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
639 try:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
640 mf.import_hook(name)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
641 except ImportError:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
642 self.missingModules.append(name)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
643
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
644 mf.run_script(self.mainprogram)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
645 modules = list(mf.modules.items())
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
646 modules.sort()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
647 for name, mod in modules:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
648 path = mod.__file__
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
649 if path and self.semi_standalone:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
650 # skip the standard library
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
651 if path.startswith(LIB) and not path.startswith(SITE_PACKAGES):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
652 continue
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
653 if path and mod.__code__ is None:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
654 # C extension
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
655 filename = os.path.basename(path)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
656 pathitems = name.split(".")[:-1] + [filename]
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
657 dstpath = pathjoin(*pathitems)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
658 if USE_ZIPIMPORT:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
659 if name != "zlib":
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
660 # neatly pack all extension modules in a subdirectory,
51776
d06a3ebf306f Merged revisions 69846 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50381
diff changeset
661 # except zlib, since it's necessary for bootstrapping.
50381
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
662 dstpath = pathjoin("ExtensionModules", dstpath)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
663 # Python modules are stored in a Zip archive, but put
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
664 # extensions in Contents/Resources/. Add a tiny "loader"
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
665 # program in the Zip archive. Due to Thomas Heller.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
666 source = EXT_LOADER % {"name": name, "filename": dstpath}
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
667 code = compile(source, "<dynloader for %s>" % name, "exec")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
668 mod.__code__ = code
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
669 self.files.append((path, pathjoin("Contents", "Resources", dstpath)))
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
670 if mod.__code__ is not None:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
671 ispkg = mod.__path__ is not None
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
672 if not USE_ZIPIMPORT or name != "site":
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
673 # Our site.py is doing the bootstrapping, so we must
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
674 # include a real .pyc file if USE_ZIPIMPORT is True.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
675 self.pymodules.append((name, mod.__code__, ispkg))
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
676
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
677 if hasattr(mf, "any_missing_maybe"):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
678 missing, maybe = mf.any_missing_maybe()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
679 else:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
680 missing = mf.any_missing()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
681 maybe = []
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
682 self.missingModules.extend(missing)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
683 self.maybeMissingModules.extend(maybe)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
684
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
685 def reportMissing(self):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
686 missing = [name for name in self.missingModules
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
687 if name not in MAYMISS_MODULES]
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
688 if self.maybeMissingModules:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
689 maybe = self.maybeMissingModules
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
690 else:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
691 maybe = [name for name in missing if "." in name]
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
692 missing = [name for name in missing if "." not in name]
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
693 missing.sort()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
694 maybe.sort()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
695 if maybe:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
696 self.message("Warning: couldn't find the following submodules:", 1)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
697 self.message(" (Note that these could be false alarms -- "
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
698 "it's not always", 1)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
699 self.message(" possible to distinguish between \"from package "
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
700 "import submodule\" ", 1)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
701 self.message(" and \"from package import name\")", 1)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
702 for name in maybe:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
703 self.message(" ? " + name, 1)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
704 if missing:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
705 self.message("Warning: couldn't find the following modules:", 1)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
706 for name in missing:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
707 self.message(" ? " + name, 1)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
708
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
709 def report(self):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
710 # XXX something decent
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
711 import pprint
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
712 pprint.pprint(self.__dict__)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
713 if self.standalone or self.semi_standalone:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
714 self.reportMissing()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
715
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
716 #
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
717 # Utilities.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
718 #
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
719
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
720 SUFFIXES = [_suf for _suf, _mode, _tp in imp.get_suffixes()]
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
721 identifierRE = re.compile(r"[_a-zA-z][_a-zA-Z0-9]*$")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
722
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
723 def findPackageContents(name, searchpath=None):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
724 head = name.split(".")[-1]
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
725 if identifierRE.match(head) is None:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
726 return {}
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
727 try:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
728 fp, path, (ext, mode, tp) = imp.find_module(head, searchpath)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
729 except ImportError:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
730 return {}
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
731 modules = {name: None}
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
732 if tp == imp.PKG_DIRECTORY and path:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
733 files = os.listdir(path)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
734 for sub in files:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
735 sub, ext = os.path.splitext(sub)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
736 fullname = name + "." + sub
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
737 if sub != "__init__" and fullname not in modules:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
738 modules.update(findPackageContents(fullname, [path]))
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
739 return modules
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
740
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
741 def writePyc(code, path):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
742 f = open(path, "wb")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
743 f.write(MAGIC)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
744 f.write("\0" * 4) # don't bother about a time stamp
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
745 marshal.dump(code, f)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
746 f.close()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
747
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
748 def copy(src, dst, mkdirs=0):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
749 """Copy a file or a directory."""
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
750 if mkdirs:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
751 makedirs(os.path.dirname(dst))
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
752 if os.path.isdir(src):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
753 shutil.copytree(src, dst, symlinks=1)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
754 else:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
755 shutil.copy2(src, dst)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
756
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
757 def copytodir(src, dstdir):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
758 """Copy a file or a directory to an existing directory."""
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
759 dst = pathjoin(dstdir, os.path.basename(src))
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
760 copy(src, dst)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
761
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
762 def makedirs(dir):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
763 """Make all directories leading up to 'dir' including the leaf
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
764 directory. Don't moan if any path element already exists."""
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
765 try:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
766 os.makedirs(dir)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
767 except OSError as why:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
768 if why.errno != errno.EEXIST:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
769 raise
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
770
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
771 def symlink(src, dst, mkdirs=0):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
772 """Copy a file or a directory."""
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
773 if not os.path.exists(src):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
774 raise IOError("No such file or directory: '%s'" % src)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
775 if mkdirs:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
776 makedirs(os.path.dirname(dst))
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
777 os.symlink(os.path.abspath(src), dst)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
778
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
779 def pathjoin(*args):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
780 """Safe wrapper for os.path.join: asserts that all but the first
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
781 argument are relative paths."""
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
782 for seg in args[1:]:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
783 assert seg[0] != "/"
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
784 return os.path.join(*args)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
785
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
786
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
787 cmdline_doc = """\
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
788 Usage:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
789 python bundlebuilder.py [options] command
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
790 python mybuildscript.py [options] command
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
791
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
792 Commands:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
793 build build the application
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
794 report print a report
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
795
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
796 Options:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
797 -b, --builddir=DIR the build directory; defaults to "build"
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
798 -n, --name=NAME application name
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
799 -r, --resource=FILE extra file or folder to be copied to Resources
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
800 -f, --file=SRC:DST extra file or folder to be copied into the bundle;
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
801 DST must be a path relative to the bundle root
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
802 -e, --executable=FILE the executable to be used
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
803 -m, --mainprogram=FILE the Python main program
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
804 -a, --argv add a wrapper main program to create sys.argv
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
805 -p, --plist=FILE .plist file (default: generate one)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
806 --nib=NAME main nib name
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
807 -c, --creator=CCCC 4-char creator code (default: '????')
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
808 --iconfile=FILE filename of the icon (an .icns file) to be used
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
809 as the Finder icon
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
810 --bundle-id=ID the CFBundleIdentifier, in reverse-dns format
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
811 (eg. org.python.BuildApplet; this is used for
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
812 the preferences file name)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
813 -l, --link symlink files/folder instead of copying them
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
814 --link-exec symlink the executable instead of copying it
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
815 --standalone build a standalone application, which is fully
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
816 independent of a Python installation
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
817 --semi-standalone build a standalone application, which depends on
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
818 an installed Python, yet includes all third-party
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
819 modules.
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
820 --python=FILE Python to use in #! line in stead of current Python
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
821 --lib=FILE shared library or framework to be copied into
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
822 the bundle
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
823 -x, --exclude=MODULE exclude module (with --(semi-)standalone)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
824 -i, --include=MODULE include module (with --(semi-)standalone)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
825 --package=PACKAGE include a whole package (with --(semi-)standalone)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
826 --strip strip binaries (remove debug info)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
827 -v, --verbose increase verbosity level
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
828 -q, --quiet decrease verbosity level
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
829 -h, --help print this message
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
830 """
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
831
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
832 def usage(msg=None):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
833 if msg:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
834 print(msg)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
835 print(cmdline_doc)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
836 sys.exit(1)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
837
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
838 def main(builder=None):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
839 if builder is None:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
840 builder = AppBuilder(verbosity=1)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
841
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
842 shortopts = "b:n:r:f:e:m:c:p:lx:i:hvqa"
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
843 longopts = ("builddir=", "name=", "resource=", "file=", "executable=",
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
844 "mainprogram=", "creator=", "nib=", "plist=", "link",
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
845 "link-exec", "help", "verbose", "quiet", "argv", "standalone",
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
846 "exclude=", "include=", "package=", "strip", "iconfile=",
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
847 "lib=", "python=", "semi-standalone", "bundle-id=", "destroot=")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
848
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
849 try:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
850 options, args = getopt.getopt(sys.argv[1:], shortopts, longopts)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
851 except getopt.error:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
852 usage()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
853
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
854 for opt, arg in options:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
855 if opt in ('-b', '--builddir'):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
856 builder.builddir = arg
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
857 elif opt in ('-n', '--name'):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
858 builder.name = arg
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
859 elif opt in ('-r', '--resource'):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
860 builder.resources.append(os.path.normpath(arg))
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
861 elif opt in ('-f', '--file'):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
862 srcdst = arg.split(':')
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
863 if len(srcdst) != 2:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
864 usage("-f or --file argument must be two paths, "
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
865 "separated by a colon")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
866 builder.files.append(srcdst)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
867 elif opt in ('-e', '--executable'):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
868 builder.executable = arg
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
869 elif opt in ('-m', '--mainprogram'):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
870 builder.mainprogram = arg
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
871 elif opt in ('-a', '--argv'):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
872 builder.argv_emulation = 1
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
873 elif opt in ('-c', '--creator'):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
874 builder.creator = arg
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
875 elif opt == '--bundle-id':
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
876 builder.bundle_id = arg
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
877 elif opt == '--iconfile':
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
878 builder.iconfile = arg
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
879 elif opt == "--lib":
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
880 builder.libs.append(os.path.normpath(arg))
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
881 elif opt == "--nib":
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
882 builder.nibname = arg
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
883 elif opt in ('-p', '--plist'):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
884 builder.plist = Plist.fromFile(arg)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
885 elif opt in ('-l', '--link'):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
886 builder.symlink = 1
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
887 elif opt == '--link-exec':
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
888 builder.symlink_exec = 1
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
889 elif opt in ('-h', '--help'):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
890 usage()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
891 elif opt in ('-v', '--verbose'):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
892 builder.verbosity += 1
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
893 elif opt in ('-q', '--quiet'):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
894 builder.verbosity -= 1
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
895 elif opt == '--standalone':
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
896 builder.standalone = 1
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
897 elif opt == '--semi-standalone':
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
898 builder.semi_standalone = 1
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
899 elif opt == '--python':
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
900 builder.python = arg
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
901 elif opt in ('-x', '--exclude'):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
902 builder.excludeModules.append(arg)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
903 elif opt in ('-i', '--include'):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
904 builder.includeModules.append(arg)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
905 elif opt == '--package':
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
906 builder.includePackages.append(arg)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
907 elif opt == '--strip':
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
908 builder.strip = 1
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
909 elif opt == '--destroot':
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
910 builder.destroot = arg
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
911
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
912 if len(args) != 1:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
913 usage("Must specify one command ('build', 'report' or 'help')")
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
914 command = args[0]
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
915
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
916 if command == "build":
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
917 builder.setup()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
918 builder.build()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
919 elif command == "report":
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
920 builder.setup()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
921 builder.report()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
922 elif command == "help":
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
923 usage()
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
924 else:
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
925 usage("Unknown command '%s'" % command)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
926
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
927
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
928 def buildapp(**kwargs):
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
929 builder = AppBuilder(**kwargs)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
930 main(builder)
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
931
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
932
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
933 if __name__ == "__main__":
7431638e7dd8 Merged revisions 68062,68064 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
934 main()