diff options
Diffstat (limited to 'bin')
-rw-r--r-- | bin/haspywin.py | 20 | ||||
-rw-r--r-- | bin/spack.bat | 223 | ||||
-rw-r--r-- | bin/spack_cmd.bat | 61 |
3 files changed, 304 insertions, 0 deletions
diff --git a/bin/haspywin.py b/bin/haspywin.py new file mode 100644 index 0000000000..ea08e74d41 --- /dev/null +++ b/bin/haspywin.py @@ -0,0 +1,20 @@ +# 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) +import subprocess +import sys + + +def getpywin(): + try: + import win32con # noqa + except ImportError: + subprocess.check_call( + [sys.executable, "-m", "pip", "-q", "install", "--upgrade", "pip"]) + subprocess.check_call( + [sys.executable, "-m", "pip", "-q", "install", "pywin32"]) + + +if __name__ == '__main__': + getpywin() 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 diff --git a/bin/spack_cmd.bat b/bin/spack_cmd.bat new file mode 100644 index 0000000000..6d851d5311 --- /dev/null +++ b/bin/spack_cmd.bat @@ -0,0 +1,61 @@ +@ECHO OFF +setlocal EnableDelayedExpansion +:: (c) 2021 Lawrence Livermore National Laboratory +:: To use this file independently of Spack's installer, execute this script in its directory, or add the +:: associated bin directory to your PATH. Invoke to launch Spack Shell. +:: +:: source_dir/spack/bin/spack_cmd.bat +:: +pushd %~dp0.. +set SPACK_ROOT=%CD% +pushd %CD%\.. +set spackinstdir=%CD% +popd + + +:: Check if Python is on the PATH +(for /f "delims=" %%F in ('where python.exe') do (set python_pf_ver=%%F) ) 2> NUL + +if not defined python_pf_ver ( + :: If not, look for Python from the Spack installer + :get_builtin + (for /f "tokens=*" %%g in ('dir /b /a:d "!spackinstdir!\Python*"') do ( + set python_ver=%%g)) 2> NUL + + if not defined python_ver ( + echo Python was not found on your system. + echo Please install Python or add Python to your PATH. + ) else ( + set py_path=!spackinstdir!\!python_ver! + set py_exe=!py_path!\python.exe + ) + goto :exitpoint +) else ( + :: Python is already on the path + set py_exe=!python_pf_ver! + (for /F "tokens=* USEBACKQ" %%F in ( + `!py_exe! --version`) do (set "output=%%F")) 2>NUL + if not "!output:Microsoft Store=!"=="!output!" goto :get_builtin + goto :exitpoint +) +:exitpoint + +set "PATH=%SPACK_ROOT%\bin\;%PATH%" +if defined py_path ( + set "PATH=%py_path%;%PATH%" +) + +if defined py_exe ( + "%py_exe%" "%SPACK_ROOT%\bin\haspywin.py" + "%py_exe%" "%SPACK_ROOT%\bin\spack" external find python >NUL +) + +set "EDITOR=notepad" + +DOSKEY spacktivate=spack env activate $* + +@echo ********************************************************************** +@echo ** Spack Package Manager +@echo ********************************************************************** + +%comspec% /k |