Hackable Mercurial for Windows

An approach to easily hack on the Mercurial source on Windows.


This page is no longer relevant but is kept for historical purposes.

See BuildingOnWindows for modern methodology.

1. What is the Hackable package?

Compiling Mercurial is a significant barrier to testing and developing Mercurial on Windows. This package attempts to minimize that barrier by including:

2. Downloading and using

The package can be found here. Simply download, unzip, and run the included hg.exe. This package will not interfere with your existing Mercurial or Python installation.

Note: The file mercurial-2.6-hackable.zip needs the following bugfix: The directory hg-python26 must be renamed to hg-python. Otherwise you will see the error message abort: failed to load Python DLL or ImportError: No module named os when you try to run hg.exe.

<!> There is usually no need to download new copies between releases, simply pull and update.

/!\ This package includes no global configuration, so if you're not already using Mercurial, you will need to configure your username and merge tools.

3. How it's built and how to build your own from scratch

Needed components:


4. Running the test suite under MSYS

Most of the test suite can now be run on windows too. Writing tests and debugging failures might however require both knowledge of the traditional unix environment and of the windows environment.

The tests that can’t be run on windows will automatically be skipped, so no test failures should be seen. The tests are run automatically by the hg buildbot.

Creating a hg-winhack package and running the test suite requires almost the same environment. The following instructions will thus contain a lot of duplication of the instructions given above, and the instructions could perhaps be merged. (The “hackable” mentioned above might not work in development branches.)

4.1. Install MinGW/MSYS environment

If you're hacking on ChangesetEvolution, you'll also need a suitable cURL binary. While msys supplies wget, we prefer to use curl, as it's available on macOS by default, whereas Windows always needs an extra package (either curl or wget) installed.

4.2. Build hg-winhack

# create build directory
hg clone https://www.mercurial-scm.org/repo/hg hg-winhack   # bootstrap Mercurial somehow
cd hg-winhack
# install python
wget http://python.org/ftp/python/2.7.3/python-2.7.3.msi
msiexec //i python-2.7.3.msi //qb   # avoid MSYS magic mangling of '/i'
cp -ar c:/Python27 hg-python     # python can and should now be uninstalled again
# build Mercurial extensions
hg-python/python setup.py build_ext -i --compiler=mingw32
# build hg.exe
hg-python/python setup.py build_hgexe -i --compiler=mingw32
# prepare localizations
hg-python/python setup.py build_mo
# zip it and ship it ... or continue running the test suite
cd ..
zip -r hg-winhack-x.x.zip hg-winhack/

Note that this will leave you with both a hg.exe which can be used from windows and a hg which might be picked up by MSYS bash if you have python installed.

4.3. Run the test suite

cd hg-winhack/tests
export TMPDIR=c:/tmp   # to avoid path that contains ~ which in general would require escaping
PATH="`pwd`/../hg-python:/mingw/bin:/bin" PYTHONHOME="`pwd -W`/../hg-python" ./run-tests.py --local

PATH can be extended so other non-msys tools (such as git/svn/p4?) can be found.

4.4. Alternative: Building the C extensions with Microsoft compiler

Get and install the gratis "Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1" from microsoft.com. It contains both the x86 and x64 Microsoft C/C++ compiler. When running the web-installer, you'll only need to select the features "Windows Headers and Libraries" and "Visual C++ Compliers". Deselect everything else.

Copy C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\vcvars64.bat to C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64\vcvarsamd64.bat. When compiling Python C extensions with the compilers bundled with the Windows SDK (and not Visual Studio), you must set DISTUTILS_USE_SDK=1 in the environment, else Python distutils will give you errors about not being able to find vcvarsall.bat

To build Mercurial, in a MSYS shell do (requires Python on PATH):

make local

Or using cmd.exe:

python setup.py build_ext -i
python setup.py build_hgexe -i

Depending on what Python is used (x64 or x86), the extensions will be built for x64 or x86 accordingly.

4.5. Run tests involving Git

If you have Git installed on your Windows box, hg-winhack will incorrectly detect that git command is available, and will try to run Git-related tests. It will fail to do so, because it cannot run "git.cmd" from shell.

"$COMSPEC" //C git.cmd "$@"

5. See also

CategoryDeveloper CategoryWindows CategoryHistorical

HackableMercurial (last edited 2018-12-05 04:34:18 by MattHarbison)