1 Building a Python Mac OS X distribution
2 =======================================
3
4 The ``build-install.py`` script creates Python distributions, including
5 certain third-party libraries as necessary. It builds a complete
6 framework-based Python out-of-tree, installs it in a funny place with
7 $DESTROOT, massages that installation to remove .pyc files and such, creates
8 an Installer package from the installation plus other files in ``resources``
9 and ``scripts`` and placed that on a ``.dmg`` disk image.
10
11 This installers built by this script are legacy bundle installers that have
12 been supported from the early days of OS X. In particular, they are supported
13 on OS X 10.3.9, the earliest supported release for builds from this script.
14
15 Beginning with Python 2.7.9, PSF practice is to build two installer variants
16 using the newer flat package format, supported on 10.5+, and signed with the
17 builder's Apple developer key, allowing downloaded packages to satisfy Apple's
18 default Gatekeeper policy (e.g. starting with 10.8, Apple store downloads and
19 Apple developer ID signed apps and installer packages). The process for
20 transforming the output build artifacts into signed flat packages is not
21 yet integrated into ``build-installer.py``.
22
23 1. 32-bit-only, i386 and PPC universal, capable on running on all machines
24 supported by Mac OS X 10.5 through (at least) 10.10::
25
26 /usr/bin/python build-installer.py \
27 --sdk-path=/Developer/SDKs/MacOSX10.5.sdk \
28 --universal-archs=32-bit \
29 --dep-target=10.5
30
31 - builds the following third-party libraries
32
33 * libcrypto and libssl from OpenSSL 1.0.1
34 * NCurses 5.9
35 * SQLite 3.7.13
36 * Oracle Sleepycat DB 4.8 (Python 2.x only)
37
38 - uses system-supplied versions of third-party libraries
39
40 * readline module links with Apple BSD editline (libedit)
41
42 - requires ActiveState ``Tcl/Tk 8.4`` (currently 8.4.20) to be installed for building
43
44 - recommended build environment:
45
46 * Mac OS X 10.5.8 Intel or PPC
47 * Xcode 3.1.4
48 * ``MacOSX10.5`` SDK
49 * ``MACOSX_DEPLOYMENT_TARGET=10.5``
50 * Apple ``gcc-4.2``
51 * bootstrap non-framework Python 2.7 for documentation build with
52 Sphinx (as of 2.7.9)
53
54 - alternate build environments:
55
56 * Mac OS X 10.6.8 with Xcode 3.2.6
57 - need to change ``/System/Library/Frameworks/{Tcl,Tk}.framework/Version/Current`` to ``8.4``
58 * Note Xcode 4.* does not support building for PPC so cannot be used for this build
59
60 2. 64-bit / 32-bit, x86_64 and i386 universal, for OS X 10.6 (and later)::
61
62 /usr/bin/python build-installer.py \
63 --sdk-path=/Developer/SDKs/MacOSX10.6.sdk \
64 --universal-archs=intel \
65 --dep-target=10.6
66
67 - builds the following third-party libraries
68
69 * NCurses 5.9 (http://bugs.python.org/issue15037)
70 * SQLite 3.7.13
71 * Oracle Sleepycat DB 4.8 (Python 2.x only)
72
73 - uses system-supplied versions of third-party libraries
74
75 * libcrypto and libssl from Apple OpenSSL 0.9.8
76 * readline module links with Apple BSD editline (libedit)
77
78 - requires ActiveState Tcl/Tk 8.5.15 (or later) to be installed for building
79
80 - recommended build environment:
81
82 * Mac OS X 10.6.8 (or later)
83 * Xcode 3.2.6
84 * ``MacOSX10.6`` SDK
85 * ``MACOSX_DEPLOYMENT_TARGET=10.6``
86 * Apple ``gcc-4.2``
87 * bootstrap non-framework Python 2.7 for documentation build with
88 Sphinx (as of 2.7.9)
89
90 - alternate build environments:
91
92 * none. Xcode 4.x currently supplies two C compilers.
93 ``llvm-gcc-4.2.1`` has been found to miscompile Python 3.3.x and
94 produce a non-functional Python executable. As it appears to be
95 considered a migration aid by Apple and is not likely to be fixed,
96 its use should be avoided. The other compiler, ``clang``, has been
97 undergoing rapid development. While it appears to have become
98 production-ready in the most recent Xcode 5 releases, the versions
99 available on the deprecated Xcode 4.x for 10.6 were early releases
100 and did not receive the level of exposure in production environments
101 that the Xcode 3 gcc-4.2 compiler has had.
102
103
104 General Prerequisites
105 ---------------------
106
107 * No Fink (in ``/sw``) or MacPorts (in ``/opt/local``) or other local
108 libraries or utilities (in ``/usr/local``) as they could
109 interfere with the build.
110
111 * The documentation for the release is built using Sphinx
112 because it is included in the installer. For 2.7.x up to and including
113 2.7.8, the ``Doc/Makefile`` used ``svn`` to download repos of
114 ``Sphinx`` and its dependencies. Beginning with 2.7.9, the ``Doc/Makefile``
115 assumes there is an externally-provided ``sphinx-build`` and requires at
116 least Python 2.6 to run. Because of this, it is no longer possible to
117 build a 2.7.9 or later installer on OS X 10.5 using the Apple-supplied
118 Python 2.5.
119
120 * It is safest to start each variant build with an empty source directory
121 populated with a fresh copy of the untarred source.
122
123 * It is recommended that you remove any existing installed version of the
124 Python being built::
125
126 sudo rm -rf /Library/Frameworks/Python.framework/Versions/n.n
127
128
129 The Recipe
130 ----------
131
132 Here are the steps you need to follow to build a Python installer:
133
134 * Run ``build-installer.py``. Optionally you can pass a number of arguments
135 to specify locations of various files. Please see the top of
136 ``build-installer.py`` for its usage.
137
138 Running this script takes some time, it will not only build Python itself
139 but also some 3rd-party libraries that are needed for extensions.
140
141 * When done the script will tell you where the DMG image is (by default
142 somewhere in ``/tmp/_py``).
143
144 Building other universal installers
145 ...................................
146
147 It is also possible to build a 4-way universal installer that runs on
148 OS X 10.5 Leopard or later::
149
150 /usr/bin/python /build-installer.py \
151 --dep-target=10.5
152 --universal-archs=all
153 --sdk-path=/Developer/SDKs/MacOSX10.5.sdk
154
155 This requires that the deployment target is 10.5, and hence
156 also that you are building on at least OS X 10.5. 4-way includes
157 ``i386``, ``x86_64``, ``ppc``, and ``ppc64`` (G5). ``ppc64`` executable
158 variants can only be run on G5 machines running 10.5. Note that,
159 while OS X 10.6 is only supported on Intel-based machines, it is possible
160 to run ``ppc`` (32-bit) executables unmodified thanks to the Rosetta ppc
161 emulation in OS X 10.5 and 10.6. The 4-way installer variant must be
162 built with Xcode 3. It is not regularly built or tested.
163
164 Other ``--universal-archs`` options are ``64-bit`` (``x86_64``, ``ppc64``),
165 and ``3-way`` (``ppc``, ``i386``, ``x86_64``). None of these options
166 are regularly exercised; use at your own risk.
167
168
169 Testing
170 -------
171
172 Ideally, the resulting binaries should be installed and the test suite run
173 on all supported OS X releases and architectures. As a practical matter,
174 that is generally not possible. At a minimum, variant 1 should be run on
175 a PPC G4 system with OS X 10.5 and at least one Intel system running OS X
176 10.8, 10.7, 10.6, or 10.5. Variant 2 should be run on 10.8, 10.7, and 10.6
177 systems in both 32-bit and 64-bit modes.::
178
179 /usr/local/bin/pythonn.n -m test -w -u all,-largefile
180 /usr/local/bin/pythonn.n-32 -m test -w -u all
181
182 Certain tests will be skipped and some cause the interpreter to fail
183 which will likely generate ``Python quit unexpectedly`` alert messages
184 to be generated at several points during a test run. These are normal
185 during testing and can be ignored.
186
187 It is also recommend to launch IDLE and verify that it is at least
188 functional. Double-click on the IDLE app icon in ``/Applications/Pythonn.n``.
189 It should also be tested from the command line::
190
191 /usr/local/bin/idlen.n
192
193