summaryrefslogtreecommitdiff
path: root/share/spack/setup-env.csh
diff options
context:
space:
mode:
Diffstat (limited to 'share/spack/setup-env.csh')
-rwxr-xr-xshare/spack/setup-env.csh79
1 files changed, 52 insertions, 27 deletions
diff --git a/share/spack/setup-env.csh b/share/spack/setup-env.csh
index 1985e023de..b70036456d 100755
--- a/share/spack/setup-env.csh
+++ b/share/spack/setup-env.csh
@@ -3,14 +3,12 @@
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
-
#
# This file is part of Spack and sets up the spack environment for
# csh and tcsh. This includes environment modules and lmod support, and
# it also puts spack in your path. Source it like this:
#
-# setenv SPACK_ROOT /path/to/spack
-# source $SPACK_ROOT/share/spack/setup-env.csh
+# source /path/to/spack/share/spack/setup-env.csh
#
# prevent infinite recursion when spack shells out (e.g., on cray for modules)
@@ -19,32 +17,59 @@ if ($?_sp_initializing) then
endif
setenv _sp_initializing true
-if ($?SPACK_ROOT) then
- set _spack_source_file = $SPACK_ROOT/share/spack/setup-env.csh
- set _spack_share_dir = $SPACK_ROOT/share/spack
-
- # Command aliases point at separate source files
- alias spack 'set _sp_args = (\!*); source $_spack_share_dir/csh/spack.csh'
- alias spacktivate 'spack env activate'
- alias _spack_pathadd 'set _pa_args = (\!*) && source $_spack_share_dir/csh/pathadd.csh'
-
- # Set variables needed by this script
- _spack_pathadd PATH "$SPACK_ROOT/bin"
- eval `spack --print-shell-vars csh`
-
- # Set up module search paths in the user environment
- set tcl_roots = `echo $_sp_tcl_roots:q | sed 's/:/ /g'`
- set compatible_sys_types = `echo $_sp_compatible_sys_types:q | sed 's/:/ /g'`
- foreach tcl_root ($tcl_roots:q)
- foreach systype ($compatible_sys_types:q)
- _spack_pathadd MODULEPATH "$tcl_root/$systype"
- end
- end
+# If SPACK_ROOT is not set, we'll try to find it ourselves.
+# csh/tcsh don't have a built-in way to do this, but both keep files
+# they are sourcing open. We use /proc on linux and lsof on macs to
+# find this script's full path in the current process's open files.
+if (! $?SPACK_ROOT) then
+ # figure out a command to list open files
+ if (-d /proc/$$/fd) then
+ set _sp_lsof = "ls -l /proc/$$/fd"
+ else
+ which lsof > /dev/null
+ if ($? == 0) then
+ set _sp_lsof = "lsof -p $$"
+ endif
+ endif
+
+ # filter this script out of list of open files
+ if ( $?_sp_lsof ) then
+ set _sp_source_file = `$_sp_lsof | sed -e 's/^[^/]*//' | grep "/setup-env.csh"`
+ endif
+
+ # This script is in $SPACK_ROOT/share/spack; get the root with dirname
+ if ($?_sp_source_file) then
+ set _sp_share_spack = `dirname "$_sp_source_file"`
+ set _sp_share = `dirname "$_sp_share_spack"`
+ setenv SPACK_ROOT `dirname "$_sp_share"`
+ endif
-else
- echo "ERROR: Sourcing spack setup-env.csh requires setting SPACK_ROOT to "
- echo " the root of your spack installation."
+ if (! $?SPACK_ROOT) then
+ echo "==> Error: setup-env.csh couldn't figure out where spack lives."
+ echo " Set SPACK_ROOT to the root of your spack installation and try again."
+ exit 1
+ endif
endif
+# Command aliases point at separate source files
+set _spack_source_file = $SPACK_ROOT/share/spack/setup-env.csh
+set _spack_share_dir = $SPACK_ROOT/share/spack
+alias spack 'set _sp_args = (\!*); source $_spack_share_dir/csh/spack.csh'
+alias spacktivate 'spack env activate'
+alias _spack_pathadd 'set _pa_args = (\!*) && source $_spack_share_dir/csh/pathadd.csh'
+
+# Set variables needed by this script
+_spack_pathadd PATH "$SPACK_ROOT/bin"
+eval `spack --print-shell-vars csh`
+
+# Set up module search paths in the user environment
+set tcl_roots = `echo $_sp_tcl_roots:q | sed 's/:/ /g'`
+set compatible_sys_types = `echo $_sp_compatible_sys_types:q | sed 's/:/ /g'`
+foreach tcl_root ($tcl_roots:q)
+ foreach systype ($compatible_sys_types:q)
+ _spack_pathadd MODULEPATH "$tcl_root/$systype"
+ end
+end
+
# done: unset sentinel variable as we're no longer initializing
unsetenv _sp_initializing