Skip to content

Commit 1931e64

Browse files
authored
Forward port macOS installer updates from 3.7/3.8/3.9 (GH-21132)
1 parent 55939b1 commit 1931e64

File tree

6 files changed

+139
-260
lines changed

6 files changed

+139
-260
lines changed

Mac/BuildScript/README.rst

Lines changed: 55 additions & 187 deletions
Original file line numberDiff line numberDiff line change
@@ -7,216 +7,84 @@ framework-based Python out-of-tree, installs it in a funny place with
77
$DESTROOT, massages that installation to remove .pyc files and such, creates
88
an Installer package from the installation plus other files in ``resources``
99
and ``scripts`` and placed that on a ``.dmg`` disk image.
10-
11-
For Python 3.4.0, PSF practice is to build two installer variants
12-
for each release.
13-
14-
1. 32-bit-only, i386 and PPC universal, capable on running on all machines
15-
supported by Mac OS X 10.5 through (at least) 10.9::
16-
17-
/path/to/bootstrap/python2.7 build-installer.py \
18-
--sdk-path=/Developer/SDKs/MacOSX10.5.sdk \
19-
--universal-archs=32-bit \
20-
--dep-target=10.5
21-
22-
- builds the following third-party libraries
23-
24-
* NCurses 5.9 (http://bugs.python.org/issue15037)
25-
* SQLite 3.8.11
26-
* XZ 5.0.5
27-
28-
- uses system-supplied versions of third-party libraries
29-
30-
* readline module links with Apple BSD editline (libedit)
31-
32-
- requires ActiveState ``Tcl/Tk 8.4`` (currently 8.4.20) to be installed for building
33-
34-
- recommended build environment:
35-
36-
* Mac OS X 10.5.8 Intel or PPC
37-
* Xcode 3.1.4
38-
* ``MacOSX10.5`` SDK
39-
* ``MACOSX_DEPLOYMENT_TARGET=10.5``
40-
* Apple ``gcc-4.2``
41-
* bootstrap non-framework Python 2.7 for documentation build with
42-
Sphinx (as of 3.4.1)
43-
44-
- alternate build environments:
45-
46-
* Mac OS X 10.6.8 with Xcode 3.2.6
47-
- need to change ``/System/Library/Frameworks/{Tcl,Tk}.framework/Version/Current`` to ``8.4``
48-
* Note Xcode 4.* does not support building for PPC so cannot be used for this build
49-
50-
2. 64-bit / 32-bit, x86_64 and i386 universal, for OS X 10.6 (and later)::
10+
The installer package built on the dmg is a macOS bundle format installer
11+
package. This format is deprecated and is no longer supported by modern
12+
macOS systems; it is usable on macOS 10.6 and earlier systems.
13+
To be usable on newer versions of macOS, the bits in the bundle package
14+
must be assembled in a macOS flat installer package, using current
15+
versions of the pkgbuild and productbuild utilities. To pass macoS
16+
Gatekeeper download quarantine, the final package must be signed
17+
with a valid Apple Developer ID certificate using productsign.
18+
Starting with macOS 10.15 Catalina, Gatekeeper now also requires
19+
that installer packages are submitted to and pass Apple's automated
20+
notarization service using the altool command. To pass notarization,
21+
the binaries included in the package must be built with at least
22+
the macOS 10.9 SDK, mout now be signed with the codesign utility
23+
and executables must opt in to the hardened run time option with
24+
any necessary entitlements. Details of these processes are
25+
available in the on-line Apple Developer Documentation and man pages.
26+
27+
As of 3.8.0 and 3.7.7, PSF practice is to build one installer variants
28+
for each release. Note that as of this writing, no Pythons support
29+
building on a newer version of macOS that will run on older versions
30+
by setting MACOSX_DEPLOYMENT_TARGET. This is because the various
31+
Python C modules do not yet support runtime testing of macOS
32+
feature availability (for example, by using macOS AvailabilityMacros.h
33+
and weak-linking). To build a Python that is to be used on a
34+
range of macOS releases, always build on the oldest release to be
35+
supported; the necessary shared libraries for that release will
36+
normally also be available on later systems, with the occasional
37+
exception such as the removal of 32-bit libraries in macOS 10.15.
38+
39+
build-installer requires Apple Developer tools, either from the
40+
Command Line Tools package or from a full Xcode installation.
41+
You should use the most recent version of either for the operating
42+
system version in use. (One notable exception: on macOS 10.6,
43+
Snow Leopard, use Xcode 3, not Xcode 4 which was released later
44+
in the 10.6 support cycle.)
45+
46+
1. 64-bit, x86_64, for OS X 10.9 (and later)::
5147

5248
/path/to/bootstrap/python2.7 build-installer.py \
53-
--sdk-path=/Developer/SDKs/MacOSX10.6.sdk \
54-
--universal-archs=intel \
55-
--dep-target=10.6
49+
--universal-archs=intel-64 \
50+
--dep-target=10.9
5651

5752
- builds the following third-party libraries
5853

59-
* NCurses 5.9 (http://bugs.python.org/issue15037)
60-
* SQLite 3.8.11
61-
* XZ 5.0.5
54+
* OpenSSL 1.1.1
55+
* Tcl/Tk 8.6
56+
* NCurses
57+
* SQLite
58+
* XZ
59+
* libffi
6260

6361
- uses system-supplied versions of third-party libraries
6462

6563
* readline module links with Apple BSD editline (libedit)
66-
67-
- requires ActiveState Tcl/Tk 8.5.15.1 (or later) to be installed for building
68-
69-
- recommended build environment:
70-
71-
* Mac OS X 10.6.8 (or later)
72-
* Xcode 3.2.6
73-
* ``MacOSX10.6`` SDK
74-
* ``MACOSX_DEPLOYMENT_TARGET=10.6``
75-
* Apple ``gcc-4.2``
76-
* bootstrap non-framework Python 2.7 for documentation build with
77-
Sphinx (as of 3.4.1)
78-
79-
- alternate build environments:
80-
81-
* none. Xcode 4.x currently supplies two C compilers.
82-
``llvm-gcc-4.2.1`` has been found to miscompile Python 3.3.x and
83-
produce a non-functional Python executable. As it appears to be
84-
considered a migration aid by Apple and is not likely to be fixed,
85-
its use should be avoided. The other compiler, ``clang``, has been
86-
undergoing rapid development. While it appears to have become
87-
production-ready in the most recent Xcode 5 releases, the versions
88-
available on the deprecated Xcode 4.x for 10.6 were early releases
89-
and did not receive the level of exposure in production environments
90-
that the Xcode 3 gcc-4.2 compiler has had.
91-
92-
93-
* For Python 2.7.x and 3.2.x, the 32-bit-only installer was configured to
94-
support Mac OS X 10.3.9 through (at least) 10.6. Because it is
95-
believed that there are few systems still running OS X 10.3 or 10.4
96-
and because it has become increasingly difficult to test and
97-
support the differences in these earlier systems, as of Python 3.3.0 the PSF
98-
32-bit installer no longer supports them. For reference in building such
99-
an installer yourself, the details are::
100-
101-
/usr/bin/python build-installer.py \
102-
--sdk-path=/Developer/SDKs/MacOSX10.4u.sdk \
103-
--universal-archs=32-bit \
104-
--dep-target=10.3
105-
106-
- builds the following third-party libraries
107-
108-
* Bzip2
109-
* NCurses
110-
* GNU Readline (GPL)
111-
* SQLite 3
112-
* XZ
113-
* Zlib 1.2.3
114-
* Oracle Sleepycat DB 4.8 (Python 2.x only)
115-
116-
- requires ActiveState ``Tcl/Tk 8.4`` (currently 8.4.20) to be installed for building
64+
* zlib
65+
* bz2
11766

11867
- recommended build environment:
11968

120-
* Mac OS X 10.5.8 PPC or Intel
121-
* Xcode 3.1.4 (or later)
122-
* ``MacOSX10.4u`` SDK (later SDKs do not support PPC G3 processors)
123-
* ``MACOSX_DEPLOYMENT_TARGET=10.3``
124-
* Apple ``gcc-4.0``
125-
* system Python 2.5 for documentation build with Sphinx
126-
127-
- alternate build environments:
128-
129-
* Mac OS X 10.6.8 with Xcode 3.2.6
130-
- need to change ``/System/Library/Frameworks/{Tcl,Tk}.framework/Version/Current`` to ``8.4``
131-
69+
* Mac OS X 10.9.5
70+
* Xcode Command Line Tools 6.2
71+
* ``MacOSX10.9`` SDK
72+
* ``MACOSX_DEPLOYMENT_TARGET=10.9``
73+
* Apple ``clang``
13274

13375

13476
General Prerequisites
13577
---------------------
13678

137-
* No Fink (in ``/sw``) or MacPorts (in ``/opt/local``) or other local
138-
libraries or utilities (in ``/usr/local``) as they could
79+
* No Fink (in ``/sw``) or MacPorts (in ``/opt/local``) or Homebrew or
80+
other local libraries or utilities (in ``/usr/local``) as they could
13981
interfere with the build.
14082

141-
* The documentation for the release is built using Sphinx
142-
because it is included in the installer. For 2.7.x and 3.x.x up to and
143-
including 3.4.0, the ``Doc/Makefile`` uses ``svn`` to download repos of
144-
``Sphinx`` and its dependencies. Beginning with 3.4.1, the ``Doc/Makefile``
145-
assumes there is an externally-provided ``sphinx-build`` and requires at
146-
least Python 2.6 to run. Because of this, it is no longer possible to
147-
build a 3.4.1 or later installer on OS X 10.5 using the Apple-supplied
148-
Python 2.5.
149-
15083
* It is safest to start each variant build with an empty source directory
151-
populated with a fresh copy of the untarred source.
84+
populated with a fresh copy of the untarred source or a source repo.
15285

15386
* It is recommended that you remove any existing installed version of the
15487
Python being built::
15588

15689
sudo rm -rf /Library/Frameworks/Python.framework/Versions/n.n
15790

158-
159-
The Recipe
160-
----------
161-
162-
Here are the steps you need to follow to build a Python installer:
163-
164-
* Run ``build-installer.py``. Optionally you can pass a number of arguments
165-
to specify locations of various files. Please see the top of
166-
``build-installer.py`` for its usage.
167-
168-
Running this script takes some time, it will not only build Python itself
169-
but also some 3th-party libraries that are needed for extensions.
170-
171-
* When done the script will tell you where the DMG image is (by default
172-
somewhere in ``/tmp/_py``).
173-
174-
Building other universal installers
175-
...................................
176-
177-
It is also possible to build a 4-way universal installer that runs on
178-
OS X 10.5 Leopard or later::
179-
180-
/usr/bin/python /build-installer.py \
181-
--dep-target=10.5
182-
--universal-archs=all
183-
--sdk-path=/Developer/SDKs/MacOSX10.5.sdk
184-
185-
This requires that the deployment target is 10.5, and hence
186-
also that you are building on at least OS X 10.5. 4-way includes
187-
``i386``, ``x86_64``, ``ppc``, and ``ppc64`` (G5). ``ppc64`` executable
188-
variants can only be run on G5 machines running 10.5. Note that,
189-
while OS X 10.6 is only supported on Intel-based machines, it is possible
190-
to run ``ppc`` (32-bit) executables unmodified thanks to the Rosetta ppc
191-
emulation in OS X 10.5 and 10.6. The 4-way installer variant must be
192-
built with Xcode 3. It is not regularly built or tested.
193-
194-
Other ``--universal-archs`` options are ``64-bit`` (``x86_64``, ``ppc64``),
195-
and ``3-way`` (``ppc``, ``i386``, ``x86_64``). None of these options
196-
are regularly exercised; use at your own risk.
197-
198-
199-
Testing
200-
-------
201-
202-
Ideally, the resulting binaries should be installed and the test suite run
203-
on all supported OS X releases and architectures. As a practical matter,
204-
that is generally not possible. At a minimum, variant 1 should be run on
205-
a PPC G4 system with OS X 10.5 and at least one Intel system running OS X
206-
10.9, 10.8, 10.7, 10.6, or 10.5. Variant 2 should be run on 10.9, 10.8,
207-
10.7, and 10.6 systems in both 32-bit and 64-bit modes.::
208-
209-
/usr/local/bin/pythonn.n -m test -w -u all,-largefile
210-
/usr/local/bin/pythonn.n-32 -m test -w -u all
211-
212-
Certain tests will be skipped and some cause the interpreter to fail
213-
which will likely generate ``Python quit unexpectedly`` alert messages
214-
to be generated at several points during a test run. These are normal
215-
during testing and can be ignored.
216-
217-
It is also recommend to launch IDLE and verify that it is at least
218-
functional. Double-click on the IDLE app icon in ``/Applications/Python n.n``.
219-
It should also be tested from the command line::
220-
221-
/usr/local/bin/idlen.n
222-

0 commit comments

Comments
 (0)