Gregory Szorc <gregory.szorc@gmail.com> [Fri, 24 Apr 2020 12:11:08 -0700] rev 44771
automation: support building Python 3 Inno installers
The core packaging code now supports building Python 3 installers
using PyOxidizer. Let's teach the automation code to invoke it so
that we produce both Python 2 and Python 3 based exe installers.
When publishing the artifacts, the Python 3 versions are preferred
over the Python 2 versions given their higher weight (10 versus 9).
This may be a controversial change. But I think making Python 3
the default is warranted, as it is the future. The Python 2 installers
are still fully supported and can be installed should issues with
Python 3 arise.
Differential Revision: https://phab.mercurial-scm.org/D8483
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 24 Apr 2020 11:48:07 -0700] rev 44770
automation: add extra arguments when building Inno
These were being fed into the template expansion but not being
used. This meant --version was not getting set when it should have
been.
Differential Revision: https://phab.mercurial-scm.org/D8482
Gregory Szorc <gregory.szorc@gmail.com> [Thu, 23 Apr 2020 18:48:36 -0700] rev 44769
packaging: add -python2 to Windows installer filenames
We just taught the Windows installers to produce Python 3 variants
built with PyOxidizer.
Our plan is to publish both Python 2 and Python 3 versions of the
installers for Mercurial 5.4.
This commit teaches the Inno and WiX installers to add an optional
string suffix to the installer name. On Python 2, that suffix is
"-python2." We reserve the existing name for the Python 3 installers,
which we want to make the default.
Differential Revision: https://phab.mercurial-scm.org/D8479
Gregory Szorc <gregory.szorc@gmail.com> [Thu, 23 Apr 2020 17:24:37 -0700] rev 44768
automation: support building Windows wheels for Python 3.7 and 3.8
The time has come to support Python 3 on Windows.
Let's teach our automation code to produce Windows wheels for
Python 3.7 and 3.8.
We could theoretically support 3.5 and 3.6. But I don't think
it is worth it. People on Windows generally use the Mercurial
installers, not wheels. And I'd prefer we limit variability
and not have to worry about supporting earlier Python versions
if it can be helped.
As part of this, we change the invocation of pip to `python.exe -m pip`,
as this is what is being recommended in Python docs these days. And
it seemed to be required to avoid a weird build error. Why, I'm not
sure. But it looks like pip was having trouble finding a Visual Studio
files when invoked as `pip.exe` but not when using `python.exe -m pip`.
Who knows.
Differential Revision: https://phab.mercurial-scm.org/D8478
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 20 Apr 2020 17:42:50 -0700] rev 44767
packaging: support building WiX installers with PyOxidizer
We initially implemented PyOxidizer support for Inno installers.
That did most of the heavy work of integrating PyOxidizer into
the packaging system. Implementing WiX installer support was
pretty straightforward.
Aspects of this patch look very similar to Inno's.
The main difference is the handling of the Visual C++
Redistributable Runtime files.
The WiX installer was formerly using merge modules to
install the VC++ 9.0 runtime because this feature is
supported by the WiX installer (it isn't easily available
to Inno installers).
Our strategy for the runtime files is to install the
vcruntime140.dll file next to hg.exe just like any other
file. While we could leverage WiX's functionality for invoking
a VCRedist installer, I don't want to deal with the complexity
at this juncture. So, we let run_pyoxidizer() copy vcruntime140.dll
into the staging directory (like it does for Inno) and our
dynamic WiX XML generator picks it up as a regular file and
installs it.
We did, however, have to teach mercurial.wxs how to conditionally
use the merge modules. But this was rather straightforward.
Comparing the file layout of the WiX installers before and
after:
* Various lib/*.{pyd, dll} files no longer exist
* python27.dll was replaced by python37.dll
* vcruntime140.dll was added
All these changes are expected due to the transition to
Python 3 and to PyOxidizer, which embeded the .pyd and .dll files
in hg.exe.
Differential Revision: https://phab.mercurial-scm.org/D8477
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 20 Apr 2020 18:24:35 -0700] rev 44766
packaging: move version derivation to run_wix_packaging()
With the previous commit moving signing inline, we no
longer need to compute the version string in build_installer()
and can instead move this logic to run_wix_packaging(). This
makes the logic in build_installer() simpler, which makes it
easier to implement alternate building mechanisms.
Differential Revision: https://phab.mercurial-scm.org/D8476
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 20 Apr 2020 17:53:20 -0700] rev 44765
packaging: integrate signing into run_wix_packaging()
Previously, signing was implemented via a separate function
which called build_installer() and then called signing
functionality.
In this model, in order to implement an alternative build
mechanism, we would have to invent a new variant to handle
signing as well.
This commit merges the signing logic into the function invoking
wix. If we pass an argument holding metadata about how to sign,
we sign hg.exe and the installer. This means all we have to
do is pass in signing info and the signing just works.
A slight change here is that signing of hg.exe happens in the
staging directory as opposed to before the staging directory
is populated. I don't think this matters.
Differential Revision: https://phab.mercurial-scm.org/D8475
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 20 Apr 2020 17:33:41 -0700] rev 44764
packaging: isolate invocation of WiX to own function
Like we did for Inno, we want to split out the building
of Mercurial from invoking the packaging tool so that we
can introduce an alternate build mechanism.
As part of this refactor, there are inconsequential changes
to file layouts. Before, some shared files such as the
WiX binaries and merge modules would be installed under
build/. Now, they are installed under build/wix-*. This
is to keep implementation simpler. But it also helps keep
build state more isolated.
Differential Revision: https://phab.mercurial-scm.org/D8474