summaryrefslogtreecommitdiff
path: root/share/spack/csh/spack.csh
blob: a773dd216bfe4985aff1a1a5df9dc4e85b99e441 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# Copyright 2013-2018 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)

########################################################################
# 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.
########################################################################
# 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-])

# Figure out what type of module we're running here.
set _sp_modtype = ""
switch ($_sp_subcommand)
case cd:
    shift _sp_args  # get rid of 'cd'

    set _sp_arg=""
    [ $#_sp_args -gt 0 ] && set _sp_arg = ($_sp_args[1])
    shift _sp_args

    if ( "$_sp_arg" == "-h" ) then
        \spack cd -h
    else
        cd `\spack location $_sp_arg $_sp_args`
    endif
    breaksw
case env:
    shift _sp_args  # get rid of 'env'

    set _sp_arg=""
    [ $#_sp_args -gt 0 ] && set _sp_arg = ($_sp_args[1])

    if ( "$_sp_arg" == "-h" ) then
        \spack env -h
    else
        switch ($_sp_arg)
            case activate:
                set _sp_env_arg=""
                [ $#_sp_args -gt 1 ] && set _sp_env_arg = ($_sp_args[2])

                if ( "$_sp_env_arg" == "" || "$_sp_args" =~ "*--sh*" || "$_sp_args" =~ "*--csh*" || "$_sp_args" =~ "*-h*" ) then
                    # no args or args contain -h/--help, --sh, or --csh: just execute
                    \spack $_sp_flags env $_sp_args
                else
                    shift _sp_args  # consume 'activate' or 'deactivate'
                    # actual call to activate: source the output
                    eval `\spack $_sp_flags env activate --csh $_sp_args`
                endif
                breaksw
            case deactivate:
                set _sp_env_arg=""
                [ $#_sp_args -gt 1 ] && set _sp_env_arg = ($_sp_args[2])

                if ( "$_sp_env_arg" != "" ) then
                    # with args: execute the command
                    \spack $_sp_flags env $_sp_args
                else
                    # no args: source the output
                    eval `\spack $_sp_flags env deactivate --csh`
                endif
                breaksw
            default:
                echo default
                \spack $_sp_flags env $_sp_args
                breaksw
        endsw
    endif
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

    # 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.
    switch ($_sp_subcommand)
        case "use":
            set _sp_full_spec = ( "`\spack $_sp_flags module dotkit find $_sp_spec`" )
            if ( $? == 0 ) then
                use $_sp_module_args $_sp_full_spec
            endif
            breaksw
        case "unuse":
            set _sp_full_spec = ( "`\spack $_sp_flags module dotkit find $_sp_spec`" )
            if ( $? == 0 ) then
                unuse $_sp_module_args $_sp_full_spec
            endif
            breaksw
        case "load":
            set _sp_full_spec = ( "`\spack $_sp_flags module tcl find $_sp_spec`" )
            if ( $? == 0 ) then
                module load $_sp_module_args $_sp_full_spec
            endif
            breaksw
        case "unload":
            set _sp_full_spec = ( "`\spack $_sp_flags module tcl find $_sp_spec`" )
            if ( $? == 0 ) then
                module unload $_sp_module_args $_sp_full_spec
            endif
            breaksw
    endsw
    breaksw

default:
    \spack $_sp_flags $_sp_args
    breaksw
endsw

_sp_end:
unset _sp_args _sp_full_spec _sp_modtype _sp_module_args
unset _sp_sh_cmd _sp_spec _sp_subcommand _sp_flags
unset _sp_arg _sp_env_arg