Files
modules/script/envml.cmd
Xavier Delaruelle 516c540109 script: re-license envml scripts from GPLv3+ to GPLv2+
Change license of envml and envml.cmd scripts from GPLv3+ to GPLv2+.

Align this way all files from the Modules project under the GPLv2+
license.

Consent has been obtained from the copyright holders (I and @jraphanel)
to perform such move. Consent from Jacques Raphanel was collected by
email.

Related to #389
2021-03-02 19:31:29 +01:00

180 lines
4.9 KiB
Batchfile
Executable File

@echo off
setlocal enabledelayedexpansion
:: ENVML, setup environment with module then run specified command
:: Copyright (C) 2015-2021 CEA/DAM
::
:: This program is free software: you can redistribute it and/or modify
:: it under the terms of the GNU General Public License as published by
:: the Free Software Foundation, either version 2 of the License, or
:: (at your option) any later version.
::
:: This program is distributed in the hope that it will be useful,
:: but WITHOUT ANY WARRANTY; without even the implied warranty of
:: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
:: GNU General Public License for more details.
::
:: You should have received a copy of the GNU General Public License
:: along with this program. If not, see <http://www.gnu.org/licenses/>.
::
set progpath=%~dpnx0
set prog=%~nx0
set kind_of_arg=mod
set modarglist=
set maymodarglist=
set maycmdarglist=
set cmdarglist=
:: command help is asked
if "x%~1" equ "x" goto:echo_usage&goto:end_script
if "%~1" equ "-h" goto:echo_usage&goto:end_script
if "%~1" equ "--help" goto:echo_usage&goto:end_script
:: parse arguments
set ERRORLEVEL=
call :parse_args %*
if %ERRORLEVEL% NEQ 0 exit /B %ERRORLEVEL%&goto:end_script
:: if a cmd separator has been found what we thought
:: to be module-related is really module-related
if "%kind_of_arg%" equ "cmd" (
set modarglist=%modarglist%;%maymodarglist%
) else (
set cmdarglist=%maycmdarglist% %cmdarglist%
)
:: initialize Modules if not already done
if not defined MODULES_CMD (
call "%~dp0..\init\cmd.cmd"
)
:: load all required modules
call :load_mod "%modarglist%"
:: now execute the real command with its interpreter
if "x%cmdarglist%" equ "x" goto:end_script
set CALLARG=
set t=%cmdarglist:"=%
if "%t:.bat=%" neq "%t%" set "CALLARG=call "
%CALLARG%%cmdarglist% %maymodarglist%
:end_script
endlocal &set ERRORLEVEL=%ERRORLEVEL%
goto:eof
:: print message on stderr then exit
:echo_error
echo %prog%: %~1 >&2
exit /B 1
goto:eof
:arg_into_mod
set MODACTION=%~1
if "!kind_of_arg!" equ "mod" (
set modarglist=!modarglist!;%~1
) else (
set maymodarglist=!maymodarglist!;%~1
set maycmdarglist=!maycmdarglist! %~1
)
call :decompose_mod "%%~2"
goto:eof
:arg_into_modaction
for /F "tokens=1,* delims==" %%I in ("%~1") do (
if "!kind_of_arg!" equ "mod" (
set modarglist=!modarglist!;!MODACTION! %%~I
) else (
set maymodarglist=!maymodarglist!;!MODACTION! %%~I
set maycmdarglist=!maycmdarglist! %%~I
)
call :decompose_mod "%%~J"
)
goto:eof
:decompose_mod
for /F "tokens=1,* delims=;" %%I in ("%~1") do (
if "!kind_of_arg!" equ "mod" (
set modarglist=!modarglist! %%~I
) else (
set maycmdarglist=!maycmdarglist! %%~I
)
if "%%~J" neq "" call :decompose_mod "%%~J"
)
goto:eof
:: print usage message
:echo_usage
echo(Usage: %progpath% [MODULE_ACTION]... [--] COMMAND [ARG]...
echo(Run MODULE_ACTION(s) to setup environment then run COMMAND.
echo.
echo(Syntax of supported MODULE_ACTIONs:
echo( purge unload all loaded modulefiles
echo( restore[=coll] restore module list from collection named coll or
echo( default collection if no collection name provided
echo( unload=mod1[;mod2...] remove modulefile(s) mod1, (mod2...)
echo( switch=mod1;mod2 unload modulefile mod1 and load mod2
echo( [load=]mod1[;mod2...] load modulefile(s) mod1, (mod2...)
echo.
echo(To clearly separate command-line arguments from the module action arguments
echo(a '--' argument can be used. Without this '--' separator, first argument is
echo(considered module action and following arguments are part of command-line.
echo.
echo(Examples:
echo( %progpath% restore command arg1 arg2
echo( %progpath% purge:mod1:mod2 command arg1 arg2
echo( %progpath% restore load=mod1;mod2 -- command arg1 arg2
goto:eof
:: parse command-line arguments
:parse_args
:parse_start
if "x%~1" equ "x" goto:parse_end
if "%~1" equ "--" set kind_of_arg=cmd&shift&goto:parse_start
if "!kind_of_arg!" equ "cmd" set cmdarglist=%cmdarglist% "%~1"&shift&goto:parse_start
if "%~1" equ "purge" set action=%~1&shift&call :arg_into_mod "%~1"&goto:parse_start
if "%~1" equ "restore" set action=%~1&shift&call :arg_into_mod "%~1" "%~2"&shift&goto:parse_start
if "%~1" equ "unload" set action=%~1&shift&call :arg_into_mod "%~1" "%~2"&shift&goto:parse_start
if "%~1" equ "switch" set action=%~1&shift&call :arg_into_mod "%~1" "%~2"&shift&goto:parse_start
if "%~1" equ "load" set action=%~1&shift&call :arg_into_mod "%~1" "%~2"&shift&goto:parse_start
:: replace & by ; to avoid batch incompatibility
set "ARG0=%~1"
set ARG0=!ARG0:^&=;!
call :arg_into_modaction "!ARG0!"
shift
goto:parse_start
:parse_end
goto:eof
:load_mod
for /F "tokens=1,* delims=;" %%I in ("%~1") do (
if defined MODULE_DEBUG echo "module %%~I"
module %%~I
if !ERRORLEVEL! NEQ 0 exit /B !ERRORLEVEL!
if "%%~J" neq "" call :load_mod "%%~J"
)
goto:eof