Differences between revisions 1 and 77 (spanning 76 versions)
Revision 1 as of 2005-08-26 00:50:20
Size: 4127
Editor: waste
Comment:
Revision 77 as of 2008-10-30 11:45:34
Size: 11725
Comment: Correct env variable is MSSdk
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
'''Note:''' you probably want the prepackaged Windows version from BinaryPackages!
Line 4: Line 6:
 * a C compiler (this is needed to compile some extensions used by ["Mercurial"], so it's needed at setup-time only and not to run Mercurial itself)  * a C compiler (this is needed to compile some extensions used by Mercurial, so it's needed at setup-time only and not to run Mercurial itself)
Line 6: Line 8:
 * a three-way MergeProgram
 * a three-way [:MergeProgram:merge program]

If you are using [http://www.python.org python.org]'s Python, you will find that the [http://sourceforge.net/project/showfiles.php?group_id=78018&package_id=79063 win32 API extensions] make a huge performance difference when you use the {{{clone}}} command (but see the caveats below about hardlinks on Windows). If you are using Python 2.4, you will also need [http://starship.python.net/crew/mhammond/win32/Downloads.html mfc71.dll]. (These extensions are already shipped as part of [http://www.activestate.com/Products/ActivePython/ ActivePython], but Active``Python is not completely open source software.)

See [:BuildingWindowsInstaller] for instructions to build a Mercurial installer. [:BuildingOnWindows] has some hints about how to build Mercurial on Windows.

-------
Line 13: Line 20:
python setup.py install
}}}

in the directory where you unpacked the sources, and everything would "just work".
python setup.py install --force
}}}

in the directory where you unpacked the sources, and everything would "just work". The use of {{{-f/--force}}} switch makes sure that any old installation is overwritten.

