1Quick Build Info
2================
3
4For testing, the installer should be built with the Tools/msi/build.bat
5script:
6
7 build.bat [-x86] [-x64] [--doc]
8
9For an official release, the installer should be built with the
10Tools/msi/buildrelease.bat script and environment variables:
11
12 set PYTHON=<path to Python 2.7 or 3.4>
13 set SPHINXBUILD=<path to sphinx-build.exe>
14 set PATH=<path to Git (git.exe)>;
15 <path to HTML Help Compiler (hhc.exe)>;%PATH%
16
17 buildrelease.bat [-x86] [-x64] [-D] [-B]
18 [-o <output directory>] [-c <certificate name>]
19
20See the Building the Installer section for more information.
21
22Overview
23========
24
25Python is distributed on Windows as an installer that will configure the
26user's system. This allows users to have a functioning copy of Python
27without having to build it themselves.
28
29The main tasks of the installer are:
30
31* copy required files into the expected layout
32* configure system settings so the installation can be located by
33 other programs
34* add entry points for modifying, repairing and uninstalling Python
35* make it easy to launch Python, its documentation, and IDLE
36
37Each of these is discussed in a later section of this document.
38
39Structure of the Installer
40==========================
41
42The installer is structured as a 'layout', which consists of a number of
43CAB and MSI files and a single EXE.
44
45The EXE is the main entry point into the installer. It contains the UI
46and command-line logic, as well as the ability to locate and optionally
47download other parts of the layout.
48
49Each MSI contains the logic required to install a component or feature
50of Python. These MSIs should not be launched directly by users. MSIs can
51be embedded into the EXE or automatically downloaded as needed.
52
53Each CAB contains the files making up a Python installation. CABs are
54embedded into their associated MSI and are never seen by users.
55
56MSIs are only required when the related feature or component is being
57installed. When components are not selected for installation, the
58associated MSI is not downloaded. This allows the installer to offer
59options to install debugging symbols and binaries without increasing
60the initial download size by separating them into their own MSIs.
61
62Building the Installer
63======================
64
65Before building the installer, download extra build dependencies using
66Tools\msi\get_externals.bat. (Note that this is in addition to the
67similarly named file in PCbuild.)
68
69One of the dependencies used in builds is WiX, a toolset that lets developers
70create installers for Windows Installer, the Windows installation engine. WiX
71has a dependency on the Microsoft .NET Framework Version 3.5 (which may not be
72configured on recent versions of Windows, such as Windows 10). If you are
73building on a recent Windows version, use the Control Panel (Programs | Programs
74and Features | Turn Windows Features on or off) and ensure that the entry
75".NET Framework 3.5 (includes .NET 2.0 and 3.0)" is enabled.
76
77For testing, the installer should be built with the Tools/msi/build.bat
78script:
79
80 build.bat [-x86] [-x64] [--doc] [--test-marker] [--pack]
81
82This script will build the required configurations of Python and
83generate an installer layout in PCbuild/(win32|amd64)/en-us.
84
85Specify -x86 and/or -x64 to build for each platform. If neither is
86specified, both platforms will be built. Currently, both the debug and
87release versions of Python are required for the installer.
88
89Specify --doc to build the documentation (.chm) file. If the file is not
90available, it will simply be excluded from the installer. Ensure
91%PYTHON% and %SPHINXBUILD% are set when passing this option. You may
92also set %HTMLHELP% to the Html Help Compiler (hhc.exe), or put HHC on
93your PATH or in externals/.
94
95Specify --test-marker to build an installer that works side-by-side with
96an official Python release. All registry keys and install locations will
97include an extra marker to avoid overwriting files. This marker is
98currently an 'x' prefix, but may change at any time.
99
100Specify --pack to build an installer that does not require all MSIs to
101be available alongside. This takes longer, but is easier to share.
102
103
104For an official release, the installer should be built with the
105Tools/msi/buildrelease.bat script:
106
107 set PYTHON=<path to Python 2.7 or 3.4>
108 set SPHINXBUILD=<path to sphinx-build.exe>
109 set PATH=<path to Git (git.exe)>;
110 <path to HTML Help Compiler (hhc.exe)>;%PATH%
111
112 buildrelease.bat [-x86] [-x64] [-D] [-B]
113 [-o <output directory>] [-c <certificate name>]
114
115Specify -x86 and/or -x64 to build for each platform. If neither is
116specified, both platforms will be built. Currently, both the debug and
117release versions of Python are required for the installer.
118
119Specify -D to skip rebuilding the documentation. The documentation is
120required for a release and the build will fail if it is not available.
121
122Specify -B to skip rebuilding Python. This is useful to only rebuild the
123installer layout after a previous call to buildrelease.bat.
124
125Specify -o to set an output directory. The installer layouts will be
126copied to platform-specific subdirectories of this path.
127
128Specify -c to choose a code-signing certificate to be used for all the
129signable binaries in Python as well as each file making up the
130installer. Official releases of Python must be signed.
131
132Ensure %PYTHON% and %SPHINXBUILD% are set when passing this option. You
133may also set %HTMLHELP% to the Html Help Compiler (hhc.exe), or put HHC
134on your PATH or in externals/. You will also need Git (git.exe) on
135your PATH.
136
137If WiX is not found on your system, it will be automatically downloaded
138and extracted to the externals/ directory.
139
140To manually build layouts of the installer, build one of the projects in
141the bundle folder.
142
143 msbuild bundle\snapshot.wixproj
144 msbuild bundle\releaseweb.wixproj
145 msbuild bundle\releaselocal.wixproj
146 msbuild bundle\full.wixproj
147
148snapshot.wixproj produces a test installer versioned based on the date.
149
150releaseweb.wixproj produces a release installer that does not embed any
151of the layout.
152
153releaselocal.wixproj produces a release installer that embeds the files
154required for a default installation.
155
156full.wixproj produces a test installer that embeds the entire layout.
157
158The following properties may be passed when building these projects.
159
160 /p:BuildForRelease=(true|false)
161 When true, adds extra verification to ensure a complete installer is
162 produced. Defaults to false.
163
164 /p:ReleaseUri=(any URI)
165 Used to generate unique IDs for the installers to allow side-by-side
166 installation. Forks of Python can use the same installer infrastructure
167 by providing a unique URI for this property. It does not need to be an
168 active internet address. Defaults to $(ComputerName).
169
170 Official releases use http://www.python.org/(architecture name)
171
172 /p:DownloadUrlBase=(any URI)
173 Specifies the base of a URL where missing parts of the installer layout
174 can be downloaded from. The build version and architecture will be
175 appended to create the full address. If omitted, missing components will
176 not be automatically downloaded.
177
178 /p:DownloadUrl=(any URI)
179 Specifies the full URL where missing parts of the installer layout can
180 be downloaded from. Should normally include '{2}', which will be
181 substituted for the filename. If omitted, missing components will not be
182 automatically downloaded. If specified, this value overrides
183 DownloadUrlBase.
184
185 /p:SigningCertificate=(certificate name)
186 Specifies the certificate to sign the installer layout with. If omitted,
187 the layout will not be signed.
188
189 /p:RebuildAll=(true|false)
190 When true, rebuilds all of the MSIs making up the layout. Defaults to
191 true.
192
193Uploading the Installer
194=======================
195
196For official releases, the uploadrelease.bat script should be used.
197
198You will require PuTTY so that plink.exe and pscp.exe can be used, and your
199SSH key can be activated in pageant.exe. PuTTY should be either on your path
200or in %ProgramFiles(x86)%\PuTTY.
201
202To include signatures for each uploaded file, you will need gpg2.exe on your
203path or have run get_externals.bat. You may also need to "gpg2.exe --import"
204your key before running the upload script.
205
206 uploadrelease.bat --host <host> --user <username> [--dry-run] [--no-gpg]
207
208The host is the URL to the server. This can be provided by the Release
209Manager. You should be able to SSH to this address.
210
211The username is your own username, which you have permission to SSH into
212the server containing downloads.
213
214Use --dry-run to display the generated upload commands without executing
215them. Signatures for each file will be generated but not uploaded unless
216--no-gpg is also passed.
217
218Use --no-gpg to suppress signature generation and upload.
219
220The default target directory (which appears in uploadrelease.proj) is
221correct for official Python releases, but may be overridden with
222--target <path> for other purposes. This path should generally not include
223any version specifier, as that will be added automatically.
224
225Modifying the Installer
226=======================
227
228The code for the installer is divided into three main groups: packages,
229the bundle and the bootstrap application.
230
231Packages
232--------
233
234Packages appear as subdirectories of Tools/msi (other than the bundle/
235directory). The project file is a .wixproj and the build output is a
236single MSI. Packages are built with the WiX Toolset. Some project files
237share source files and use preprocessor directives to enable particular
238features. These are typically used to keep the sources close when the
239files are related, but produce multiple independent packages.
240
241A package is the smallest element that may be independently installed or
242uninstalled (as used in this installer). For example, the test suite has
243its own package, as users can choose to add or remove it after the
244initial installation.
245
246All the files installed by a single package should be related, though
247some packages may not install any files. For example, the pip package
248executes the ensurepip package, but does not add or remove any of its
249own files. (It is represented as a package because of its
250installed/uninstalled nature, as opposed to the "precompile standard
251library" option, for example.) Dependencies between packages are handled
252by the bundle, but packages should detect when dependencies are missing
253and raise an error.
254
255Packages that include a lot of files may use an InstallFiles element in
256the .wixproj file to generate sources. See lib/lib.wixproj for an
257example, and msi.targets and csv_to_wxs.py for the implementation. This
258element is also responsible for generating the code for cleaning up and
259removing __pycache__ folders in any directory containing .py files.
260
261All packages are built with the Tools/msi/common.wxs file, and so any
262directory or property in this file may be referenced. Of particular
263interest:
264
265 REGISTRYKEY (property)
266 The registry key for the current installation.
267
268 InstallDirectory (directory)
269 The root install directory for the current installation. Subdirectories
270 are also specified in this file (DLLs, Lib, etc.)
271
272 MenuDir (directory)
273 The Start Menu folder for the current installation.
274
275 UpgradeTable (property)
276 Every package should reference this property to include upgrade
277 information.
278
279 OptionalFeature (Component)
280 Packages that may be enabled or disabled should reference this component
281 and have an OPTIONAL_FEATURES entry in the bootstrap application to
282 properly handle Modify and Upgrade.
283
284The .wxl_template file is specially handled by the build system for this
285project to perform {{substitutions}} as defined in msi.targets. They
286should be included in projects as <WxlTemplate> items, where .wxl files
287are normally included as <EmbeddedResource> items.
288
289Bundle
290------
291
292The bundle is compiled to the main EXE entry point that for most users
293will represent the Python installer. It is built from Tools/msi/bundle
294with packages references in Tools/msi/bundle/packagegroups.
295
296Build logic for the bundle is in bundle.targets, but should be invoked
297through one of the .wixproj files as described in Building the
298Installer.
299
300The UI is separated between Default.thm (UI layout), Default.wxl
301(strings), bundle.wxs (properties) and the bootstrap application.
302Bundle.wxs also contains the chain, which is the list of packages to
303install and the order they should be installed in. These refer to named
304package groups in bundle/packagegroups.
305
306Each package group specifies one or more packages to install. Most
307packages require two separate entries to support both per-user and
308all-users installations. Because these reuse the same package, it does
309not increase the overall size of the package.
310
311Package groups refer to payload groups, which allow better control over
312embedding and downloading files than the default settings. Whether files
313are embedded and where they are downloaded from depends on settings
314created by the project files.
315
316Package references can include install conditions that determine when to
317install the package. When a package is a dependency for others, the
318condition should be crafted to ensure it is installed.
319
320MSI packages are installed or uninstalled based on their current state
321and the install condition. This makes them most suitable for features
322that are clearly present or absent from the user's machine.
323
324EXE packages are executed based on a customisable condition that can be
325omitted. This makes them suitable for pre- or post-install tasks that
326need to run regardless of whether features have been added or removed.
327
328Bootstrap Application
329---------------------
330
331The bootstrap application is a C++ application that controls the UI and
332installation. While it does not directly compile into the main EXE of
333the installer, it forms the main active component. Most of the
334installation functionality is provided by WiX, and so the bootstrap
335application is predominantly responsible for the code behind the UI that
336is defined in the Default.thm file. The bootstrap application code is in
337bundle/bootstrap and is built automatically when building the bundle.
338
339Installation Layout
340===================
341
342There are two installation layouts for Python on Windows, with the only
343differences being supporting files. A layout is selected implicitly
344based on whether the install is for all users of the machine or just for
345the user performing the installation.
346
347The default installation location when installing for all users is
348"%ProgramFiles%\Python3X" for the 64-bit interpreter and
349"%ProgramFiles(x86)%\Python3X-32" for the 32-bit interpreter. (Note that
350the latter path is equivalent to "%ProgramFiles%\Python3X-32" when
351running a 32-bit version of Windows.) This location requires
352administrative privileges to install or later modify the installation.
353
354The default installation location when installing for the current user
355is "%LocalAppData%\Programs\Python\Python3X" for the 64-bit interpreter
356and "%LocalAppData%\Programs\Python\Python3X-32" for the 32-bit
357interpreter. Only the current user can access this location. This
358provides a suitable level of protection against malicious modification
359of Python's files.
360
361(Default installation locations are set in Tools\msi\bundle\bundle.wxs.)
362
363Within this install directory is the following approximate layout:
364
365.\python[w].exe The core executable files
366.\DLLs Stdlib extensions (*.pyd) and dependencies
367.\Doc Documentation (*.chm)
368.\include Development headers (*.h)
369.\Lib Standard library
370.\Lib\test Test suite
371.\libs Development libraries (*.lib)
372.\Scripts Launcher scripts (*.exe, *.py)
373.\tcl Tcl dependencies (*.dll, *.tcl and others)
374.\Tools Tool scripts (*.py)
375
376When installed for all users, the following files are installed to
377either "%SystemRoot%\System32" or "%SystemRoot%\SysWOW64" as
378appropriate. For the current user, they are installed in the Python
379install directory.
380
381.\python3x.dll The core interpreter
382.\python3.dll The stable ABI reference
383
384When installed for all users, the following files are installed to
385"%SystemRoot%" (typically "C:\Windows") to ensure they are always
386available on PATH. (See Launching Python below.) For the current user,
387they are installed in "%LocalAppData%\Programs\Python\PyLauncher".
388
389.\py[w].exe PEP 397 launcher
390
391System Settings
392===============
393
394On installation, registry keys are created so that other applications
395can locate and identify installations of Python. The locations of these
396keys vary based on the install type.
397
398For 64-bit interpreters installed for all users, the root key is:
399 HKEY_LOCAL_MACHINE\Software\Python\PythonCore\3.X
400
401For 32-bit interpreters installed for all users on a 64-bit operating
402system, the root key is:
403 HKEY_LOCAL_MACHINE\Software\Wow6432Node\Python\PythonCore\3.X-32
404
405For 32-bit interpreters installed for all users on a 32-bit operating
406system, the root key is:
407 HKEY_LOCAL_MACHINE\Software\Python\PythonCore\3.X-32
408
409For 64-bit interpreters installed for the current user:
410 HKEY_CURRENT_USER\Software\Python\PythonCore\3.X
411
412For 32-bit interpreters installed for the current user:
413 HKEY_CURRENT_USER\Software\Python\PythonCore\3.X-32
414
415When the core Python executables are installed, a key "InstallPath" is
416created within the root key with its default value set to the
417executable's install directory. A value named "ExecutablePath" is added
418with the full path to the main Python interpreter, and a key
419"InstallGroup" is created with its default value set to the product
420name "Python 3.X".
421
422When the Python standard library is installed, a key "PythonPath" is
423created within the root key with its default value set to the full path
424to the Lib folder followed by the path to the DLLs folder, separated by
425a semicolon.
426
427When the documentation is installed, a key "Help" is created within the
428root key, with a subkey "Main Python Documentation" with its default
429value set to the full path to the installed CHM file.
430
431
432The py.exe launcher is installed as part of a regular Python install,
433but using a separate mechanism that allows it to more easily span
434versions of Python. As a result, it has different root keys for its
435registry entries:
436
437When installed for all users on a 64-bit operating system, the
438launcher's root key is:
439 HKEY_LOCAL_MACHINE\Software\Wow6432Node\Python\Launcher
440
441When installed for all users on a 32-bit operating system, the
442launcher's root key is:
443 HKEY_LOCAL_MACHINE\Software\Python\Launcher
444
445When installed for the current user:
446 HKEY_CURRENT_USER\Software\Python\Launcher
447
448When the launcher is installed, a key "InstallPath" is created within
449its root key with its default value set to the launcher's install
450directory. File associations are also created for .py, .pyw, .pyc and
451.pyo files.
452
453Launching Python
454================
455
456When a feature offering user entry points in the Start Menu is
457installed, a folder "Python 3.X" is created. Every shortcut should be
458created within this folder, and each shortcut should include the version
459and platform to allow users to identify the shortcut in a search results
460page.
461
462The core Python executables creates a shortcut "Python 3.X (32-bit)" or
463"Python 3.X (64-bit)" depending on the interpreter.
464
465The documentation creates a shortcut "Python 3.X 32-bit Manuals" or
466"Python 3.X 64-bit Manuals". The documentation is identical for all
467platforms, but the shortcuts need to be separate to avoid uninstallation
468conflicts.
469
470Installing IDLE creates a shortcut "IDLE (Python 3.X 32-bit)" or "IDLE
471(Python 3.X 64-bit)" depending on the interpreter.
472
473
474For users who often launch Python from a Command Prompt, an option is
475provided to add the directory containing python.exe to the user or
476system PATH variable. If the option is selected, the install directory
477and the Scripts directory will be added at the start of the system PATH
478for an all users install and the user PATH for a per-user install.
479
480When the user only has one version of Python installed, this will behave
481as expected. However, because Windows searches the system PATH before
482the user PATH, users cannot override a system-wide installation of
483Python on their PATH. Further, because the installer can only prepend to
484the path, later installations of Python will take precedence over
485earlier installations, regardless of interpreter version.
486
487Because it is not possible to automatically create a sensible PATH
488configuration, users are recommended to use the py.exe launcher and
489manually modify their PATH variable to add Scripts directories in their
490preferred order. System-wide installations of Python should consider not
491modifying PATH, or using an alternative technology to modify their
492users' PATH variables.
493
494
495The py.exe launcher is recommended because it uses a consistent and
496sensible search order for Python installations. User installations are
497preferred over system-wide installs, and later versions are preferred
498regardless of installation order (with the exception that py.exe
499currently prefers 2.x versions over 3.x versions without the -3 command
500line argument).
501
502For both 32-bit and 64-bit interpreters, the 32-bit version of the
503launcher is installed. This ensures that the search order is always
504consistent (as the 64-bit launcher is subtly different from the 32-bit
505launcher) and also avoids the need to install it multiple times. Future
506versions of Python will upgrade the launcher in-place, using Windows
507Installer's upgrade functionality to avoid conflicts with earlier
508installed versions.
509
510When installed, file associations are created for .py, .pyc and .pyo
511files to launch with py.exe and .pyw files to launch with pyw.exe. This
512makes Python files respect shebang lines by default and also avoids
513conflicts between multiple Python installations.
514
515
516Repair, Modify and Uninstall
517============================
518
519After installation, Python may be modified, repaired or uninstalled by
520running the original EXE again or via the Programs and Features applet
521(formerly known as Add or Remove Programs).
522
523Modifications allow features to be added or removed. The install
524directory and kind (all users/single user) cannot be modified. Because
525Windows Installer caches installation packages, removing features will
526not require internet access unless the package cache has been corrupted
527or deleted. Adding features that were not previously installed and are
528not embedded or otherwise available will require internet access.
529
530Repairing will rerun the installation for all currently installed
531features, restoring files and registry keys that have been modified or
532removed. This operation generally will not redownload any files unless
533the cached packages have been corrupted or deleted.
534
535Removing Python will clean up all the files and registry keys that were
536created by the installer, as well as __pycache__ folders that are
537explicitly handled by the installer. Python packages installed later
538using a tool like pip will not be removed. Some components may be
539installed by other installers and these will not be removed if another
540product has a dependency on them.
541
542