summaryrefslogtreecommitdiff
path: root/share/spack/csh
diff options
context:
space:
mode:
authorTodd Gamblin <tgamblin@llnl.gov>2014-08-16 14:58:15 -0700
committerTodd Gamblin <tgamblin@llnl.gov>2014-08-16 14:58:15 -0700
commit776560f8ce9f464548cc116117c6a58b686448ff (patch)
treef5b11e503f5fc46817ba01e12a79667d74572bc4 /share/spack/csh
parent221cf6acb932442f5964243eb3413a1d921920c8 (diff)
downloadspack-776560f8ce9f464548cc116117c6a58b686448ff.tar.gz
spack-776560f8ce9f464548cc116117c6a58b686448ff.tar.bz2
spack-776560f8ce9f464548cc116117c6a58b686448ff.tar.xz
spack-776560f8ce9f464548cc116117c6a58b686448ff.zip
Add csh/tcsh support for modules
- csh scripting is a GIANT pain in the ass - hopefully the thin script layer doesn't get much more complex.
Diffstat (limited to 'share/spack/csh')
-rw-r--r--share/spack/csh/spack.csh71
-rw-r--r--share/spack/csh/spack_pathadd.csh23
2 files changed, 94 insertions, 0 deletions
diff --git a/share/spack/csh/spack.csh b/share/spack/csh/spack.csh
new file mode 100644
index 0000000000..2f6b96f4eb
--- /dev/null
+++ b/share/spack/csh/spack.csh
@@ -0,0 +1,71 @@
+########################################################################
+# This is a wrapper around the spack command that forwards calls to
+# 'spack use' and 'spack unuse' to shell functions. This in turn
+# allows them to be used to invoke dotkit functions.
+#
+# 'spack use' is smarter than just 'use' because it converts its
+# arguments into a unique spack spec that is then passed to dotkit
+# commands. This allows the user to use packages without knowing all
+# their installation details.
+#
+# e.g., rather than requring a full spec for libelf, the user can type:
+#
+# spack use libelf
+#
+# This will first find the available libelf dotkits and use a
+# matching one. If there are two versions of libelf, the user would
+# need to be more specific, e.g.:
+#
+# spack use libelf@0.8.13
+#
+# This is very similar to how regular spack commands work and it
+# avoids the need to come up with a user-friendly naming scheme for
+# spack dotfiles.
+########################################################################
+# 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-]);
+
+# Figure out what type of module we're running here.
+set _sp_modtype = "";
+switch ($_sp_subcommand)
+case use:
+case unuse:
+case load:
+case unload:
+ set _sp_module_args=""""
+ if ( "$_sp_spec" =~ "-*" ) then
+ set _sp_module_args = $_sp_spec[1]
+ shift _sp_spec
+ set _sp_spec = ($_sp_spec)
+ endif
+ # Translate the parameter into pieces of a command.
+ # _sp_modtype is an arg to spack module find, and
+ # _sp_sh_cmd is the equivalent shell command.
+ switch ($_sp_subcommand)
+ case use:
+ case unuse:
+ set _sp_modtype = dotkit
+ set _sp_sh_cmd = $_sp_subcommand
+ breaksw
+ case load:
+ case unload:
+ set _sp_modtype = tcl
+ set _sp_sh_cmd = ( module $_sp_subcommand )
+ breaksw
+ endsw
+
+ # Here the user has run use or unuse with a spec. Find a matching
+ # 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
+ endif
+default:
+ command spack $_sp_args
+endsw
+
+unset _sp_args _sp_full_spec _sp_modtype _sp_module_args _sp_sh_cmd _sp_spec _sp_subcommand
diff --git a/share/spack/csh/spack_pathadd.csh b/share/spack/csh/spack_pathadd.csh
new file mode 100644
index 0000000000..1e0800c5f3
--- /dev/null
+++ b/share/spack/csh/spack_pathadd.csh
@@ -0,0 +1,23 @@
+########################################################################
+# Prepends directories to path, if they exist.
+# pathadd /path/to/dir # add to PATH
+# or pathadd OTHERPATH /path/to/dir # add to OTHERPATH
+########################################################################
+# If no variable name is supplied, just append to PATH
+# otherwise append to that variable.
+set _pa_varname = PATH;
+set _pa_new_path = $_pa_args[1];
+[ $#_pa_args -gt 1 ] && set _pa_varname = $_pa_args[1] && set _pa_new_path = $_pa_args[2];
+
+# Check whether the variable is set yet.
+set _pa_old_value = ""
+eval set _pa_set = '$?'$_pa_varname
+[ $_pa_set -eq 1 ] && eval set _pa_old_value='$'$_pa_varname;
+
+# Do the actual prepending here, if it is a dir and not already in the path
+if ( -d $_pa_new_path && \:$_pa_old_value\: !~ *\:$_pa_new_path\:* ) then
+ [ -n "$_pa_old_value" ] && setenv $_pa_varname $_pa_new_path\:$_pa_old_value
+ [ -z "$_pa_old_value" ] && setenv $_pa_varname $_pa_new_path
+endif
+
+unset _pa_args _pa_new_path _pa_old_value _pa_set _pa_varname