summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd Gamblin <tgamblin@llnl.gov>2014-08-17 01:41:32 -0700
committerTodd Gamblin <tgamblin@llnl.gov>2014-08-17 01:41:32 -0700
commitb601fd08caf21b5fc11e6998a5ebd20a04ac57ad (patch)
tree8c1215deaa8bd5acedba3fc7cc0e36ff1e3d0ee8
parent22bec329c1824ecd3271fffcef9ff793363ba93d (diff)
downloadspack-b601fd08caf21b5fc11e6998a5ebd20a04ac57ad.tar.gz
spack-b601fd08caf21b5fc11e6998a5ebd20a04ac57ad.tar.bz2
spack-b601fd08caf21b5fc11e6998a5ebd20a04ac57ad.tar.xz
spack-b601fd08caf21b5fc11e6998a5ebd20a04ac57ad.zip
Bugfixes for csh environment modules.
-rw-r--r--lib/spack/spack/cmd/module.py15
-rw-r--r--lib/spack/spack/modules.py27
-rw-r--r--share/spack/csh/spack.csh42
-rwxr-xr-xshare/spack/setup-env.csh5
-rwxr-xr-xshare/spack/setup-env.sh22
5 files changed, 81 insertions, 30 deletions
diff --git a/lib/spack/spack/cmd/module.py b/lib/spack/spack/cmd/module.py
index af5a68923b..4f6de18532 100644
--- a/lib/spack/spack/cmd/module.py
+++ b/lib/spack/spack/cmd/module.py
@@ -52,14 +52,16 @@ def setup_parser(subparser):
def module_find(mtype, spec_array):
+ """Look at all installed packages and see if the spec provided
+ matches any. If it does, check whether there is a module file
+ of type <mtype> there, and print out the name that the user
+ should type to use that package's module.
+ """
specs = spack.cmd.parse_specs(spec_array)
if len(specs) > 1:
tty.die("You can only pass one spec.")
spec = specs[0]
- if not spack.db.exists(spec.name):
- tty.die("No such package: %s" % spec.name)
-
if mtype not in module_types:
tty.die("Invalid module type: '%s'. Options are " + comma_and(module_types))
@@ -74,11 +76,12 @@ def module_find(mtype, spec_array):
sys.exit(1)
mt = module_types[mtype]
- mod = mt(spec.package)
+ mod = mt(specs[0].package)
if not os.path.isfile(mod.file_name):
- tty.die("No dotkit is installed for package %s." % spec)
+ tty.error( mod.file_name)
+ tty.die("No %s module is installed for package %s." % (mtype, spec))
- print mod.file_name
+ print mod.use_name
def module_refresh():
diff --git a/lib/spack/spack/modules.py b/lib/spack/spack/modules.py
index 596308f801..3f56208f5b 100644
--- a/lib/spack/spack/modules.py
+++ b/lib/spack/spack/modules.py
@@ -157,7 +157,14 @@ class EnvModule(object):
def file_name(self):
"""Subclasses should implement this to return the name of the file
where this module lives."""
- return self.pkg.spec.format('$_$@$%@$+$=$#')
+ raise NotImplementedError()
+
+
+ @property
+ def use_name(self):
+ """Subclasses should implement this to return the name the
+ module command uses to refer to the package."""
+ raise NotImplementedError()
def remove(self):
@@ -172,9 +179,12 @@ class Dotkit(EnvModule):
@property
def file_name(self):
- spec = self.pkg.spec
- return join_path(Dotkit.path, spec.architecture,
- spec.format('$_$@$%@$+$#.dk'))
+ return join_path(Dotkit.path, self.pkg.spec.architecture,
+ self.pkg.spec.format('$_$@$%@$+$#.dk'))
+
+ @property
+ def use_name(self):
+ return self.pkg.spec.format('$_$@$%@$+$#')
def _write(self, dk_file):
@@ -206,9 +216,12 @@ class TclModule(EnvModule):
@property
def file_name(self):
- spec = self.pkg.spec
- return join_path(TclModule.path, spec.architecture,
- spec.format('$_$@$%@$+$#'))
+ return join_path(TclModule.path, self.pkg.spec.architecture, self.use_name)
+
+
+ @property
+ def use_name(self):
+ return self.pkg.spec.format('$_$@$%@$+$#')
def _write(self, m_file):
diff --git a/share/spack/csh/spack.csh b/share/spack/csh/spack.csh
index 2f6b96f4eb..169e9878bf 100644
--- a/share/spack/csh/spack.csh
+++ b/share/spack/csh/spack.csh
@@ -22,14 +22,28 @@
# avoids the need to come up with a user-friendly naming scheme for
# spack dotfiles.
########################################################################
+# accumulate initial flags for main spack command
+set _sp_flags = ""
+while ( $#_sp_args > 0 )
+ if ( "$_sp_args[1]" !~ "-*" ) break
+ set _sp_flags = "$_sp_flags $_sp_args[1]"
+ shift _sp_args
+end
+
+# h and V flags don't require further output parsing.
+if ( "$_sp_flags" =~ *h* || "$_sp_flags" =~ *V* ) then
+ \spack $_sp_flags $_sp_args
+ goto _sp_end
+endif
+
# Set up args -- we want a subcommand and a spec.
-set _sp_subcommand="";
-set _sp_spec="";
-[ $#_sp_args -gt 0 ] && set _sp_subcommand = ($_sp_args[1]);
-[ $#_sp_args -gt 1 ] && set _sp_spec = ($_sp_args[2-]);
+set _sp_subcommand=""
+set _sp_spec=""
+[ $#_sp_args -gt 0 ] && set _sp_subcommand = ($_sp_args[1])
+[ $#_sp_args -gt 1 ] && set _sp_spec = ($_sp_args[2-])
# Figure out what type of module we're running here.
-set _sp_modtype = "";
+set _sp_modtype = ""
switch ($_sp_subcommand)
case use:
case unuse:
@@ -48,12 +62,12 @@ case unload:
case use:
case unuse:
set _sp_modtype = dotkit
- set _sp_sh_cmd = $_sp_subcommand
+ set _sp_sh_cmd = ( "`alias $_sp_subcommand'" )
breaksw
case load:
case unload:
set _sp_modtype = tcl
- set _sp_sh_cmd = ( module $_sp_subcommand )
+ set _sp_sh_cmd = ( "`alias module`" $_sp_subcommand )
breaksw
endsw
@@ -61,11 +75,17 @@ case unload:
# spec using 'spack module find', then use the appropriate module
# tool's commands to add/remove the result from the environment.
# If spack module command comes back with an error, do nothing.
- if { set _sp_full_spec = `command spack module find $_sp_modtype $_sp_spec` } then
- echo $_sp_sh_cmd $_sp_module_args $_sp_full_spec
+ set _sp_full_spec = ""
+ if { set _sp_full_spec = `\spack module find $_sp_modtype $_sp_spec` } then
+ $_sp_sh_cmd $_sp_module_args $_sp_full_spec
endif
+ breaksw
+
default:
- command spack $_sp_args
+ \spack $_sp_args
+ breaksw
endsw
-unset _sp_args _sp_full_spec _sp_modtype _sp_module_args _sp_sh_cmd _sp_spec _sp_subcommand
+_sp_end:
+unset _sp_args _sp_full_spec _sp_modtype _sp_module_args
+unset _sp_sh_cmd _sp_spec _sp_subcommand _sp_flags
diff --git a/share/spack/setup-env.csh b/share/spack/setup-env.csh
index e3243e40b2..cc12eae82f 100755
--- a/share/spack/setup-env.csh
+++ b/share/spack/setup-env.csh
@@ -40,7 +40,8 @@ if ($?SPACK_ROOT) then
alias _spack_pathadd 'set _pa_args = (\!*) && source $_spack_share_dir/csh/spack_pathadd.csh'
# Set up modules and dotkit search paths in the user environment
- _spack_pathadd DK_NODE "$_spack_share_dir/dotkit"
- _spack_pathadd MODULEPATH "$_spack_share_dir/modules"
+ # TODO: fix SYS_TYPE to something non-LLNL-specific
+ _spack_pathadd DK_NODE "$_spack_share_dir/dotkit/$SYS_TYPE"
+ _spack_pathadd MODULEPATH "$_spack_share_dir/modules/$SYS_TYPE"
_spack_pathadd PATH "$SPACK_ROOT/bin"
endif
diff --git a/share/spack/setup-env.sh b/share/spack/setup-env.sh
index 7cadc6f202..0142e04817 100755
--- a/share/spack/setup-env.sh
+++ b/share/spack/setup-env.sh
@@ -56,6 +56,19 @@
# spack dotfiles.
########################################################################
function spack {
+ # accumulate initial flags for main spack command
+ _sp_flags=""
+ while [[ "$1" =~ ^- ]]; do
+ _sp_flags="$_sp_flags $1"
+ shift
+ done
+
+ # h and V flags don't require further output parsing.
+ if [[ "$_sp_flags" =~ *h* || "$_sp_flags" =~ *V* ]]; then
+ command spack $_sp_flags "$@"
+ return
+ fi
+
_sp_subcommand=$1; shift
_sp_spec="$@"
@@ -88,13 +101,13 @@ function spack {
# spec using 'spack module find', then use the appropriate module
# tool's commands to add/remove the result from the environment.
# If spack module command comes back with an error, do nothing.
- if _sp_full_spec=$(command spack module find $_sp_modtype $_sp_spec); then
+ if _sp_full_spec=$(command spack $_sp_flags module find $_sp_modtype $_sp_spec); then
$_sp_sh_cmd $_sp_module_args $_sp_full_spec
fi
return
;;
*)
- command spack $_sp_subcommand $_sp_spec
+ command spack $_sp_flags $_sp_subcommand $_sp_spec
esac
}
@@ -145,6 +158,7 @@ fi
_sp_share_dir="$(dirname $_sp_source_file)"
_sp_prefix="$(dirname $(dirname $_sp_share_dir))"
-_spack_pathadd DK_NODE "$_sp_share_dir/dotkit"
-_spack_pathadd MODULEPATH "$_sp_share_dir/modules"
+# TODO: fix SYS_TYPE to something non-LLNL-specific
+_spack_pathadd DK_NODE "$_sp_share_dir/dotkit/$SYS_TYPE"
+_spack_pathadd MODULEPATH "$_sp_share_dir/modules/$SYS_TYPE"
_spack_pathadd PATH "$_sp_prefix/bin"