Commit Graph

8 Commits

Author SHA1 Message Date
Kostia Balytskyi
688382aced exewrapper: prefer HackableMercurial python if availbale
Currently hg.exe will only try to load python27.dll from hg-python
subdir if PYTHONHOME environment variable is not set. I think that
it is better to check whether 'hg-python' subdir exists and load
python from it in that case, regardless of environment. This allows
for reliable approach of distributing Mercurial with its own Python.
2017-03-13 12:44:13 -07:00
Gregory Szorc
b30a08bac0 exewrapper: add .dll to LoadLibrary() argument
LoadLibrary() changes behavior depending on whether the argument
passed to it contains a period. From the MSDN docs:

If no file name extension is specified in the lpFileName parameter,
the default library extension .dll is appended. However, the file name
string can include a trailing point character (.) to indicate that the
module name has no extension. When no path is specified, the function
searches for loaded modules whose base name matches the base name of
the module to be loaded. If the name matches, the load succeeds.
Otherwise, the function searches for the file.

As the subsequent patch will show, some environments on Windows
define their Python library as e.g. "libpython2.7.dll." The existing
code would pass "libpython2.7" into LoadLibrary(). It would assume
"7" was the file extension and look for a "libpython2.dll" to load.

By passing ".dll" into LoadLibrary(), we force it to search for the
exact basename we want, even if it contains a period.
2016-04-27 09:23:39 -07:00
Adrian Buehlmann
2a7f035afb exewrapper: add comments about PYTHONHOME
This has been a repeating source of confusion for users of HackableMercurial.

Note that users of HackableMercurial should *not* and are *not* expected to set
PYTHONHOME.
2015-10-14 12:23:49 +02:00
Adrian Buehlmann
c98c55c9cc exewrapper: report name of failed private DLL in error message
Same as in preceding change, but this time it's for the private Python of
HackableMercurial (in hg-python directory next to the hg.exe).
2015-10-14 12:23:04 +02:00
Adrian Buehlmann
3710fc75c8 exewrapper: report name of failed DLL in error message
This uses C string literal concatenation.

Example output:

  $ hg version
  abort: failed to load Python DLL python27.dll

Note that HGPYTHONLIB does not contain the trailing .dll, which works here
because the documentation of LoadLibrary [1] says, that if no file name
extension is specified in the filename parameter, the default library
extension .dll is appended.

See [2] for a motivation of this change.

[1] https://msdn.microsoft.com/en-us/library/windows/desktop/ms684175(v=vs.85).aspx
[2] https://selenic.com/pipermail/mercurial/2015-August/048627.html
2015-10-14 12:22:09 +02:00
Adrian Buehlmann
d768b47592 exewrapper: adapt for legacy HackableMercurial
We give up using CPython's PythonXX.lib import libraries (and Python.h), and
now "manually" call the LoadLibrary() / GetProcAddress() Windows API's instead.

If there is a "hg-python" subdirectory (the canonical directory name for
HackableMercurial's private Python copy) next to the hg.exe, we load the
pythonXX.dll from there (feeding an absolute path to LoadLibrary) and we set
Py_SetPythonHome() to that directory, so that the Python libraries are used
from there as well.

If there is no "hg-python" subdir found next to the hg.exe, we do not feed an
absolute path to LoadLibrary. This continues to allow to find a globally
installed Python DLL, as before this change - that is, without having to edit,
delete, rename, or configure anything.

Note that the hg.exe built is still bound to a *specific* major version of the
pythonXX.dll (e.g. python27.dll). What version it is, is inferred from the
version of the python interpreter that was used when calling setup.py. For
example

  C:\python27_x86\python.exe setup.py build_hgexe -i --compiler=mingw32

builds a hg.exe (using the mingw32 tool chain) bound to (x86) Python 2.7. And

  C:\python27_x86\python.exe setup.py build_hgexe -i

builds the same using the Microsoft C compiler/linker. (Note that the Microsoft
toolchain combined with x64 CPython can be used to build an x64 hg.exe.)

setup.py is changed to write the name of the pythonlib into the generated header
file "mercurial/hgpythonlib.h", which is #included by exewrapper.c. For a Python
2.7 build, it for example contains:

  #define HGPYTHONLIB "python27"

exewrapper.c then uses HGPYTHONLIB for the name of the Python dll to load.

We don't want to track mercurial/hgpythonlib.h, so we add it to .hgignore.
2012-08-07 11:04:41 +02:00
Adrian Buehlmann
e634568f0e exewrapper: use generic term script
The exewrapper doesn't know anything so far about what the script is or does.
2012-06-29 08:10:43 +02:00
Adrian Buehlmann
ae3fe9a6e0 exewrapper: adding new exewrapper.c 2012-06-29 00:01:19 +02:00