== Other Windows Tips ==
[[TableOfContents]]
Line 20: Line 29:
By default, Mercurial (the executable) gets installed in a [=Scripts] folder under your Python installation folder. By default, Mercurial (the executable) gets installed in a {{{Scripts}}} folder under your Python installation folder.
Line 24: Line 33:
If you are running a Windows of the 9x series (Windows 95, 98 or ME), create a file called [=hg.bat] with the following content: If you are running a Windows of the 9x series (Windows 95, 98 or ME), create a file called {{{hg.bat}}} with the following content:
Line 28: Line 37:
{{{
Line 30: Line 38:
{{{
Line 33: Line 40:

For example, if you installed Python in [=c:\python], the content of the file would be
For example, if you installed Python in {{{c:\python}}}, the content of the file would be
Line 38: Line 44:
{{{
Line 40: Line 45:
{{{
Line 43: Line 47:

Under Windows NT, create a file called [=hg.cmd] with the following content:
Under Windows NT, create a file called {{{hg.cmd}}} with the following content:
Line 49: Line 52:

For example, if you installed Python in [=c:\python], the content of the file would be
For example, if you installed Python in {{{c:\python}}}, the content of the file would be
Line 56: Line 58:
=== Python and Ming``W32 ===

By default, Python and Active``Python will look for Microsoft Visual C to compile the extensions, so you have to tell [=setup.py] to use the Ming``W32 compiler instead. You can do this by running

{{{
python setup.py build -c mingw32
{{{
python setup.py install --skip-build
}}}

If you are not familiar with !mingw32, you will first need to download and install the following packages, in the order given:

{{{
msys
{{{
msysDTK
}}}

Afterwards, download and install the following packages, unpacking them to the directory where you installed mingw:

{{{
mingw-runtime
{{{
gcc-core
{{{
binutils
{{{
w32api
}}}
An alternative scheme that works better for some is to search for hg on the PATH.
If you are using hg.exe it should work fine. For the python version of hg you
should be able to simply rename 'hg' to 'hg.py' and assuming you have the .py extension
configured it will be invoked. It is invoked, but there is a long standing redirection
bug in Windows, and on XP there are sometimes problems with exit statuses being lost
with this form of execution. So the following batch file is a solution -- place it in
your PATH and it will find 'hg' without a .py extension in you PATH and invoke it
properly: (name the file '''hg.cmd''')
{{{
@echo off
for /f %%i in ("hg") DO set HGSCRIPT="%%~$PATH:i"
if %HGSCRIPT% == "" (
 echo Cannot find hg on PATH
 exit /b 1
)
python %HGSCRIPT% %*
}}}

An alternative is to add .py to the PATHEXT environment variable. Provided you have .py files set-up to run automatically when invoked, this allows you to run python scripts from the command line without the ending .py. This option also works if you are using UTF-8 in the Windows console (i.e code page 65001) which causes BAT and CMD files to stop working.

=== Python and MingW32 ===

By default, Python and Active``Python will look for Microsoft Visual C to compile the extensions, so you have to tell {{{setup.py}}} to use the Ming``W32 compiler instead. You can do this by running

{{{
python setup.py build --force -c mingw32
python setup.py install --force --skip-build
}}}
or more briefly:
{{{
python setup.py build -f -c mingw32 install -f
}}}

If you are not familiar with mingw32, you will first need to download and install the following packages, in the order given:

{{{
msys.exe
msysDTK.exe
}}}
Afterwards, download and install the following package, installing it in the directory where you installed the msys package (i.e. {{{c:\msys\1.0\}}})

{{{
MinGW.exe
}}}
Line 91: Line 107:
set PATH=%PATH%;c:\python24;c:\mingw\1.0\bin
}}}

=== Active``Python and MS Visual C ===
set PATH=%PATH%;c:\python24;c:\msys\1.0\mingw\bin
}}}


If you encounter compiler error in Mercurial versions 0.9.2 and up, you may need libpython24.a in PYTHONPATH\libs. If that's the case, you need to:

{{{
pexports C:\WINDOWS\system32\python24.dll > python24.def
dlltool --dllname C:\WINDOWS\system32\python24.dll --def python24.def --output-lib C:\Python24\libs\libpython24.a
}}}

Then the above setup.py script should run properly.


=== Easier MingW32 based build via Cygwin ===

It is easier to install MinGW32 via Cygwin as it has a single graphical installer. After installing, mingw32 via Cygwin installer ({{{setup.exe}}}), add cygwin bin directory to the path and follow the mingw32 build instructions. e.g.

{{{
set PATH=%PATH%;c:\python24;c:\cygwin\bin
python setup.py build --force -c mingw32
python setup.py install --force --skip-build
}}}

=== ActivePython and MS Visual C ===
Line 106: Line 143:
{{{
Line 108: Line 144:
{{{
Line 110: Line 145:
{{{
Line 114: Line 148:
An alternative to the above is to use a shell with the environment
already set up for compilation, and then tell distutils to trust
the executables available in the path:
{{{
set DISTUTILS_USE_SDK=1
set MSSdk=1
}}}
(see [http://docs.python.org/dist/module-distutils.msvccompiler.html distutils msvc] doc)

This way, I successfully built hg for Active``Python 2.4.2 and Active``Python 2.5.1,
using Visual Studio 2005.

=== Python 2.5 for Windows/x64 ===

Note that pywin32 has not yet been ported to the Windows/x64 platform.

==== The python.org distribution and the MS platform SDK compiler ====

If you happen to use the stock [http://www.python.org/ftp/python/2.5/python-2.5.amd64.msi python-2.5.amd64.msi] from python.org, you can build Mercurial using the Platform SDK compiler
(I used the Microsoft Platform SDK for Windows Server 2003 R2).

There's one catch though: if you simply run `python setup.py build`, you'll likely get the following error:
{{{
...
AttributeError: MSVCCompiler instance has no attribute '_MSVCCompiler__root'
}}}
To prevent this error, the trick is to set the DISTUTILS_USE_SDK and MSsdk environment variables, as explained in the previous section.

If you actually have Visual Studio 2005, by using the above trick, you'll manage to build the extensions, but they won't load:
{{{
...
ImportError: DLL load failed with error code 193
}}}
Or some similar error, like `abort: could not import module found.!`.

The fix is to embed the manifest files into the .pyd modules:
{{{
# (assuming you're in a cygwin bash shell)
$ python setup.py build_ext
$ cd build/lib.win32-2.5/mercurial
$ for pyd in *.pyd; do mt.exe -nologo -outputresource:$pyd\;2 -manifest $pyd.manifest; done
$ cd ../../..
$ python setup.py install
}}}

==== ActiveState Python 2.5 ====

Looks like there's actually no difference from the above situation.

Line 118: Line 202:
Earlier versions of mercurial had trouble handling tildes in glob patterns on windows. Upgrade if you
encounter this problem.


==== Using the SSH protocol ====
Three solutions:
 * Install cygwin and OpenSSH and use the cygwin shell where ssh will be automatically in the PATH
 * Install [http://www.chiark.greenend.org.uk/~sgtatham/putty/ PuTTY] and follow the instructions in [http://www.selenic.com/mercurial/wiki/index.cgi/TipsAndTricks#head-728e29f739157fd04e05843a07c87b3a2027f973 TipsAndTricks].
 * Install cygwin and OpenSSH and modify Mercurial.ini to call the cygwin installed ssh executable.

Edit the Mercurial.ini to have the following entry:
{{{
[ui]
ssh = C:\cygwin\bin\ssh.exe
}}}
Line 119: Line 219:

If you try to use hg inside a directory that has a 'mercurial' subdirectory,
for example when working on the mercurial sources, python may not be able to
load the binary modules needed by Mercurial, and you may get a stack trace like:
{{{
...
  File "C:\projects\hg\mercurial\demandload.py", line 54, in module
    return object.__getattribute__(self, 'importer').module()
  File "C:\projects\hg\mercurial\demandload.py", line 30, in module
    self.fromlist)
  File "C:\projects\hg\mercurial\mdiff.py", line 9, in ?
    import struct, bdiff, util, mpatch
ImportError: No module named bdiff
}}}
Line 130: Line 244:
{{{
Line 132: Line 245:
}}}

=== Hardlinks on Windows ===

Mercurial now includes support for cloning with hardlinks on Windows.
However for this to work, your filesystem needs to support them (i.e. NTFS)
and you need the {{{win32}}} API extensions documented above. If you have a filesystem that does not support
hardlinks or don't have the {{{win32file}}} module, mercurial clone will
still work just fine - but you won't get the benefits of hardlinking of course.

For versions of Mercurial prior to 0.7, Mercurial
won't realise that it has to 'break' hardlinks.

The upshot is that if you have repositories cloned with hardlinks
you must not use pre-0.7 versions of mercurial on them (either the
source or the destination clone), or use a version of python without
{{{win32file}}}. If you do you are likely to get corruption.

A simple solution to break the hardlinks is to copy (using xcopy or File Explorer)
one of the repositories, deleting the clone. Copying it back afterwards.

=== Default editor ===

The default editor for commit messages is 'vi'. The Windows installer creates a mercurial.ini that sets it to notepad.
You can set the EDITOR (or HGEDITOR) environment variable to specify your
preference or set it in mercurial.ini:
{{{
[ui]
editor = whatever
}}}
----
CategoryWindows

Note: you probably want the prepackaged Windows version from BinaryPackages!

To install Mercurial from sources under Windows, you need

If you are using [http://www.python.org python.org]'s Python, you will find that the [http://sourceforge.net/project/showfiles.php?group_id=78018&package_id=79063 win32 API extensions] make a huge performance difference when you use the clone command (but see the caveats below about hardlinks on Windows). If you are using Python 2.4, you will also need [http://starship.python.net/crew/mhammond/win32/Downloads.html mfc71.dll]. (These extensions are already shipped as part of [http://www.activestate.com/Products/ActivePython/ ActivePython], but ActivePython is not completely open source software.)

See [:BuildingWindowsInstaller] for instructions to build a Mercurial installer. [:BuildingOnWindows] has some hints about how to build Mercurial on Windows.


This pages describes some issues you may meet when trying to install Mercurial, and how to solve them.

Normally, you would only need to run

python setup.py install --force

in the directory where you unpacked the sources, and everything would "just work". The use of -f/--force switch makes sure that any old installation is overwritten.

Other Windows Tips

TableOfContents

1. Where is my Mercurial?

By default, Mercurial (the executable) gets installed in a Scripts folder under your Python installation folder.

You can create a small batch file in a folder which is present in your path (e.g. your Windows installation folder) to help you launch Mercurial.

If you are running a Windows of the 9x series (Windows 95, 98 or ME), create a file called hg.bat with the following content:

@echo off
shift
python <path-to-Scripts-folder>\hg %0 %1 %2 %3 %4 %5 %6 %7 %8 %9

For example, if you installed Python in c:\python, the content of the file would be

@echo off
shift
python c:\python\hg %0 %1 %2 %3 %4 %5 %6 %7 %8 %9

Under Windows NT, create a file called hg.cmd with the following content:

@python <path-to-Scripts-folder>\hg %*

For example, if you installed Python in c:\python, the content of the file would be

@python c:\python\Scripts\hg %*

An alternative scheme that works better for some is to search for hg on the PATH. If you are using hg.exe it should work fine. For the python version of hg you should be able to simply rename 'hg' to 'hg.py' and assuming you have the .py extension configured it will be invoked. It is invoked, but there is a long standing redirection bug in Windows, and on XP there are sometimes problems with exit statuses being lost with this form of execution. So the following batch file is a solution -- place it in your PATH and it will find 'hg' without a .py extension in you PATH and invoke it properly: (name the file hg.cmd)

@echo off
for /f %%i in ("hg") DO set HGSCRIPT="%%~$PATH:i"
if %HGSCRIPT% == "" (
        echo Cannot find hg on PATH
        exit /b 1
)
python %HGSCRIPT% %*

An alternative is to add .py to the PATHEXT environment variable. Provided you have .py files set-up to run automatically when invoked, this allows you to run python scripts from the command line without the ending .py. This option also works if you are using UTF-8 in the Windows console (i.e code page 65001) which causes BAT and CMD files to stop working.

2. Python and MingW32

By default, Python and ActivePython will look for Microsoft Visual C to compile the extensions, so you have to tell setup.py to use the MingW32 compiler instead. You can do this by running

python setup.py build --force -c mingw32
python setup.py install --force --skip-build

or more briefly:

python setup.py build -f -c mingw32 install -f

If you are not familiar with mingw32, you will first need to download and install the following packages, in the order given:

msys.exe
msysDTK.exe

Afterwards, download and install the following package, installing it in the directory where you installed the msys package (i.e. c:\msys\1.0\)

MinGW.exe

You can find them at http://www.mingw.org

Then add the Python and mingw directories to your PATH, and run your build from the command prompt:

set PATH=%PATH%;c:\python24;c:\msys\1.0\mingw\bin

If you encounter compiler error in Mercurial versions 0.9.2 and up, you may need libpython24.a in PYTHONPATH\libs. If that's the case, you need to:

pexports C:\WINDOWS\system32\python24.dll > python24.def
dlltool --dllname C:\WINDOWS\system32\python24.dll --def python24.def --output-lib C:\Python24\libs\libpython24.a

Then the above setup.py script should run properly.

3. Easier MingW32 based build via Cygwin

It is easier to install MinGW32 via Cygwin as it has a single graphical installer. After installing, mingw32 via Cygwin installer (setup.exe), add cygwin bin directory to the path and follow the mingw32 build instructions. e.g.

set PATH=%PATH%;c:\python24;c:\cygwin\bin
python setup.py build --force -c mingw32
python setup.py install --force --skip-build

4. ActivePython and MS Visual C

If you are going to use MS Visual C, you may need to install an appropriate version of ActivePython:

  • ActivePython 2.4.1 requires VC7.1

  • ActivePython 2.3.5 requires VC6

A less than ideal work-around for the version check is to change your distutils notion of what version of MSVC Python was built with. Do this by editing your msvccompiler.py file in your python/Lib/distutils directory to match the version of MSVC you actually have, for example:

   def __init__ (self, verbose=0, dry_run=0, force=0):
       CCompiler.__init__ (self, verbose, dry_run, force)
       self.__version = get_build_version()
 +     self.__version = 6 # override build version to match compiler

An alternative to the above is to use a shell with the environment already set up for compilation, and then tell distutils to trust the executables available in the path:

set DISTUTILS_USE_SDK=1
set MSSdk=1

(see [http://docs.python.org/dist/module-distutils.msvccompiler.html distutils msvc] doc)

This way, I successfully built hg for ActivePython 2.4.2 and ActivePython 2.5.1, using Visual Studio 2005.

5. Python 2.5 for Windows/x64

Note that pywin32 has not yet been ported to the Windows/x64 platform.

5.1. The python.org distribution and the MS platform SDK compiler

If you happen to use the stock [http://www.python.org/ftp/python/2.5/python-2.5.amd64.msi python-2.5.amd64.msi] from python.org, you can build Mercurial using the Platform SDK compiler (I used the Microsoft Platform SDK for Windows Server 2003 R2).

There's one catch though: if you simply run python setup.py build, you'll likely get the following error:

...
AttributeError: MSVCCompiler instance has no attribute '_MSVCCompiler__root'

To prevent this error, the trick is to set the DISTUTILS_USE_SDK and MSsdk environment variables, as explained in the previous section.

If you actually have Visual Studio 2005, by using the above trick, you'll manage to build the extensions, but they won't load:

...
ImportError: DLL load failed with error code 193

Or some similar error, like abort: could not import module found.!.

The fix is to embed the manifest files into the .pyd modules:

# (assuming you're in a cygwin bash shell)
$ python setup.py build_ext
$ cd build/lib.win32-2.5/mercurial
$ for pyd in *.pyd; do mt.exe -nologo -outputresource:$pyd\;2 -manifest $pyd.manifest; done
$ cd ../../..
$ python setup.py install

5.2. ActiveState Python 2.5

Looks like there's actually no difference from the above situation.

6. Other miscellaneous issues

WinZip7 does not seem to create empty files when extracting from .tar files. But WinZip9 is fine.

Earlier versions of mercurial had trouble handling tildes in glob patterns on windows. Upgrade if you encounter this problem.

6.1. Using the SSH protocol

Three solutions:

Edit the Mercurial.ini to have the following entry:

[ui]
ssh = C:\cygwin\bin\ssh.exe

7. Fix the path problem on Windows

If you try to use hg inside a directory that has a 'mercurial' subdirectory, for example when working on the mercurial sources, python may not be able to load the binary modules needed by Mercurial, and you may get a stack trace like:

...
  File "C:\projects\hg\mercurial\demandload.py", line 54, in module
    return object.__getattribute__(self, 'importer').module()
  File "C:\projects\hg\mercurial\demandload.py", line 30, in module
    self.fromlist)
  File "C:\projects\hg\mercurial\mdiff.py", line 9, in ?
    import struct, bdiff, util, mpatch
ImportError: No module named bdiff

See the mail list thread "Fix the path problem on Windows..." but essentially Python on Windows ends up with the current directory automatically added to the python search path before the site libraries. So if you run hg in its own repository python gets confused, and can't find the extensions needed. There is a candidate patch that removes the current directory, but there is an arguably better workaround from K.Thananchayan. Simply add a registry entry (replacing 2.4 with the version of Python)

 HKLM/SOFTWARE/Python/PythonCore/2.4/PythonPath/XXX
   (Default) REG_SZ "YYY"

Mercurial now includes support for cloning with hardlinks on Windows. However for this to work, your filesystem needs to support them (i.e. NTFS) and you need the win32 API extensions documented above. If you have a filesystem that does not support hardlinks or don't have the win32file module, mercurial clone will still work just fine - but you won't get the benefits of hardlinking of course.

For versions of Mercurial prior to 0.7, Mercurial won't realise that it has to 'break' hardlinks.

The upshot is that if you have repositories cloned with hardlinks you must not use pre-0.7 versions of mercurial on them (either the source or the destination clone), or use a version of python without win32file. If you do you are likely to get corruption.

A simple solution to break the hardlinks is to copy (using xcopy or File Explorer) one of the repositories, deleting the clone. Copying it back afterwards.

9. Default editor

The default editor for commit messages is 'vi'. The Windows installer creates a mercurial.ini that sets it to notepad. You can set the EDITOR (or HGEDITOR) environment variable to specify your preference or set it in mercurial.ini:

[ui]
editor = whatever


CategoryWindows

WindowsInstall (last edited 2013-07-19 10:57:21 by rcl)