annotate Mac/Tools/bundlebuilder.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents ffc6e6b00949
children
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
79472
ffc6e6b00949 #16135: Removal of OS/2 support (I)
Jesus Cea <jcea@jcea.es>
parents: 51776
diff changeset
273 MAYMISS_MODULES = ['mac', 'nt', 'ntpath', 'dos', 'dospath',
50381
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()