diff options
Diffstat (limited to 'share/spack/setup-env.csh')
-rwxr-xr-x | share/spack/setup-env.csh | 79 |
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 |