1Building a Python Mac OS X distribution 2======================================= 3 4The ``build-install.py`` script creates Python distributions, including 5certain third-party libraries as necessary. It builds a complete 6framework-based Python out-of-tree, installs it in a funny place with 7$DESTROOT, massages that installation to remove .pyc files and such, creates 8an Installer package from the installation plus other files in ``resources`` 9and ``scripts`` and placed that on a ``.dmg`` disk image. 10 11This installers built by this script are legacy bundle installers that have 12been supported from the early days of OS X. In particular, they are supported 13on OS X 10.3.9, the earliest supported release for builds from this script. 14 15Beginning with Python 2.7.9, PSF practice is to build two installer variants 16using the newer flat package format, supported on 10.5+, and signed with the 17builder's Apple developer key, allowing downloaded packages to satisfy Apple's 18default Gatekeeper policy (e.g. starting with 10.8, Apple store downloads and 19Apple developer ID signed apps and installer packages). The process for 20transforming the output build artifacts into signed flat packages is not 21yet integrated into ``build-installer.py``. 22 231. 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 602. 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 104General 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 129The Recipe 130---------- 131 132Here 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 144Building other universal installers 145................................... 146 147It is also possible to build a 4-way universal installer that runs on 148OS 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 155This requires that the deployment target is 10.5, and hence 156also that you are building on at least OS X 10.5. 4-way includes 157``i386``, ``x86_64``, ``ppc``, and ``ppc64`` (G5). ``ppc64`` executable 158variants can only be run on G5 machines running 10.5. Note that, 159while OS X 10.6 is only supported on Intel-based machines, it is possible 160to run ``ppc`` (32-bit) executables unmodified thanks to the Rosetta ppc 161emulation in OS X 10.5 and 10.6. The 4-way installer variant must be 162built with Xcode 3. It is not regularly built or tested. 163 164Other ``--universal-archs`` options are ``64-bit`` (``x86_64``, ``ppc64``), 165and ``3-way`` (``ppc``, ``i386``, ``x86_64``). None of these options 166are regularly exercised; use at your own risk. 167 168 169Testing 170------- 171 172Ideally, the resulting binaries should be installed and the test suite run 173on all supported OS X releases and architectures. As a practical matter, 174that is generally not possible. At a minimum, variant 1 should be run on 175a PPC G4 system with OS X 10.5 and at least one Intel system running OS X 17610.8, 10.7, 10.6, or 10.5. Variant 2 should be run on 10.8, 10.7, and 10.6 177systems 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 182Certain tests will be skipped and some cause the interpreter to fail 183which will likely generate ``Python quit unexpectedly`` alert messages 184to be generated at several points during a test run. These are normal 185during testing and can be ignored. 186 187It is also recommend to launch IDLE and verify that it is at least 188functional. Double-click on the IDLE app icon in ``/Applications/Pythonn.n``. 189It should also be tested from the command line:: 190 191 /usr/local/bin/idlen.n 192 193