rust/x
jyn 1cac5fa5f9 Look for python3 first on MacOS, not py
`py` is not installed by default *and* trying to run it results in a
popup asking if you want to install it. `python3` is installed by
default.

This hopefully should not be too disruptive to people on Windows, since
they should be going through `x.ps1` instead anyway. Just in case, I've
added a check for Cygwin and Msys (i'm not sure how else you'd get a
bash shell on windows).
2025-02-13 10:24:54 -05:00

52 lines
1.5 KiB
Bash
Executable File

#!/bin/sh
# 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 x.py shebang and have it consistently work. Instead we
# have a shell script to look for a python to run x.py.
set -eu
# syntax check
sh -n "$0"
realpath() {
local path="$1"
if [ -L "$path" ]; then
readlink -f "$path"
elif [ -d "$path" ]; then
(cd -P "$path" && pwd)
else
echo "$(realpath "$(dirname "$path")")/$(basename "$path")"
fi
}
xpy=$(dirname "$(realpath "$0")")/x.py
# On Windows, `py -3` sometimes works. We need to try it first because `python3`
# sometimes tries to launch the app store on Windows.
# On MacOS, `py` tries to install "Developer command line tools". Try `python3` first.
# NOTE: running `bash -c ./x` from Windows doesn't set OSTYPE.
case ${OSTYPE:-} in
cygwin*|msys*) SEARCH="py python3 python python2";;
*) SEARCH="python3 python py python2";;
esac
for SEARCH_PYTHON in $SEARCH; do
if python=$(command -v $SEARCH_PYTHON) && [ -x "$python" ]; then
if [ $SEARCH_PYTHON = py ]; then
extra_arg="-3"
else
extra_arg=""
fi
exec "$python" $extra_arg "$xpy" "$@"
fi
done
python=$(bash -c "compgen -c python" | grep '^python[2-3]\.[0-9]+$' | head -n1)
if ! [ "$python" = "" ]; then
exec "$python" "$xpy" "$@"
fi
echo "$0: error: did not find python installed" >&2
exit 1