Skip to content
Snippets Groups Projects
Commit 603efb3845ba authored by Gregory Szorc's avatar Gregory Szorc
Browse files

pyoxidizer: support producing MSI installers

Newer versions of PyOxidizer have support for building WiX MSI
installers "natively." Essentially, you can script the definition
of your WiX installer via Starlark and PyOxidizer can invoke
WiX tools to produce the installer.

This commit teaches our PyOxidizer config file to produce MSI
installers similarly to how
`contrib/packaging/packging.py wix` would do it.

We had to make a very minor change to `mercurial.wxs` to reflect
different paths depending on who builds. This is because when
PyOxidizer builds WiX installers, it does so from an isolated
directory, not Mercurial's source directory. We simply copy the
files into the build environment so they are accessible.

After this change, running `pyoxidizer build msi` produces a nearly
identical install layout to what the previous method produces.
When I applied this series on top of the 5.8 tag, here is the
list of differences and explanations:

* docs/*.html files are missing from the new installer because the
  Python build environment doesn't have docutils.
* .pyd and .exe files differ, likely because I'm using a different
  Visual Studio toolchain on my local computer than the official build
  environment.
* Various .dist-info/ directories have different names. This is
  because older versions of PyOxidizer had buggy behavior and weren't
  properly normalizing package names in .dist-info/ directories. e.g.
  we went from `cached-property-1.5.2.dist-info` to
  `cached_property-1.5.2.dist-info`.
* Translations (.mo files) may be missing if gettext isn't in %Path%.
  This is because the packaging.py code installs gettext and ensures
  it can be found.
* Some *.dist-info/RECORD files vary due to SHA-256 content digest
  divergence due to build environment differences. (This should be
  harmless.)
* The new install layout ships a python3.dll because newer versions
  of PyOxidizer ship this file.
* The new install layout has a different vcruntime140.dll and also a
  vcruntime140_1.dll because newer versions of PyOxidizer ship a
  newer version of the Visual C++ Redistributable Runtime.

The new PyOxidizer functionality is not yet integrated with
packaging.py. This will come in a subsequent commit. So for now, the
new functionality introduced here is unused.

Differential Revision: https://phab.mercurial-scm.org/D10683
parent 3380848c6e04
No related branches found
No related tags found
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment