diff options
-rw-r--r-- | lib/spack/spack/cmd/module.py | 15 | ||||
-rw-r--r-- | lib/spack/spack/modules.py | 27 | ||||
-rw-r--r-- | share/spack/csh/spack.csh | 42 | ||||
-rwxr-xr-x | share/spack/setup-env.csh | 5 | ||||
-rwxr-xr-x | share/spack/setup-env.sh | 22 |
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" |