annotate contrib/packaging/hgpackaging/pyoxidizer.py @ 47210:73f1a10320d1

packaging: use PyOxidizer for producing WiX MSI installer We recently taught our in-tree PyOxidizer configuration file to produce MSI installers with WiX using PyOxidizer's built-in support for doing so. This commit changes our WiX + PyOxidizer installer generation code to use this functionality. After this change, all the Python packaging code is doing is the following: * Building HTML documentation * Making gettext available to the build process. * Munging CLI arguments to variables for the `pyoxidizer` execution. * Invoking `pyoxidizer build`. * Copying the produced `.msi` to the `dist/` directory. Applying this stack on stable and rebuilding the 5.8 MSI installer produced the following differences from the official 5.8 installer: * .exe and .pyd files aren't byte identical (this is expected). * Various .dist-info/ directories have different names due to older versions of PyOxidizer being buggy and not properly normalizing package names. (The new behavior is correct.) * Various *.dist-info/RECORD files are different due to content divergence of files (this is expected). * The python38.dll differs due to newer PyOxidizer shipping a newer version of Python 3.8. * We now ship python3.dll because PyOxidizer now includes this file by default. * The vcruntime140.dll differs because newer PyOxidizer installs a newer version. We also now ship a vcruntime140_1.dll because newer versions of the redistributable ship 2 files now. The WiX GUIDs and IDs of installed files have likely changed as a result of PyOxidizer's different mechanism for generating those identifiers. This means that an upgrade install of the MSI will replace files instead of doing an incremental update. This is likely harmless and we've incurred this kind of breakage before. As far as I can tell, the new PyOxidizer-built MSI is functionally equivalent to the old method. Once we drop support for Python 2.7 MSI installers, we can delete the WiX code from the repository. This commit temporarily drops support for extra `.wxs` files. We raise an exception instead of silently not using them, which I think is appropriate. We should be able to add support back in by injecting state into pyoxidizer.bzl via `--var`. I just didn't want to expend cognitive load to think about the solution as part of this series. Differential Revision: https://phab.mercurial-scm.org/D10688
author Gregory Szorc <gregory.szorc@gmail.com>
date Thu, 06 May 2021 16:11:13 -0700
parents d09b36f69180
children 1e6cb23ce6da
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
44763
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
1 # pyoxidizer.py - Packaging support for PyOxidizer
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
2 #
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
3 # Copyright 2020 Gregory Szorc <gregory.szorc@gmail.com>
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
4 #
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
5 # This software may be used and distributed according to the terms of the
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
6 # GNU General Public License version 2 or any later version.
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
7
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
8 # no-check-code because Python 3 native.
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
9
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
10 import os
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
11 import pathlib
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
12 import shutil
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
13 import subprocess
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
14 import sys
47210
73f1a10320d1 packaging: use PyOxidizer for producing WiX MSI installer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47209
diff changeset
15 import typing
44763
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
16
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
17 from .downloads import download_entry
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
18 from .util import (
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
19 extract_zip_to_directory,
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
20 process_install_rules,
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
21 find_vc_runtime_dll,
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
22 )
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
23
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
24
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
25 STAGING_RULES_WINDOWS = [
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
26 ('contrib/bash_completion', 'contrib/'),
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
27 ('contrib/hgk', 'contrib/hgk.tcl'),
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
28 ('contrib/hgweb.fcgi', 'contrib/'),
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
29 ('contrib/hgweb.wsgi', 'contrib/'),
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
30 ('contrib/logo-droplets.svg', 'contrib/'),
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
31 ('contrib/mercurial.el', 'contrib/'),
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
32 ('contrib/mq.el', 'contrib/'),
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
33 ('contrib/tcsh_completion', 'contrib/'),
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
34 ('contrib/tcsh_completion_build.sh', 'contrib/'),
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
35 ('contrib/vim/*', 'contrib/vim/'),
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
36 ('contrib/win32/postinstall.txt', 'ReleaseNotes.txt'),
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
37 ('contrib/win32/ReadMe.html', 'ReadMe.html'),
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
38 ('contrib/xml.rnc', 'contrib/'),
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
39 ('contrib/zsh_completion', 'contrib/'),
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
40 ('doc/*.html', 'doc/'),
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
41 ('doc/style.css', 'doc/'),
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
42 ('COPYING', 'Copying.txt'),
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
43 ]
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
44
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
45 STAGING_RULES_APP = [
45685
57b5452a55d5 pyoxidizer: produce working Python 3 Windows installers (issue6366)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44763
diff changeset
46 ('lib/mercurial/helptext/**/*.txt', 'helptext/'),
57b5452a55d5 pyoxidizer: produce working Python 3 Windows installers (issue6366)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44763
diff changeset
47 ('lib/mercurial/defaultrc/*.rc', 'defaultrc/'),
57b5452a55d5 pyoxidizer: produce working Python 3 Windows installers (issue6366)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44763
diff changeset
48 ('lib/mercurial/locale/**/*', 'locale/'),
57b5452a55d5 pyoxidizer: produce working Python 3 Windows installers (issue6366)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44763
diff changeset
49 ('lib/mercurial/templates/**/*', 'templates/'),
44763
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
50 ]
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
51
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
52 STAGING_EXCLUDES_WINDOWS = [
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
53 "doc/hg-ssh.8.html",
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
54 ]
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
55
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
56
47207
41be7698a4fd packaging: move documentation HTML building to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 45922
diff changeset
57 def build_docs_html(source_dir: pathlib.Path):
41be7698a4fd packaging: move documentation HTML building to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 45922
diff changeset
58 """Ensures HTML documentation is built.
41be7698a4fd packaging: move documentation HTML building to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 45922
diff changeset
59
41be7698a4fd packaging: move documentation HTML building to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 45922
diff changeset
60 This will fail if docutils isn't available.
41be7698a4fd packaging: move documentation HTML building to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 45922
diff changeset
61
41be7698a4fd packaging: move documentation HTML building to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 45922
diff changeset
62 (The HTML docs aren't built as part of `pip install` so we need to build them
41be7698a4fd packaging: move documentation HTML building to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 45922
diff changeset
63 out of band.)
41be7698a4fd packaging: move documentation HTML building to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 45922
diff changeset
64 """
41be7698a4fd packaging: move documentation HTML building to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 45922
diff changeset
65 subprocess.run(
41be7698a4fd packaging: move documentation HTML building to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 45922
diff changeset
66 [sys.executable, str(source_dir / "setup.py"), "build_doc", "--html"],
41be7698a4fd packaging: move documentation HTML building to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 45922
diff changeset
67 cwd=str(source_dir),
41be7698a4fd packaging: move documentation HTML building to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 45922
diff changeset
68 check=True,
41be7698a4fd packaging: move documentation HTML building to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 45922
diff changeset
69 )
41be7698a4fd packaging: move documentation HTML building to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 45922
diff changeset
70
41be7698a4fd packaging: move documentation HTML building to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 45922
diff changeset
71
47209
d09b36f69180 packaging: extract invocation of pyoxidizer to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47208
diff changeset
72 def run_pyoxidizer(
47210
73f1a10320d1 packaging: use PyOxidizer for producing WiX MSI installer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47209
diff changeset
73 source_dir: pathlib.Path,
73f1a10320d1 packaging: use PyOxidizer for producing WiX MSI installer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47209
diff changeset
74 build_dir: pathlib.Path,
73f1a10320d1 packaging: use PyOxidizer for producing WiX MSI installer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47209
diff changeset
75 target_triple: str,
73f1a10320d1 packaging: use PyOxidizer for producing WiX MSI installer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47209
diff changeset
76 build_vars: typing.Optional[typing.Dict[str, str]] = None,
73f1a10320d1 packaging: use PyOxidizer for producing WiX MSI installer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47209
diff changeset
77 target: typing.Optional[str] = None,
47209
d09b36f69180 packaging: extract invocation of pyoxidizer to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47208
diff changeset
78 ) -> pathlib.Path:
d09b36f69180 packaging: extract invocation of pyoxidizer to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47208
diff changeset
79 """Run `pyoxidizer` in an environment with access to build dependencies.
44763
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
80
47209
d09b36f69180 packaging: extract invocation of pyoxidizer to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47208
diff changeset
81 Returns the output directory that pyoxidizer would have used for build
d09b36f69180 packaging: extract invocation of pyoxidizer to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47208
diff changeset
82 artifacts. Actual build artifacts are likely in a sub-directory with the
d09b36f69180 packaging: extract invocation of pyoxidizer to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47208
diff changeset
83 name of the pyoxidizer build target that was built.
44763
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
84 """
47210
73f1a10320d1 packaging: use PyOxidizer for producing WiX MSI installer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47209
diff changeset
85 build_vars = build_vars or {}
73f1a10320d1 packaging: use PyOxidizer for producing WiX MSI installer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47209
diff changeset
86
44763
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
87 # We need to make gettext binaries available for compiling i18n files.
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
88 gettext_pkg, gettext_entry = download_entry('gettext', build_dir)
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
89 gettext_dep_pkg = download_entry('gettext-dep', build_dir)[0]
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
90
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
91 gettext_root = build_dir / ('gettext-win-%s' % gettext_entry['version'])
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
92
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
93 if not gettext_root.exists():
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
94 extract_zip_to_directory(gettext_pkg, gettext_root)
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
95 extract_zip_to_directory(gettext_dep_pkg, gettext_root)
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
96
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
97 env = dict(os.environ)
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
98 env["PATH"] = "%s%s%s" % (
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
99 env["PATH"],
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
100 os.pathsep,
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
101 str(gettext_root / "bin"),
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
102 )
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
103
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
104 args = [
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
105 "pyoxidizer",
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
106 "build",
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
107 "--path",
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
108 str(source_dir / "rust" / "hgcli"),
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
109 "--release",
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
110 "--target-triple",
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
111 target_triple,
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
112 ]
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
113
47210
73f1a10320d1 packaging: use PyOxidizer for producing WiX MSI installer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47209
diff changeset
114 for k, v in sorted(build_vars.items()):
73f1a10320d1 packaging: use PyOxidizer for producing WiX MSI installer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47209
diff changeset
115 args.extend(["--var", k, v])
73f1a10320d1 packaging: use PyOxidizer for producing WiX MSI installer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47209
diff changeset
116
73f1a10320d1 packaging: use PyOxidizer for producing WiX MSI installer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47209
diff changeset
117 if target:
73f1a10320d1 packaging: use PyOxidizer for producing WiX MSI installer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47209
diff changeset
118 args.append(target)
73f1a10320d1 packaging: use PyOxidizer for producing WiX MSI installer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47209
diff changeset
119
44763
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
120 subprocess.run(args, env=env, check=True)
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
121
47209
d09b36f69180 packaging: extract invocation of pyoxidizer to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47208
diff changeset
122 return source_dir / "build" / "pyoxidizer" / target_triple / "release"
d09b36f69180 packaging: extract invocation of pyoxidizer to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47208
diff changeset
123
d09b36f69180 packaging: extract invocation of pyoxidizer to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47208
diff changeset
124
d09b36f69180 packaging: extract invocation of pyoxidizer to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47208
diff changeset
125 def create_pyoxidizer_install_layout(
d09b36f69180 packaging: extract invocation of pyoxidizer to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47208
diff changeset
126 source_dir: pathlib.Path,
d09b36f69180 packaging: extract invocation of pyoxidizer to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47208
diff changeset
127 build_dir: pathlib.Path,
d09b36f69180 packaging: extract invocation of pyoxidizer to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47208
diff changeset
128 out_dir: pathlib.Path,
d09b36f69180 packaging: extract invocation of pyoxidizer to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47208
diff changeset
129 target_triple: str,
d09b36f69180 packaging: extract invocation of pyoxidizer to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47208
diff changeset
130 ):
d09b36f69180 packaging: extract invocation of pyoxidizer to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47208
diff changeset
131 """Build Mercurial with PyOxidizer and copy additional files into place.
d09b36f69180 packaging: extract invocation of pyoxidizer to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47208
diff changeset
132
d09b36f69180 packaging: extract invocation of pyoxidizer to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47208
diff changeset
133 After successful completion, ``out_dir`` contains files constituting a
d09b36f69180 packaging: extract invocation of pyoxidizer to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47208
diff changeset
134 Mercurial install.
d09b36f69180 packaging: extract invocation of pyoxidizer to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47208
diff changeset
135 """
d09b36f69180 packaging: extract invocation of pyoxidizer to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47208
diff changeset
136
d09b36f69180 packaging: extract invocation of pyoxidizer to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47208
diff changeset
137 run_pyoxidizer(source_dir, build_dir, target_triple)
d09b36f69180 packaging: extract invocation of pyoxidizer to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 47208
diff changeset
138
44763
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
139 if "windows" in target_triple:
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
140 target = "app_windows"
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
141 else:
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
142 target = "app_posix"
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
143
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
144 build_dir = (
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
145 source_dir / "build" / "pyoxidizer" / target_triple / "release" / target
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
146 )
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
147
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
148 if out_dir.exists():
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
149 print("purging %s" % out_dir)
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
150 shutil.rmtree(out_dir)
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
151
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
152 # Now assemble all the files from PyOxidizer into the staging directory.
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
153 shutil.copytree(build_dir, out_dir)
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
154
45685
57b5452a55d5 pyoxidizer: produce working Python 3 Windows installers (issue6366)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44763
diff changeset
155 # Move some of those files around. We can get rid of this once Mercurial
57b5452a55d5 pyoxidizer: produce working Python 3 Windows installers (issue6366)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44763
diff changeset
156 # is taught to use the importlib APIs for reading resources.
44763
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
157 process_install_rules(STAGING_RULES_APP, build_dir, out_dir)
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
158
47207
41be7698a4fd packaging: move documentation HTML building to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 45922
diff changeset
159 build_docs_html(source_dir)
44763
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
160
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
161 if "windows" in target_triple:
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
162 process_install_rules(STAGING_RULES_WINDOWS, source_dir, out_dir)
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
163
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
164 # Write out a default editor.rc file to configure notepad as the
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
165 # default editor.
45922
37bcd7f5a543 pyoxidizer: make sure defaultrc directory exists before trying to write to it
Augie Fackler <augie@google.com>
parents: 45685
diff changeset
166 os.makedirs(out_dir / "defaultrc", exist_ok=True)
44763
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
167 with (out_dir / "defaultrc" / "editor.rc").open(
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
168 "w", encoding="utf-8"
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
169 ) as fh:
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
170 fh.write("[ui]\neditor = notepad\n")
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
171
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
172 for f in STAGING_EXCLUDES_WINDOWS:
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
173 p = out_dir / f
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
174 if p.exists():
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
175 print("removing %s" % p)
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
176 p.unlink()
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
177
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
178 # Add vcruntimeXXX.dll next to executable.
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
179 vc_runtime_dll = find_vc_runtime_dll(x64="x86_64" in target_triple)
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
180 shutil.copy(vc_runtime_dll, out_dir / vc_runtime_dll.name)