about summary refs log tree commit diff
path: root/x.py
diff options
context:
space:
mode:
authorDavid Tolnay <dtolnay@gmail.com>2022-06-24 17:55:40 -0700
committerDavid Tolnay <dtolnay@gmail.com>2022-06-24 18:03:09 -0700
commit9169905eb2d0e5df5c554396495df49283812abc (patch)
tree1637f700f8fcb44b0134b617058a3782f86f0415 /x.py
parentfdca237d5194bf8a1c9b437ebd2114d1c2ba6195 (diff)
downloadrust-9169905eb2d0e5df5c554396495df49283812abc.tar.gz
rust-9169905eb2d0e5df5c554396495df49283812abc.zip
x.py: Support systems with only `python3` not `python`
Diffstat (limited to 'x.py')
-rwxr-xr-xx.py29
1 files changed, 25 insertions, 4 deletions
diff --git a/x.py b/x.py
index 4f64ea9fae8..0289056fdcb 100755
--- a/x.py
+++ b/x.py
@@ -1,5 +1,25 @@
-#!/usr/bin/env python
+#!/usr/bin/env bash
 
+# Modern Linux and macOS systems commonly only have a thing called `python3` and
+# not `python`, while Windows commonly does not have `python3`, so we cannot
+# directly use python in the shebang and have it consistently work. Instead we
+# embed some bash to look for a python to run the rest of the script.
+#
+# On Windows, `py -3` sometimes works. We need to try it first because `python3`
+# sometimes tries to launch the app store on Windows.
+'''':
+for PYTHON in "py -3" python3 python python2; do
+    if command -v $PYTHON >/dev/null; then
+        exec $PYTHON "$0" "$@"
+        break
+    fi
+done
+echo "$0: error: did not find python installed" >&2
+exit 1
+'''
+
+# The rest of this file is Python.
+#
 # This file is only a "symlink" to bootstrap.py, all logic should go there.
 
 import os
@@ -7,11 +27,12 @@ import sys
 
 # If this is python2, check if python3 is available and re-execute with that
 # interpreter.
+#
+# `./x.py` would not normally benefit from this because the bash above tries
+# python3 before 2, but this matters if someone ran `python x.py` and their
+# system's `python` is python2.
 if sys.version_info.major < 3:
     try:
-        # On Windows, `py -3` sometimes works.
-        # Try this first, because 'python3' sometimes tries to launch the app
-        # store on Windows
         os.execvp("py", ["py", "-3"] + sys.argv)
     except OSError:
         try: