summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChuck Atkins <chuck.atkins@kitware.com>2021-02-12 13:52:44 -0500
committerGitHub <noreply@github.com>2021-02-12 10:52:44 -0800
commit5a771bc8ad3ddb1b3f550f1685c451cc6cb49e64 (patch)
tree67216810f4f0f0d94d805110f1ffe4e5fb757a99
parent7add9de2e531e7a498cff85c20ff474d6d4eddec (diff)
downloadspack-5a771bc8ad3ddb1b3f550f1685c451cc6cb49e64.tar.gz
spack-5a771bc8ad3ddb1b3f550f1685c451cc6cb49e64.tar.bz2
spack-5a771bc8ad3ddb1b3f550f1685c451cc6cb49e64.tar.xz
spack-5a771bc8ad3ddb1b3f550f1685c451cc6cb49e64.zip
Introduce a SPACK_PYTHON environment variable (#21222)
The SPACK_PYTHON environment variable can be set to a python interpreter to be used by the spack command. This allows the spack command itself to use a consistent and separate interpreter from whatever python might be used for package building.
-rwxr-xr-xbin/spack9
-rw-r--r--lib/spack/docs/getting_started.rst8
-rwxr-xr-xshare/spack/setup-env.csh12
-rwxr-xr-xshare/spack/setup-env.fish15
-rwxr-xr-xshare/spack/setup-env.sh8
5 files changed, 48 insertions, 4 deletions
diff --git a/bin/spack b/bin/spack
index e979e2af64..24db0be9b1 100755
--- a/bin/spack
+++ b/bin/spack
@@ -10,9 +10,12 @@
# Following line is a shell no-op, and starts a multi-line Python comment.
# See https://stackoverflow.com/a/47886254
""":"
-# prefer python3, then python, then python2
-for cmd in python3 python python2; do
- command -v > /dev/null $cmd && exec $cmd $0 "$@"
+# prefer SPACK_PYTHON environment variable, python3, python, then python2
+for cmd in "${SPACK_PYTHON:-}" python3 python python2; do
+ if command -v > /dev/null "$cmd"; then
+ export SPACK_PYTHON="$(command -v "$cmd")"
+ exec "${SPACK_PYTHON}" "$0" "$@"
+ fi
done
echo "==> Error: spack could not find a python interpreter!" >&2
diff --git a/lib/spack/docs/getting_started.rst b/lib/spack/docs/getting_started.rst
index 3cf910cc8d..6f3340b18b 100644
--- a/lib/spack/docs/getting_started.rst
+++ b/lib/spack/docs/getting_started.rst
@@ -75,6 +75,14 @@ shell integration for :ref:`certain commands <packaging-shell-support>`,
If you do not want to use Spack's shell support, you can always just run
the ``spack`` command directly from ``spack/bin/spack``.
+When the ``spack`` command is executed it searches for an appropriate
+Python interpreter to use, which can be explicitly overridden by setting
+the ``SPACK_PYTHON`` environment variable. When sourcing the appropriate shell
+setup script, ``SPACK_PYTHON`` will be set to the interpreter found at
+sourcing time, ensuring future invocations of the ``spack`` command will
+continue to use the same consistent python version regardless of changes in
+the environment.
+
^^^^^^^^^^^^^^^^^^
Check Installation
diff --git a/share/spack/setup-env.csh b/share/spack/setup-env.csh
index 8368274912..4ac0503947 100755
--- a/share/spack/setup-env.csh
+++ b/share/spack/setup-env.csh
@@ -58,6 +58,18 @@ alias spack 'set _sp_args = (\!*); source $_spack_share_dir/csh/spack.c
alias spacktivate 'spack env activate'
alias _spack_pathadd 'set _pa_args = (\!*) && source $_spack_share_dir/csh/pathadd.csh'
+# Identify and lock the python interpreter
+if (! $?SPACK_PYTHON) then
+ setenv SPACK_PYTHON ""
+endif
+foreach cmd ("$SPACK_PYTHON" python3 python python2)
+ command -v "$cmd" >& /dev/null
+ if ($status == 0) then
+ setenv SPACK_PYTHON `command -v "$cmd"`
+ break
+ endif
+end
+
# Set variables needed by this script
_spack_pathadd PATH "$SPACK_ROOT/bin"
eval `spack --print-shell-vars csh`
diff --git a/share/spack/setup-env.fish b/share/spack/setup-env.fish
index 15eff90dd2..190934531d 100755
--- a/share/spack/setup-env.fish
+++ b/share/spack/setup-env.fish
@@ -253,7 +253,7 @@ function match_flag -d "checks all combinations of flags ocurring inside of a st
set -l _a (string sub -s 2 (string trim "x$argv[1]"))
set -l _b (string sub -s 2 (string trim "x$argv[2]"))
- if test -z "$_a" || test -z "$_b"
+ if test -z "$_a" or test -z "$_b"
return 0
end
@@ -668,6 +668,19 @@ set -l sp_source_file (status -f) # name of current file
#
+# Identify and lock the python interpreter
+#
+for cmd in "$SPACK_PYTHON" python3 python python2
+ set -l _sp_python (command -s "$cmd")
+ if test $status -eq 0
+ set -x SPACK_PYTHON $_sp_python
+ break
+ end
+end
+
+
+
+#
# Find root directory and add bin to path.
#
set -l sp_share_dir (realpath (dirname $sp_source_file))
diff --git a/share/spack/setup-env.sh b/share/spack/setup-env.sh
index c4c7af4b0a..cbee4428d0 100755
--- a/share/spack/setup-env.sh
+++ b/share/spack/setup-env.sh
@@ -326,6 +326,14 @@ if [ "$_sp_shell" = bash ]; then
export -f _spack_shell_wrapper
fi
+# Identify and lock the python interpreter
+for cmd in "${SPACK_PYTHON:-}" python3 python python2; do
+ if command -v > /dev/null "$cmd"; then
+ export SPACK_PYTHON="$(command -v "$cmd")"
+ break
+ fi
+done
+
#
# make available environment-modules
#