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