Patchwork D9361: make: switch the PYTHON default to `py.exe -3` on Windows

login
register
mail settings
Submitter phabricator
Date Nov. 21, 2020, 8:38 p.m.
Message ID <differential-rev-PHID-DREV-mmva2cdvbiifqxestphz-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/47640/
State Superseded
Headers show

Comments

phabricator - Nov. 21, 2020, 8:38 p.m.
mharbison72 created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  Python3 _is_ named `python.exe` on Windows, but that isn't necessarily on PATH
  when installing from python.org.  I do happen to have a python.exe on PATH in
  `$LOCALAPPDATA/Microsoft/WindowsApps`, but it appears to be 0 bytes (likely
  because of permission issues), and doesn't run:
  
    $ python -V
     - Cannot open
  
  Pulkit hit the same error as I did though, so it isn't just my system:
  
    $ make -C . local
    make: Entering directory `/home/Dell/repos/hg-committed`
    python setup.py  \
              build_py -c -d . \
              build_ext  -i \
              build_hgexe  -i \
              build_mo
     - Cannot openmake: *** [local] Error 1
  
  The `py.exe` dispatcher lives in the Windows directory (so it is on PATH), looks
  up the python.org installation, and invokes that interpreter directly.  I get a
  warning with py39, but if it's our issue, it was an existing one:
  
    $ make -C .. local
    make: Entering directory `/c/Users/Matt/hg'
    py -3 setup.py  \
              build_py -c -d . \
              build_ext  -i \
              build_hgexe  -i \
              build_mo
    C:\Users\Matt\AppData\Local\Programs\Python\Python39\lib\site-packages\setuptools\distutils_patch.py:25:
        UserWarning: Distutils was imported before Setuptools. This usage is discouraged and may
        exhibit undesirable behaviors or errors. Please use Setuptools' objects directly or at least
        import Setuptools first.
      warnings.warn(
  
  The end result is a py3 based hg.exe that annoyingly won't run because it can't
  find python39.dll.  It will run tests (the ones without the `python3` shbang
  line anyway), because the test runner adjusts PATH to include the python running
  it.

REPOSITORY
  rHG Mercurial

BRANCH
  default

REVISION DETAIL
  https://phab.mercurial-scm.org/D9361

AFFECTED FILES
  Makefile

CHANGE DETAILS




To: mharbison72, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -8,9 +8,9 @@ 
 
 # Default to Python 3.
 #
-# Windows ships Python 3 as `python.exe`.
+# Windows ships Python 3 as `python.exe`, which may not be on PATH.  py.exe is.
 ifeq ($(OS),Windows_NT)
-PYTHON?=python
+PYTHON?=py -3
 else
 PYTHON?=python3
 endif