diff options
author | John W. Parent <45471568+johnwparent@users.noreply.github.com> | 2021-07-07 08:32:47 -0400 |
---|---|---|
committer | Peter Scheibel <scheibel1@llnl.gov> | 2022-03-17 09:01:01 -0700 |
commit | e65d3d14b4a7a9a9667b006bea1f9f2eafc69472 (patch) | |
tree | f1a68cf906847887b44b9fe9afcf4cfc618d4a87 /bin/spack.bat | |
parent | 4a73bfc3b9c4507f270951757475e514cd666ead (diff) | |
download | spack-e65d3d14b4a7a9a9667b006bea1f9f2eafc69472.tar.gz spack-e65d3d14b4a7a9a9667b006bea1f9f2eafc69472.tar.bz2 spack-e65d3d14b4a7a9a9667b006bea1f9f2eafc69472.tar.xz spack-e65d3d14b4a7a9a9667b006bea1f9f2eafc69472.zip |
Relocate spack_cmd and scripts from installer to root bin (#24651)
Relocate spack_cmd and scripts from installer
to root bin
Refactor documentation, installer, and launcher
to facilitate that change
Diffstat (limited to 'bin/spack.bat')
-rw-r--r-- | bin/spack.bat | 223 |
1 files changed, 223 insertions, 0 deletions
diff --git a/bin/spack.bat b/bin/spack.bat new file mode 100644 index 0000000000..3b6b7905a4 --- /dev/null +++ b/bin/spack.bat @@ -0,0 +1,223 @@ +:: Copyright 2013-2021 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 file is part of Spack and sets up the spack environment for batch, +:: This includes environment modules and lmod support, +:: and it also puts spack in your path. The script also checks that at least +:: module support exists, and provides suggestions if it doesn't. Source +:: it like this: +:: +:: . /path/to/spack/install/spack_cmd.bat +:: +@echo off + +set spack=%SPACK_ROOT%\bin\spack + +::####################################################################### +:: This is a wrapper around the spack command that forwards calls to +:: 'spack load' and 'spack unload' to shell functions. This in turn +:: allows them to be used to invoke environment modules functions. +:: +:: 'spack load' is smarter than just 'load' because it converts its +:: arguments into a unique Spack spec that is then passed to module +:: commands. This allows the user to use packages without knowing all +:: their installation details. +:: +:: e.g., rather than requiring a full spec for libelf, the user can type: +:: +:: spack load libelf +:: +:: This will first find the available libelf module file and use a +:: matching one. If there are two versions of libelf, the user would +:: need to be more specific, e.g.: +:: +:: spack load 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 module files. +::####################################################################### + +:_sp_shell_wrapper +set "_sp_flags=" +set "_sp_args=" +set "_sp_subcommand=" +setlocal enabledelayedexpansion +:: commands have the form '[flags] [subcommand] [args]' +:: flags will always start with '-', e.g. --help or -V +:: subcommands will never start with '-' +:: everything after the subcommand is an arg +for %%x in (%*) do ( + set t="%%~x" + if "!t:~0,1!" == "-" ( + if defined _sp_subcommand ( + :: We already have a subcommand, processing args now + set "_sp_args=!_sp_args! !t!" + ) else ( + set "_sp_flags=!_sp_flags! !t!" + shift + ) + ) else if not defined _sp_subcommand ( + set "_sp_subcommand=!t!" + shift + ) else ( + set "_sp_args=!_sp_args! !t!" + shift + ) +) + +:: --help, -h and -V flags don't require further output parsing. +:: If we encounter, execute and exit +if defined _sp_flags ( + if NOT "%_sp_flags%"=="%_sp_flags:-h=%" ( + python "%spack%" %_sp_flags% + exit /B 0 + ) else if NOT "%_sp_flags%"=="%_sp_flags:--help=%" ( + python "%spack%" %_sp_flags% + exit /B 0 + ) else if NOT "%_sp_flags%"=="%_sp_flags:-V=%" ( + python "%spack%" %_sp_flags% + exit /B 0 + ) +) +:: pass parsed variables outside of local scope. Need to do +:: this because delayedexpansion can only be set by setlocal +echo %_sp_flags%>flags +echo %_sp_args%>args +echo %_sp_subcommand%>subcmd +endlocal +set /p _sp_subcommand=<subcmd +set /p _sp_flags=<flags +set /p _sp_args=<args +set str_subcommand=%_sp_subcommand:"='% +set str_flags=%_sp_flags:"='% +set str_args=%_sp_args:"='% +if "%str_subcommand%"=="ECHO is off." (set "_sp_subcommand=") +if "%str_flags%"=="ECHO is off." (set "_sp_flags=") +if "%str_args%"=="ECHO is off." (set "_sp_args=") +del subcmd +del flags +del args + +:: Filter out some commands. For any others, just run the command. +if "%_sp_subcommand%" == "cd" ( + goto :case_cd +) else if "%_sp_subcommand%" == "env" ( + goto :case_env +) else if "%_sp_subcommand%" == "load" ( + goto :case_load +) else if "%_sp_subcommand%" == "unload" ( + goto :case_load +) else ( + goto :default_case +) + +::####################################################################### + +:case_cd +:: Check for --help or -h +:: TODO: This is not exactly the same as setup-env. +:: In setup-env, '--help' or '-h' must follow the cd +:: Here, they may be anywhere in the args +if defined _sp_args ( + if NOT "%_sp_args%"=="%_sp_args:--help=%" ( + python "%spack%" cd -h + goto :end_switch + ) else if NOT "%_sp_args%"=="%_sp_args:-h=%" ( + python "%spack%" cd -h + goto :end_switch + ) +) + +for /F "tokens=* USEBACKQ" %%F in ( + `python "%spack%" location %_sp_args%`) do ( + set "LOC=%%F" +) +for %%Z in ("%LOC%") do if EXIST %%~sZ\NUL (cd /d "%LOC%") +goto :end_switch + +:case_env +:: If no args or args contain --bat or -h/--help: just execute. +if NOT defined _sp_args ( + goto :default_case +)else if NOT "%_sp_args%"=="%_sp_args:--help=%" ( + goto :default_case +) else if NOT "%_sp_args%"=="%_sp_args: -h=%" ( + goto :default_case +) else if NOT "%_sp_args%"=="%_sp_args:--bat=%" ( + goto :default_case +) else if NOT "%_sp_args%"=="%_sp_args:deactivate=%" ( + for /f "tokens=* USEBACKQ" %%I in ( + `call python "%spack%" %_sp_flags% env deactivate --bat %_sp_args:deactivate=%` + ) do %%I +) else if NOT "%_sp_args%"=="%_sp_args:activate=%" ( + for /f "tokens=* USEBACKQ" %%I in ( + `call python "%spack%" %_sp_flags% env activate --bat %_sp_args:activate=%` + ) do %%I +) else ( + goto :default_case +) +goto :end_switch + +:case_load +:: If args contain --sh, --csh, or -h/--help: just execute. +if defined _sp_args ( + if NOT "%_sp_args%"=="%_sp_args:--help=%" ( + goto :default_case + ) else if NOT "%_sp_args%"=="%_sp_args: -h=%" ( + goto :default_case + ) else if NOT "%_sp_args%"=="%_sp_args:--bat=%" ( + goto :default_case + ) +) + +for /f "tokens=* USEBACKQ" %%I in ( + `python "%spack%" %_sp_flags% %_sp_subcommand% --bat %_sp_args%`) do %%I +) +goto :end_switch + +:case_unload +goto :case_load + +:default_case +python "%spack%" %_sp_flags% %_sp_subcommand% %_sp_args% +goto :end_switch + +:end_switch +exit /B 0 + + +::######################################################################## +:: Prepends directories to path, if they exist. +:: pathadd /path/to/dir # add to PATH +:: or pathadd OTHERPATH /path/to/dir # add to OTHERPATH +::######################################################################## + +:_spack_pathadd +set "_pa_varname=PATH" +set "_pa_new_path=%~1" +if NOT "%~2" == "" ( + set "_pa_varname=%~1" + set "_pa_new_path=%~2" + ) +set "_pa_oldvalue=%_pa_varname%" +for %%Z in ("%_pa_new_path%") do if EXIST %%~sZ\NUL ( + if defined %_pa_oldvalue% ( + set "_pa_varname=%_pa_new_path%:%_pa_oldvalue%" + ) else ( + set "_pa_varname=%_pa_new_path%" + ) +) +exit /b 0 + +:: set module system roots +:_sp_multi_pathadd +for %%I in (%~2) do ( + for %%Z in (%_sp_compatible_sys_types%) do ( + :pathadd "%~1" "%%I\%%Z" + ) +) +exit /B 0
\ No newline at end of file |