From 143341c7fe0126a8100970e59e755bba8f7de771 Mon Sep 17 00:00:00 2001 From: Alan O'Cais Date: Wed, 28 Jan 2026 17:49:59 +0100 Subject: [PATCH 01/17] Make all shell initialisations more robust --- init/lmod/bash | 27 +++++++++++++++++---------- init/lmod/csh | 28 ++++++++++++++++++---------- init/lmod/fish | 26 +++++++++++++++++--------- init/lmod/ksh | 28 ++++++++++++++++++---------- init/lmod/zsh | 28 ++++++++++++++++++---------- 5 files changed, 88 insertions(+), 49 deletions(-) diff --git a/init/lmod/bash b/init/lmod/bash index daba8351..7ca71b4f 100644 --- a/init/lmod/bash +++ b/init/lmod/bash @@ -3,17 +3,24 @@ EESSI_CVMFS_REPO="${EESSI_CVMFS_REPO:-/cvmfs/software.eessi.io}" # Choose an EESSI version EESSI_VERSION_DEFAULT="__EESSI_VERSION_DEFAULT__" EESSI_VERSION="${EESSI_VERSION:-${EESSI_VERSION_DEFAULT}}" -# Path to top-level module tree -export MODULEPATH="${EESSI_CVMFS_REPO}/versions/${EESSI_VERSION}/init/modules" -. "${EESSI_CVMFS_REPO}/versions/${EESSI_VERSION}/compat/linux/$(uname -m)/usr/share/Lmod/init/bash" +# Now that we know our EESSI version let's not forget it +export EESSI_VERSION_DEFAULT="$EESSI_VERSION" -if [ -z "$__Init_Default_Modules" ]; then - export __Init_Default_Modules=1; +# ability to predefine elsewhere the default list +LMOD_SYSTEM_DEFAULT_MODULES=${LMOD_SYSTEM_DEFAULT_MODULES:-"EESSI/$EESSI_VERSION"} +export LMOD_SYSTEM_DEFAULT_MODULES - ## ability to predefine elsewhere the default list - LMOD_SYSTEM_DEFAULT_MODULES=${LMOD_SYSTEM_DEFAULT_MODULES:-"EESSI/$EESSI_VERSION"} - export LMOD_SYSTEM_DEFAULT_MODULES - module --initial_load --no_redirect restore +if [ -z "$__Init_EESSI_Default_Modules" ]; then + export __Init_EESSI_Default_Modules=1; + + # If there is a local Lmod, make it forget about the system set MODULEPATH + unset __LMOD_REF_COUNT_MODULEPATH + # and clear out any memory Lmod might have + unset _ModuleTable001_ + # Path to top-level module tree + export MODULEPATH="${EESSI_CVMFS_REPO}/init/modules" + . "${EESSI_CVMFS_REPO}/versions/${EESSI_VERSION}/compat/linux/$(uname -m)/usr/share/Lmod/init/bash" + module --initial_load --no_redirect restore else - module refresh + module reset fi diff --git a/init/lmod/csh b/init/lmod/csh index 2adb314c..0122981b 100644 --- a/init/lmod/csh +++ b/init/lmod/csh @@ -7,18 +7,26 @@ setenv EESSI_VERSION_DEFAULT "__EESSI_VERSION_DEFAULT__" if (! $?EESSI_VERSION) then set EESSI_VERSION = "${EESSI_VERSION_DEFAULT}" endif -# Path to top-level module tree -setenv MODULEPATH "${EESSI_CVMFS_REPO}/versions/${EESSI_VERSION}/init/modules" -source "${EESSI_CVMFS_REPO}/versions/${EESSI_VERSION}/compat/linux/`uname -m`/usr/share/Lmod/init/csh" +# Now that we know our EESSI version let's not forget it +setenv EESSI_VERSION_DEFAULT="$EESSI_VERSION" -if (! $?__Init_Default_Modules ) then - setenv __Init_Default_Modules 1 +# ability to predefine elsewhere the default list +if (! $?LMOD_SYSTEM_DEFAULT_MODULES) then + setenv LMOD_SYSTEM_DEFAULT_MODULES "EESSI/${EESSI_VERSION}" +endif + +if (! $?__Init_EESSI_Default_Modules ) then + setenv __Init_EESSI_Default_Modules 1 + + # If there is a local Lmod, make it forget about the system set MODULEPATH + unsetenv __LMOD_REF_COUNT_MODULEPATH + # and clear out any memory Lmod might have + unsetenv _ModuleTable001_ + # Path to top-level module tree + setenv MODULEPATH "${EESSI_CVMFS_REPO}/init/modules" + source "${EESSI_CVMFS_REPO}/versions/${EESSI_VERSION}/compat/linux/`uname -m`/usr/share/Lmod/init/csh" - # ability to predefine elsewhere the default list - if (! $?LMOD_SYSTEM_DEFAULT_MODULES) then - setenv LMOD_SYSTEM_DEFAULT_MODULES "EESSI/${EESSI_VERSION}" - endif module --initial_load --no_redirect restore else - module refresh + module reset endif diff --git a/init/lmod/fish b/init/lmod/fish index 9e595441..2db34045 100644 --- a/init/lmod/fish +++ b/init/lmod/fish @@ -3,16 +3,24 @@ set EESSI_CVMFS_REPO (set -q EESSI_CVMFS_REPO; and echo "$EESSI_CVMFS_REPO"; or # Choose an EESSI version set EESSI_VERSION_DEFAULT "__EESSI_VERSION_DEFAULT__" set EESSI_VERSION (set -q EESSI_VERSION; and echo "$EESSI_VERSION"; or echo "$EESSI_VERSION_DEFAULT") -# Path to top-level module tree -set -x MODULEPATH "$EESSI_CVMFS_REPO"/versions/"$EESSI_VERSION"/init/modules -. "$EESSI_CVMFS_REPO"/versions/"$EESSI_VERSION"/compat/linux/(uname -m)/usr/share/Lmod/init/fish +# Now that we know our EESSI version let's not forget it +set -x EESSI_VERSION_DEFAULT "$EESSI_VERSION" -if test -z "$__Init_Default_Modules" - export __Init_Default_Modules=1; +# ability to predefine elsewhere the default list +set -x LMOD_SYSTEM_DEFAULT_MODULES (set -q LMOD_SYSTEM_DEFAULT_MODULE; and echo "$LMOD_SYSTEM_DEFAULT_MODULE"; or echo "EESSI/$EESSI_VERSION") - ## ability to predefine elsewhere the default list - set -x LMOD_SYSTEM_DEFAULT_MODULES (set -q LMOD_SYSTEM_DEFAULT_MODULE; and echo "$LMOD_SYSTEM_DEFAULT_MODULE"; or echo "EESSI/$EESSI_VERSION") - module --initial_load --no_redirect restore +if test -z "$__Init_EESSI_Default_Modules" + set -x __Init_EESSI_Default_Modules 1 + + # If there is a local Lmod, make it forget about the system set MODULEPATH + set -e __LMOD_REF_COUNT_MODULEPATH + # and clear out any memory Lmod might have + set -e _ModuleTable001_ + # Path to top-level module tree + set -x MODULEPATH "$EESSI_CVMFS_REPO"/init/modules + . "$EESSI_CVMFS_REPO"/versions/"$EESSI_VERSION"/compat/linux/(uname -m)/usr/share/Lmod/init/fish + + module --initial_load --no_redirect restore else - module refresh + module reset end diff --git a/init/lmod/ksh b/init/lmod/ksh index ebf4c0ca..5be0cacd 100644 --- a/init/lmod/ksh +++ b/init/lmod/ksh @@ -3,17 +3,25 @@ EESSI_CVMFS_REPO="${EESSI_CVMFS_REPO:-/cvmfs/software.eessi.io}" # Choose an EESSI version EESSI_VERSION_DEFAULT="__EESSI_VERSION_DEFAULT__" EESSI_VERSION="${EESSI_VERSION:-${EESSI_VERSION_DEFAULT}}" -# Path to top-level module tree -export MODULEPATH="${EESSI_CVMFS_REPO}/versions/${EESSI_VERSION}/init/modules" -. "${EESSI_CVMFS_REPO}/versions/${EESSI_VERSION}/compat/linux/$(uname -m)/usr/share/Lmod/init/ksh" +# Now that we know our EESSI version let's not forget it +export EESSI_VERSION_DEFAULT="$EESSI_VERSION" -if [ -z "$__Init_Default_Modules" ]; then - export __Init_Default_Modules=1; +## ability to predefine elsewhere the default list +LMOD_SYSTEM_DEFAULT_MODULES=${LMOD_SYSTEM_DEFAULT_MODULES:-"EESSI/$EESSI_VERSION"} +export LMOD_SYSTEM_DEFAULT_MODULES + +if [ -z "$__Init_EESSI_Default_Modules" ]; then + export __Init_EESSI_Default_Modules=1; - ## ability to predefine elsewhere the default list - LMOD_SYSTEM_DEFAULT_MODULES=${LMOD_SYSTEM_DEFAULT_MODULES:-"EESSI/$EESSI_VERSION"} - export LMOD_SYSTEM_DEFAULT_MODULES - module --initial_load --no_redirect restore + # If there is a local Lmod, make it forget about the system set MODULEPATH + unset __LMOD_REF_COUNT_MODULEPATH + # and clear out any memory Lmod might have + unset _ModuleTable001_ + # Path to top-level module tree + export MODULEPATH="${EESSI_CVMFS_REPO}/init/modules" + . "${EESSI_CVMFS_REPO}/versions/${EESSI_VERSION}/compat/linux/$(uname -m)/usr/share/Lmod/init/ksh" + + module --initial_load --no_redirect restore else - module refresh + module reset fi diff --git a/init/lmod/zsh b/init/lmod/zsh index dfdff0c7..f8abfbd0 100644 --- a/init/lmod/zsh +++ b/init/lmod/zsh @@ -3,17 +3,25 @@ EESSI_CVMFS_REPO="${EESSI_CVMFS_REPO:-/cvmfs/software.eessi.io}" # Choose an EESSI version EESSI_VERSION_DEFAULT="__EESSI_VERSION_DEFAULT__" EESSI_VERSION="${EESSI_VERSION:-${EESSI_VERSION_DEFAULT}}" -# Path to top-level module tree -export MODULEPATH="${EESSI_CVMFS_REPO}/versions/${EESSI_VERSION}/init/modules" -. "${EESSI_CVMFS_REPO}/versions/${EESSI_VERSION}/compat/linux/$(uname -m)/usr/share/Lmod/init/zsh" +# Now that we know our EESSI version let's not forget it +export EESSI_VERSION_DEFAULT="$EESSI_VERSION" -if [ -z "$__Init_Default_Modules" ]; then - export __Init_Default_Modules=1; +# ability to predefine elsewhere the default list +LMOD_SYSTEM_DEFAULT_MODULES=${LMOD_SYSTEM_DEFAULT_MODULES:-"EESSI/$EESSI_VERSION"} +export LMOD_SYSTEM_DEFAULT_MODULES - ## ability to predefine elsewhere the default list - LMOD_SYSTEM_DEFAULT_MODULES=${LMOD_SYSTEM_DEFAULT_MODULES:-"EESSI/$EESSI_VERSION"} - export LMOD_SYSTEM_DEFAULT_MODULES - module --initial_load --no_redirect restore +if [ -z "$__Init_EESSI_Default_Modules" ]; then + export __Init_EESSI_Default_Modules=1; + + # If there is a local Lmod, make it forget about the system set MODULEPATH + unset __LMOD_REF_COUNT_MODULEPATH + # and clear out any memory Lmod might have + unset _ModuleTable001_ + # Path to top-level module tree + export MODULEPATH="${EESSI_CVMFS_REPO}/init/modules" + . "${EESSI_CVMFS_REPO}/versions/${EESSI_VERSION}/compat/linux/$(uname -m)/usr/share/Lmod/init/zsh" + + module --initial_load --no_redirect restore else - module refresh + module reset fi From a428f6882558cf0596c77d8b314156d05f1168e4 Mon Sep 17 00:00:00 2001 From: Alan O'Cais Date: Wed, 28 Jan 2026 20:50:17 +0100 Subject: [PATCH 02/17] Fix typo and tests --- .github/workflows/scripts/test_init_scripts.sh | 2 +- init/lmod/csh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/scripts/test_init_scripts.sh b/.github/workflows/scripts/test_init_scripts.sh index f543835c..979067f5 100755 --- a/.github/workflows/scripts/test_init_scripts.sh +++ b/.github/workflows/scripts/test_init_scripts.sh @@ -49,7 +49,7 @@ for shell in ${SHELLS[@]}; do assert_raises 'echo "${MODULE_SECTIONS[1]}" | grep -E "$PATTERN"' # TEST 3: Check if module overviews second section is the EESSI init module - assert "echo ${MODULE_SECTIONS[4]}" "/cvmfs/software.eessi.io/versions/$EESSI_VERSION/init/modules" + assert "echo ${MODULE_SECTIONS[4]}" "/cvmfs/software.eessi.io/init/modules" # TEST 4: Load EasyBuild module and check version # eb --version outputs: "This is EasyBuild 5.1.1 (framework: 5.1.1, easyblocks: 5.1.1) on host ..." diff --git a/init/lmod/csh b/init/lmod/csh index 0122981b..88771ad3 100644 --- a/init/lmod/csh +++ b/init/lmod/csh @@ -8,7 +8,7 @@ if (! $?EESSI_VERSION) then set EESSI_VERSION = "${EESSI_VERSION_DEFAULT}" endif # Now that we know our EESSI version let's not forget it -setenv EESSI_VERSION_DEFAULT="$EESSI_VERSION" +setenv EESSI_VERSION_DEFAULT "$EESSI_VERSION" # ability to predefine elsewhere the default list if (! $?LMOD_SYSTEM_DEFAULT_MODULES) then From c3d3159bb66909131292649e9d216b01ecff0cca Mon Sep 17 00:00:00 2001 From: Alan O'Cais Date: Wed, 28 Jan 2026 21:16:47 +0100 Subject: [PATCH 03/17] See where the error is --- .github/workflows/scripts/test_init_scripts.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/scripts/test_init_scripts.sh b/.github/workflows/scripts/test_init_scripts.sh index 979067f5..62d66959 100755 --- a/.github/workflows/scripts/test_init_scripts.sh +++ b/.github/workflows/scripts/test_init_scripts.sh @@ -47,6 +47,7 @@ for shell in ${SHELLS[@]}; do fi PATTERN="/cvmfs/software\.eessi\.io/versions/$EESSI_VERSION/software/linux/x86_64/(intel/haswell|amd/zen3)/modules/all" assert_raises 'echo "${MODULE_SECTIONS[1]}" | grep -E "$PATTERN"' + echo "${MODULE_SECTIONS[1]}" "$PATTERN" # TEST 3: Check if module overviews second section is the EESSI init module assert "echo ${MODULE_SECTIONS[4]}" "/cvmfs/software.eessi.io/init/modules" @@ -72,6 +73,7 @@ for shell in ${SHELLS[@]}; do PATTERN="/cvmfs/software\.eessi\.io/versions/$EESSI_VERSION/software/linux/x86_64/(intel/haswell|amd/zen3)/software/EasyBuild/${EXPECTED_EASYBUILD_VERSION//./\\.}/bin/eb" echo "$EASYBUILD_PATH" | grep -E "$PATTERN" assert_raises 'echo "$EASYBUILD_PATH" | grep -E "$PATTERN"' + echo "$EASYBUILD_PATH" "$PATTERN" # End Test Suite assert_end "source_eessi_$shell" From 3692346bd1634a80ee1e63374304c035e7277eaa Mon Sep 17 00:00:00 2001 From: Alan O'Cais Date: Thu, 29 Jan 2026 15:23:04 +0100 Subject: [PATCH 04/17] Add new capabilities and new tests --- .github/workflows/modules/append_module.lua | 3 +++ .github/workflows/modules/prepend_module.lua | 3 +++ .../workflows/scripts/test_init_scripts.sh | 27 +++++++++++++++++++ init/lmod/bash | 12 ++++++--- init/lmod/csh | 23 ++++++++++++---- init/lmod/fish | 23 +++++++++++++--- init/lmod/ksh | 12 ++++++--- init/lmod/zsh | 12 ++++++--- 8 files changed, 94 insertions(+), 21 deletions(-) create mode 100644 .github/workflows/modules/append_module.lua create mode 100644 .github/workflows/modules/prepend_module.lua diff --git a/.github/workflows/modules/append_module.lua b/.github/workflows/modules/append_module.lua new file mode 100644 index 00000000..e45cb640 --- /dev/null +++ b/.github/workflows/modules/append_module.lua @@ -0,0 +1,3 @@ +setenv("INSIDE_GITHUB_ACTIONS", "true") +-- Interfere with PATH so Lmod keeps a record +prepend_path("PATH", "/snap/bin") diff --git a/.github/workflows/modules/prepend_module.lua b/.github/workflows/modules/prepend_module.lua new file mode 100644 index 00000000..e45cb640 --- /dev/null +++ b/.github/workflows/modules/prepend_module.lua @@ -0,0 +1,3 @@ +setenv("INSIDE_GITHUB_ACTIONS", "true") +-- Interfere with PATH so Lmod keeps a record +prepend_path("PATH", "/snap/bin") diff --git a/.github/workflows/scripts/test_init_scripts.sh b/.github/workflows/scripts/test_init_scripts.sh index 62d66959..2e3a5a58 100755 --- a/.github/workflows/scripts/test_init_scripts.sh +++ b/.github/workflows/scripts/test_init_scripts.sh @@ -75,6 +75,33 @@ for shell in ${SHELLS[@]}; do assert_raises 'echo "$EASYBUILD_PATH" | grep -E "$PATTERN"' echo "$EASYBUILD_PATH" "$PATTERN" + # TEST 6 and 7: Check the various options (EESSI_SYSTEM_DEFAULT_MODULES_APPEND, EESSI_SYSTEM_DEFAULT_MODULES_APPEND, EESSI_EXTRA_MODULEPATH) all work + if [ "$shell" = "csh" ]; then + echo "setenv EESSI_SYSTEM_DEFAULT_MODULES_APPEND append_module" > ~/.cshrc + echo "setenv EESSI_SYSTEM_DEFAULT_MODULES_PREPEND prepend_module" >> ~/.cshrc + echo "setenv EESSI_EXTRA_MODULEPATH .github/workflows/modules" >> ~/.cshrc + echo "source init/lmod/$shell" >> ~/.cshrc + TEST_LMOD_SYSTEM_DEFAULT_MODULES=$($shell -c 'echo $LMOD_SYSTEM_DEFAULT_MODULES') + TEST_MODULEPATH=$($shell -c 'echo $MODULEPATH') + elif [ "$shell" = "fish" ]; then + TEST_LMOD_SYSTEM_DEFAULT_MODULES=$($shell -c 'set -x EESSI_SYSTEM_DEFAULT_MODULES_APPEND append_module ; set -x EESSI_SYSTEM_DEFAULT_MODULES_PREPEND prepend_module ; set -x EESSI_EXTRA_MODULEPATH .github/workflows/modules ; source init/lmod/'"$shell"' 2>/dev/null; echo $LMOD_SYSTEM_DEFAULT_MODULES') + TEST_MODULEPATH=$($shell -c 'set -x EESSI_SYSTEM_DEFAULT_MODULES_APPEND append_module ; set -x EESSI_SYSTEM_DEFAULT_MODULES_PREPEND prepend_module ; set -x EESSI_EXTRA_MODULEPATH .github/workflows/modules ; source init/lmod/'"$shell"' 2>/dev/null; echo $MODULEPATH') + else + TEST_LMOD_SYSTEM_DEFAULT_MODULES=$($shell -c 'export EESSI_SYSTEM_DEFAULT_MODULES_APPEND=append_module ; export EESSI_SYSTEM_DEFAULT_MODULES_PREPEND=prepend_module ; export EESSI_EXTRA_MODULEPATH=.github/workflows/modules ; source init/lmod/'"$shell"' ; echo $LMOD_SYSTEM_DEFAULT_MODULES') + TEST_MODULEPATH=$($shell -c 'export EESSI_SYSTEM_DEFAULT_MODULES_APPEND=append_module ; export EESSI_SYSTEM_DEFAULT_MODULES_PREPEND=prepend_module ; export EESSI_EXTRA_MODULEPATH=.github/workflows/modules ; source init/lmod/'"$shell"' 2>/dev/null; echo $MODULEPATH') + fi + # escape the dots in ${EASYBUILD_VERSION} + LMOD_SYSTEM_DEFAULT_MODULES_PATTERN='^prepend_module:.*:append_module$' + echo "$TEST_LMOD_SYSTEM_DEFAULT_MODULES" AND "$LMOD_SYSTEM_DEFAULT_MODULES_PATTERN" + assert_raises 'echo "$TEST_LMOD_SYSTEM_DEFAULT_MODULES" | grep -E "$LMOD_SYSTEM_DEFAULT_MODULES_PATTERN"' + if [ "$shell" = "fish" ]; then + MODULEPATH_PATTERN='\.github/workflows/modules$' + else + MODULEPATH_PATTERN=':\.github/workflows/modules$' + fi + echo "$TEST_MODULEPATH" AND "$MODULEPATH_PATTERN" + assert_raises 'echo "$TEST_MODULEPATH" | grep -E "$MODULEPATH_PATTERN"' + # End Test Suite assert_end "source_eessi_$shell" fi diff --git a/init/lmod/bash b/init/lmod/bash index 7ca71b4f..02e7d37a 100644 --- a/init/lmod/bash +++ b/init/lmod/bash @@ -6,20 +6,24 @@ EESSI_VERSION="${EESSI_VERSION:-${EESSI_VERSION_DEFAULT}}" # Now that we know our EESSI version let's not forget it export EESSI_VERSION_DEFAULT="$EESSI_VERSION" -# ability to predefine elsewhere the default list -LMOD_SYSTEM_DEFAULT_MODULES=${LMOD_SYSTEM_DEFAULT_MODULES:-"EESSI/$EESSI_VERSION"} +# ability to predefine elsewhere the default list (with options to append or prepend) +LMOD_SYSTEM_DEFAULT_MODULES="${EESSI_SYSTEM_DEFAULT_MODULES_PREPEND:+$EESSI_SYSTEM_DEFAULT_MODULES_PREPEND:}EESSI/$EESSI_VERSION${EESSI_SYSTEM_DEFAULT_MODULES_APPEND:+:$EESSI_SYSTEM_DEFAULT_MODULES_APPEND}" export LMOD_SYSTEM_DEFAULT_MODULES if [ -z "$__Init_EESSI_Default_Modules" ]; then export __Init_EESSI_Default_Modules=1; + # Lmod version in 2023.06 has a problem with newer Lmod caches, so let's stick to more recent Lmod + # (has no effect except on Lmod itself, and compatible caches are still created/supported by EESSI) + LMOD_EESSI_VERSION=${EESSI_VERSION/2023.06/2025.06} + # If there is a local Lmod, make it forget about the system set MODULEPATH unset __LMOD_REF_COUNT_MODULEPATH # and clear out any memory Lmod might have unset _ModuleTable001_ # Path to top-level module tree - export MODULEPATH="${EESSI_CVMFS_REPO}/init/modules" - . "${EESSI_CVMFS_REPO}/versions/${EESSI_VERSION}/compat/linux/$(uname -m)/usr/share/Lmod/init/bash" + export MODULEPATH="${EESSI_CVMFS_REPO}/init/modules${EESSI_EXTRA_MODULEPATH:+:$EESSI_EXTRA_MODULEPATH}" + . "${EESSI_CVMFS_REPO}/versions/${LMOD_EESSI_VERSION}/compat/linux/$(uname -m)/usr/share/Lmod/init/bash" module --initial_load --no_redirect restore else module reset diff --git a/init/lmod/csh b/init/lmod/csh index 88771ad3..dddb1fbf 100644 --- a/init/lmod/csh +++ b/init/lmod/csh @@ -10,21 +10,34 @@ endif # Now that we know our EESSI version let's not forget it setenv EESSI_VERSION_DEFAULT "$EESSI_VERSION" -# ability to predefine elsewhere the default list -if (! $?LMOD_SYSTEM_DEFAULT_MODULES) then - setenv LMOD_SYSTEM_DEFAULT_MODULES "EESSI/${EESSI_VERSION}" +# ability to predefine elsewhere the default list (with options to append or prepend) +set LMOD_SYSTEM_DEFAULT_MODULES = "EESSI/$EESSI_VERSION" +if ( $?EESSI_SYSTEM_DEFAULT_MODULES_PREPEND ) then + set LMOD_SYSTEM_DEFAULT_MODULES = "$EESSI_SYSTEM_DEFAULT_MODULES_PREPEND:$LMOD_SYSTEM_DEFAULT_MODULES" endif +if ( $?EESSI_SYSTEM_DEFAULT_MODULES_APPEND ) then + set LMOD_SYSTEM_DEFAULT_MODULES = "$LMOD_SYSTEM_DEFAULT_MODULES:$EESSI_SYSTEM_DEFAULT_MODULES_APPEND" +endif +setenv LMOD_SYSTEM_DEFAULT_MODULES "$LMOD_SYSTEM_DEFAULT_MODULES" if (! $?__Init_EESSI_Default_Modules ) then setenv __Init_EESSI_Default_Modules 1 + # Lmod version in 2023.06 has a problem with newer Lmod caches, so let's stick to more recent Lmod + # (has no effect except on Lmod itself, and compatible caches are still created/supported by EESSI) + set LMOD_EESSI_VERSION "$EESSI_VERSION:s/2023.06/2025.06/" + # If there is a local Lmod, make it forget about the system set MODULEPATH unsetenv __LMOD_REF_COUNT_MODULEPATH # and clear out any memory Lmod might have unsetenv _ModuleTable001_ # Path to top-level module tree - setenv MODULEPATH "${EESSI_CVMFS_REPO}/init/modules" - source "${EESSI_CVMFS_REPO}/versions/${EESSI_VERSION}/compat/linux/`uname -m`/usr/share/Lmod/init/csh" + set modulepath = "$EESSI_CVMFS_REPO/init/modules" + if ( $?EESSI_EXTRA_MODULEPATH && "$EESSI_EXTRA_MODULEPATH" != "" ) then + set modulepath = "$modulepath:$EESSI_EXTRA_MODULEPATH" + endif + setenv MODULEPATH "$modulepath" + source "${EESSI_CVMFS_REPO}/versions/${LMOD_EESSI_VERSION}/compat/linux/`uname -m`/usr/share/Lmod/init/csh" module --initial_load --no_redirect restore else diff --git a/init/lmod/fish b/init/lmod/fish index 2db34045..742511c8 100644 --- a/init/lmod/fish +++ b/init/lmod/fish @@ -6,19 +6,34 @@ set EESSI_VERSION (set -q EESSI_VERSION; and echo "$EESSI_VERSION"; or echo "$EE # Now that we know our EESSI version let's not forget it set -x EESSI_VERSION_DEFAULT "$EESSI_VERSION" -# ability to predefine elsewhere the default list -set -x LMOD_SYSTEM_DEFAULT_MODULES (set -q LMOD_SYSTEM_DEFAULT_MODULE; and echo "$LMOD_SYSTEM_DEFAULT_MODULE"; or echo "EESSI/$EESSI_VERSION") +# ability to predefine elsewhere the default list (with options to append or prepend) +set LMOD_SYSTEM_DEFAULT_MODULES "EESSI/$EESSI_VERSION" +if set -q EESSI_SYSTEM_DEFAULT_MODULES_PREPEND + set LMOD_SYSTEM_DEFAULT_MODULES "$EESSI_SYSTEM_DEFAULT_MODULES_PREPEND:$LMOD_SYSTEM_DEFAULT_MODULES" +end +if set -q EESSI_SYSTEM_DEFAULT_MODULES_APPEND + set LMOD_SYSTEM_DEFAULT_MODULES "$LMOD_SYSTEM_DEFAULT_MODULES:$EESSI_SYSTEM_DEFAULT_MODULES_APPEND" +end +set -x LMOD_SYSTEM_DEFAULT_MODULES $LMOD_SYSTEM_DEFAULT_MODULES if test -z "$__Init_EESSI_Default_Modules" set -x __Init_EESSI_Default_Modules 1 + # Lmod version in 2023.06 has a problem with newer Lmod caches, so let's stick to more recent Lmod + # (has no effect except on Lmod itself, and compatible caches are still created/supported by EESSI) + set LMOD_EESSI_VERSION (string replace 2023.06 2025.06 -- $EESSI_VERSION) + # If there is a local Lmod, make it forget about the system set MODULEPATH set -e __LMOD_REF_COUNT_MODULEPATH # and clear out any memory Lmod might have set -e _ModuleTable001_ # Path to top-level module tree - set -x MODULEPATH "$EESSI_CVMFS_REPO"/init/modules - . "$EESSI_CVMFS_REPO"/versions/"$EESSI_VERSION"/compat/linux/(uname -m)/usr/share/Lmod/init/fish + set modulepath "$EESSI_CVMFS_REPO/init/modules" + if set -q EESSI_EXTRA_MODULEPATH; and test -n "$EESSI_EXTRA_MODULEPATH" + set modulepath "$modulepath:$EESSI_EXTRA_MODULEPATH" + end + set -x MODULEPATH $modulepath + . "$EESSI_CVMFS_REPO"/versions/"$LMOD_EESSI_VERSION"/compat/linux/(uname -m)/usr/share/Lmod/init/fish module --initial_load --no_redirect restore else diff --git a/init/lmod/ksh b/init/lmod/ksh index 5be0cacd..e497a75a 100644 --- a/init/lmod/ksh +++ b/init/lmod/ksh @@ -6,20 +6,24 @@ EESSI_VERSION="${EESSI_VERSION:-${EESSI_VERSION_DEFAULT}}" # Now that we know our EESSI version let's not forget it export EESSI_VERSION_DEFAULT="$EESSI_VERSION" -## ability to predefine elsewhere the default list -LMOD_SYSTEM_DEFAULT_MODULES=${LMOD_SYSTEM_DEFAULT_MODULES:-"EESSI/$EESSI_VERSION"} +# ability to predefine elsewhere the default list (with options to append or prepend) +LMOD_SYSTEM_DEFAULT_MODULES="${EESSI_SYSTEM_DEFAULT_MODULES_PREPEND:+$EESSI_SYSTEM_DEFAULT_MODULES_PREPEND:}EESSI/$EESSI_VERSION${EESSI_SYSTEM_DEFAULT_MODULES_APPEND:+:$EESSI_SYSTEM_DEFAULT_MODULES_APPEND}" export LMOD_SYSTEM_DEFAULT_MODULES if [ -z "$__Init_EESSI_Default_Modules" ]; then export __Init_EESSI_Default_Modules=1; + # Lmod version in 2023.06 has a problem with newer Lmod caches, so let's stick to more recent Lmod + # (has no effect except on Lmod itself, and compatible caches are still created/supported by EESSI) + LMOD_EESSI_VERSION=${EESSI_VERSION/2023.06/2025.06} + # If there is a local Lmod, make it forget about the system set MODULEPATH unset __LMOD_REF_COUNT_MODULEPATH # and clear out any memory Lmod might have unset _ModuleTable001_ # Path to top-level module tree - export MODULEPATH="${EESSI_CVMFS_REPO}/init/modules" - . "${EESSI_CVMFS_REPO}/versions/${EESSI_VERSION}/compat/linux/$(uname -m)/usr/share/Lmod/init/ksh" + export MODULEPATH="${EESSI_CVMFS_REPO}/init/modules${EESSI_EXTRA_MODULEPATH:+:$EESSI_EXTRA_MODULEPATH}" + . "${EESSI_CVMFS_REPO}/versions/${LMOD_EESSI_VERSION}/compat/linux/$(uname -m)/usr/share/Lmod/init/ksh" module --initial_load --no_redirect restore else diff --git a/init/lmod/zsh b/init/lmod/zsh index f8abfbd0..869417b4 100644 --- a/init/lmod/zsh +++ b/init/lmod/zsh @@ -6,20 +6,24 @@ EESSI_VERSION="${EESSI_VERSION:-${EESSI_VERSION_DEFAULT}}" # Now that we know our EESSI version let's not forget it export EESSI_VERSION_DEFAULT="$EESSI_VERSION" -# ability to predefine elsewhere the default list -LMOD_SYSTEM_DEFAULT_MODULES=${LMOD_SYSTEM_DEFAULT_MODULES:-"EESSI/$EESSI_VERSION"} +# ability to predefine elsewhere the default list (with options to append or prepend) +LMOD_SYSTEM_DEFAULT_MODULES="${EESSI_SYSTEM_DEFAULT_MODULES_PREPEND:+$EESSI_SYSTEM_DEFAULT_MODULES_PREPEND:}EESSI/$EESSI_VERSION${EESSI_SYSTEM_DEFAULT_MODULES_APPEND:+:$EESSI_SYSTEM_DEFAULT_MODULES_APPEND}" export LMOD_SYSTEM_DEFAULT_MODULES if [ -z "$__Init_EESSI_Default_Modules" ]; then export __Init_EESSI_Default_Modules=1; + # Lmod version in 2023.06 has a problem with newer Lmod caches, so let's stick to more recent Lmod + # (has no effect except on Lmod itself, and compatible caches are still created/supported by EESSI) + LMOD_EESSI_VERSION=${EESSI_VERSION/2023.06/2025.06} + # If there is a local Lmod, make it forget about the system set MODULEPATH unset __LMOD_REF_COUNT_MODULEPATH # and clear out any memory Lmod might have unset _ModuleTable001_ # Path to top-level module tree - export MODULEPATH="${EESSI_CVMFS_REPO}/init/modules" - . "${EESSI_CVMFS_REPO}/versions/${EESSI_VERSION}/compat/linux/$(uname -m)/usr/share/Lmod/init/zsh" + export MODULEPATH="${EESSI_CVMFS_REPO}/init/modules${EESSI_EXTRA_MODULEPATH:+:$EESSI_EXTRA_MODULEPATH}" + . "${EESSI_CVMFS_REPO}/versions/${LMOD_EESSI_VERSION}/compat/linux/$(uname -m)/usr/share/Lmod/init/zsh" module --initial_load --no_redirect restore else From 46c878f291d366636399eff68321f0db1ab4babd Mon Sep 17 00:00:00 2001 From: Alan O'Cais Date: Thu, 29 Jan 2026 15:34:59 +0100 Subject: [PATCH 05/17] Try to fix csg --- init/lmod/csh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/init/lmod/csh b/init/lmod/csh index dddb1fbf..3f911c73 100644 --- a/init/lmod/csh +++ b/init/lmod/csh @@ -11,12 +11,12 @@ endif setenv EESSI_VERSION_DEFAULT "$EESSI_VERSION" # ability to predefine elsewhere the default list (with options to append or prepend) -set LMOD_SYSTEM_DEFAULT_MODULES = "EESSI/$EESSI_VERSION" +set LMOD_SYSTEM_DEFAULT_MODULES="EESSI/$EESSI_VERSION" if ( $?EESSI_SYSTEM_DEFAULT_MODULES_PREPEND ) then - set LMOD_SYSTEM_DEFAULT_MODULES = "$EESSI_SYSTEM_DEFAULT_MODULES_PREPEND:$LMOD_SYSTEM_DEFAULT_MODULES" + set LMOD_SYSTEM_DEFAULT_MODULES="$EESSI_SYSTEM_DEFAULT_MODULES_PREPEND:$LMOD_SYSTEM_DEFAULT_MODULES" endif if ( $?EESSI_SYSTEM_DEFAULT_MODULES_APPEND ) then - set LMOD_SYSTEM_DEFAULT_MODULES = "$LMOD_SYSTEM_DEFAULT_MODULES:$EESSI_SYSTEM_DEFAULT_MODULES_APPEND" + set LMOD_SYSTEM_DEFAULT_MODULES="$LMOD_SYSTEM_DEFAULT_MODULES:$EESSI_SYSTEM_DEFAULT_MODULES_APPEND" endif setenv LMOD_SYSTEM_DEFAULT_MODULES "$LMOD_SYSTEM_DEFAULT_MODULES" @@ -25,16 +25,16 @@ if (! $?__Init_EESSI_Default_Modules ) then # Lmod version in 2023.06 has a problem with newer Lmod caches, so let's stick to more recent Lmod # (has no effect except on Lmod itself, and compatible caches are still created/supported by EESSI) - set LMOD_EESSI_VERSION "$EESSI_VERSION:s/2023.06/2025.06/" + set LMOD_EESSI_VERSION="$EESSI_VERSION:s/2023.06/2025.06/" # If there is a local Lmod, make it forget about the system set MODULEPATH unsetenv __LMOD_REF_COUNT_MODULEPATH # and clear out any memory Lmod might have unsetenv _ModuleTable001_ # Path to top-level module tree - set modulepath = "$EESSI_CVMFS_REPO/init/modules" + set modulepath="$EESSI_CVMFS_REPO/init/modules" if ( $?EESSI_EXTRA_MODULEPATH && "$EESSI_EXTRA_MODULEPATH" != "" ) then - set modulepath = "$modulepath:$EESSI_EXTRA_MODULEPATH" + set modulepath="$modulepath:$EESSI_EXTRA_MODULEPATH" endif setenv MODULEPATH "$modulepath" source "${EESSI_CVMFS_REPO}/versions/${LMOD_EESSI_VERSION}/compat/linux/`uname -m`/usr/share/Lmod/init/csh" From 3a6c117924a71ac40721bded76eb5d6e4a42e51e Mon Sep 17 00:00:00 2001 From: Alan O'Cais Date: Thu, 29 Jan 2026 15:59:07 +0100 Subject: [PATCH 06/17] csh has very short maximum length for envvar names, stick to <32 chars --- .../workflows/scripts/test_init_scripts.sh | 14 ++++---- init/lmod/bash | 2 +- init/lmod/csh | 34 +++++++++++-------- init/lmod/fish | 8 ++--- init/lmod/ksh | 2 +- init/lmod/zsh | 2 +- 6 files changed, 34 insertions(+), 28 deletions(-) diff --git a/.github/workflows/scripts/test_init_scripts.sh b/.github/workflows/scripts/test_init_scripts.sh index 2e3a5a58..a8d8652d 100755 --- a/.github/workflows/scripts/test_init_scripts.sh +++ b/.github/workflows/scripts/test_init_scripts.sh @@ -75,20 +75,20 @@ for shell in ${SHELLS[@]}; do assert_raises 'echo "$EASYBUILD_PATH" | grep -E "$PATTERN"' echo "$EASYBUILD_PATH" "$PATTERN" - # TEST 6 and 7: Check the various options (EESSI_SYSTEM_DEFAULT_MODULES_APPEND, EESSI_SYSTEM_DEFAULT_MODULES_APPEND, EESSI_EXTRA_MODULEPATH) all work + # TEST 6 and 7: Check the various options (EESSI_DEFAULT_MODULES_APPEND, EESSI_DEFAULT_MODULES_APPEND, EESSI_EXTRA_MODULEPATH) all work if [ "$shell" = "csh" ]; then - echo "setenv EESSI_SYSTEM_DEFAULT_MODULES_APPEND append_module" > ~/.cshrc - echo "setenv EESSI_SYSTEM_DEFAULT_MODULES_PREPEND prepend_module" >> ~/.cshrc + echo "setenv EESSI_DEFAULT_MODULES_APPEND append_module" > ~/.cshrc + echo "setenv EESSI_DEFAULT_MODULES_PREPEND prepend_module" >> ~/.cshrc echo "setenv EESSI_EXTRA_MODULEPATH .github/workflows/modules" >> ~/.cshrc echo "source init/lmod/$shell" >> ~/.cshrc TEST_LMOD_SYSTEM_DEFAULT_MODULES=$($shell -c 'echo $LMOD_SYSTEM_DEFAULT_MODULES') TEST_MODULEPATH=$($shell -c 'echo $MODULEPATH') elif [ "$shell" = "fish" ]; then - TEST_LMOD_SYSTEM_DEFAULT_MODULES=$($shell -c 'set -x EESSI_SYSTEM_DEFAULT_MODULES_APPEND append_module ; set -x EESSI_SYSTEM_DEFAULT_MODULES_PREPEND prepend_module ; set -x EESSI_EXTRA_MODULEPATH .github/workflows/modules ; source init/lmod/'"$shell"' 2>/dev/null; echo $LMOD_SYSTEM_DEFAULT_MODULES') - TEST_MODULEPATH=$($shell -c 'set -x EESSI_SYSTEM_DEFAULT_MODULES_APPEND append_module ; set -x EESSI_SYSTEM_DEFAULT_MODULES_PREPEND prepend_module ; set -x EESSI_EXTRA_MODULEPATH .github/workflows/modules ; source init/lmod/'"$shell"' 2>/dev/null; echo $MODULEPATH') + TEST_LMOD_SYSTEM_DEFAULT_MODULES=$($shell -c 'set -x EESSI_DEFAULT_MODULES_APPEND append_module ; set -x EESSI_DEFAULT_MODULES_PREPEND prepend_module ; set -x EESSI_EXTRA_MODULEPATH .github/workflows/modules ; source init/lmod/'"$shell"' 2>/dev/null; echo $LMOD_SYSTEM_DEFAULT_MODULES') + TEST_MODULEPATH=$($shell -c 'set -x EESSI_DEFAULT_MODULES_APPEND append_module ; set -x EESSI_DEFAULT_MODULES_PREPEND prepend_module ; set -x EESSI_EXTRA_MODULEPATH .github/workflows/modules ; source init/lmod/'"$shell"' 2>/dev/null; echo $MODULEPATH') else - TEST_LMOD_SYSTEM_DEFAULT_MODULES=$($shell -c 'export EESSI_SYSTEM_DEFAULT_MODULES_APPEND=append_module ; export EESSI_SYSTEM_DEFAULT_MODULES_PREPEND=prepend_module ; export EESSI_EXTRA_MODULEPATH=.github/workflows/modules ; source init/lmod/'"$shell"' ; echo $LMOD_SYSTEM_DEFAULT_MODULES') - TEST_MODULEPATH=$($shell -c 'export EESSI_SYSTEM_DEFAULT_MODULES_APPEND=append_module ; export EESSI_SYSTEM_DEFAULT_MODULES_PREPEND=prepend_module ; export EESSI_EXTRA_MODULEPATH=.github/workflows/modules ; source init/lmod/'"$shell"' 2>/dev/null; echo $MODULEPATH') + TEST_LMOD_SYSTEM_DEFAULT_MODULES=$($shell -c 'export EESSI_DEFAULT_MODULES_APPEND=append_module ; export EESSI_DEFAULT_MODULES_PREPEND=prepend_module ; export EESSI_EXTRA_MODULEPATH=.github/workflows/modules ; source init/lmod/'"$shell"' ; echo $LMOD_SYSTEM_DEFAULT_MODULES') + TEST_MODULEPATH=$($shell -c 'export EESSI_DEFAULT_MODULES_APPEND=append_module ; export EESSI_DEFAULT_MODULES_PREPEND=prepend_module ; export EESSI_EXTRA_MODULEPATH=.github/workflows/modules ; source init/lmod/'"$shell"' 2>/dev/null; echo $MODULEPATH') fi # escape the dots in ${EASYBUILD_VERSION} LMOD_SYSTEM_DEFAULT_MODULES_PATTERN='^prepend_module:.*:append_module$' diff --git a/init/lmod/bash b/init/lmod/bash index 02e7d37a..9cbec4f7 100644 --- a/init/lmod/bash +++ b/init/lmod/bash @@ -7,7 +7,7 @@ EESSI_VERSION="${EESSI_VERSION:-${EESSI_VERSION_DEFAULT}}" export EESSI_VERSION_DEFAULT="$EESSI_VERSION" # ability to predefine elsewhere the default list (with options to append or prepend) -LMOD_SYSTEM_DEFAULT_MODULES="${EESSI_SYSTEM_DEFAULT_MODULES_PREPEND:+$EESSI_SYSTEM_DEFAULT_MODULES_PREPEND:}EESSI/$EESSI_VERSION${EESSI_SYSTEM_DEFAULT_MODULES_APPEND:+:$EESSI_SYSTEM_DEFAULT_MODULES_APPEND}" +LMOD_SYSTEM_DEFAULT_MODULES="${EESSI_DEFAULT_MODULES_PREPEND:+$EESSI_DEFAULT_MODULES_PREPEND:}EESSI/$EESSI_VERSION${EESSI_DEFAULT_MODULES_APPEND:+:$EESSI_DEFAULT_MODULES_APPEND}" export LMOD_SYSTEM_DEFAULT_MODULES if [ -z "$__Init_EESSI_Default_Modules" ]; then diff --git a/init/lmod/csh b/init/lmod/csh index 3f911c73..9c8f45d0 100644 --- a/init/lmod/csh +++ b/init/lmod/csh @@ -1,40 +1,46 @@ # Choose an EESSI CVMFS repository -if (! $?EESSI_CVMFS_REPO) then +if ( ! $?EESSI_CVMFS_REPO) then set EESSI_CVMFS_REPO = "/cvmfs/software.eessi.io" endif # Choose an EESSI version setenv EESSI_VERSION_DEFAULT "__EESSI_VERSION_DEFAULT__" -if (! $?EESSI_VERSION) then +if ( ! $?EESSI_VERSION) then set EESSI_VERSION = "${EESSI_VERSION_DEFAULT}" endif # Now that we know our EESSI version let's not forget it -setenv EESSI_VERSION_DEFAULT "$EESSI_VERSION" +setenv EESSI_VERSION_DEFAULT "${EESSI_VERSION}" # ability to predefine elsewhere the default list (with options to append or prepend) -set LMOD_SYSTEM_DEFAULT_MODULES="EESSI/$EESSI_VERSION" -if ( $?EESSI_SYSTEM_DEFAULT_MODULES_PREPEND ) then - set LMOD_SYSTEM_DEFAULT_MODULES="$EESSI_SYSTEM_DEFAULT_MODULES_PREPEND:$LMOD_SYSTEM_DEFAULT_MODULES" +set LMOD_SYSTEM_DEFAULT_MODULES="EESSI/${EESSI_VERSION}" +if ( $?EESSI_DEFAULT_MODULES_PREPEND ) then + set LMOD_SYSTEM_DEFAULT_MODULES="${EESSI_DEFAULT_MODULES_PREPEND}:${LMOD_SYSTEM_DEFAULT_MODULES}" endif -if ( $?EESSI_SYSTEM_DEFAULT_MODULES_APPEND ) then - set LMOD_SYSTEM_DEFAULT_MODULES="$LMOD_SYSTEM_DEFAULT_MODULES:$EESSI_SYSTEM_DEFAULT_MODULES_APPEND" +if ( $?EESSI_DEFAULT_MODULES_APPEND ) then + set LMOD_SYSTEM_DEFAULT_MODULES="${LMOD_SYSTEM_DEFAULT_MODULES}:${EESSI_DEFAULT_MODULES_APPEND}" endif -setenv LMOD_SYSTEM_DEFAULT_MODULES "$LMOD_SYSTEM_DEFAULT_MODULES" +setenv LMOD_SYSTEM_DEFAULT_MODULES "${LMOD_SYSTEM_DEFAULT_MODULES}" -if (! $?__Init_EESSI_Default_Modules ) then +if ( ! $?__Init_EESSI_Default_Modules ) then setenv __Init_EESSI_Default_Modules 1 # Lmod version in 2023.06 has a problem with newer Lmod caches, so let's stick to more recent Lmod # (has no effect except on Lmod itself, and compatible caches are still created/supported by EESSI) - set LMOD_EESSI_VERSION="$EESSI_VERSION:s/2023.06/2025.06/" + set LMOD_EESSI_VERSION="${EESSI_VERSION}" + if ( "${LMOD_EESSI_VERSION}" == "2023.06" ) then + set LMOD_EESSI_VERSION="2025.06" + endif # If there is a local Lmod, make it forget about the system set MODULEPATH unsetenv __LMOD_REF_COUNT_MODULEPATH # and clear out any memory Lmod might have unsetenv _ModuleTable001_ # Path to top-level module tree - set modulepath="$EESSI_CVMFS_REPO/init/modules" - if ( $?EESSI_EXTRA_MODULEPATH && "$EESSI_EXTRA_MODULEPATH" != "" ) then - set modulepath="$modulepath:$EESSI_EXTRA_MODULEPATH" + set modulepath="${EESSI_CVMFS_REPO}/init/modules" + if ( $?EESSI_EXTRA_MODULEPATH ) then + # Now that we know it exists, check IF it is not empty + if ( "$EESSI_EXTRA_MODULEPATH" != "" ) then + set modulepath="${modulepath}:${EESSI_EXTRA_MODULEPATH}" + endif endif setenv MODULEPATH "$modulepath" source "${EESSI_CVMFS_REPO}/versions/${LMOD_EESSI_VERSION}/compat/linux/`uname -m`/usr/share/Lmod/init/csh" diff --git a/init/lmod/fish b/init/lmod/fish index 742511c8..1e0ed23d 100644 --- a/init/lmod/fish +++ b/init/lmod/fish @@ -8,11 +8,11 @@ set -x EESSI_VERSION_DEFAULT "$EESSI_VERSION" # ability to predefine elsewhere the default list (with options to append or prepend) set LMOD_SYSTEM_DEFAULT_MODULES "EESSI/$EESSI_VERSION" -if set -q EESSI_SYSTEM_DEFAULT_MODULES_PREPEND - set LMOD_SYSTEM_DEFAULT_MODULES "$EESSI_SYSTEM_DEFAULT_MODULES_PREPEND:$LMOD_SYSTEM_DEFAULT_MODULES" +if set -q EESSI_DEFAULT_MODULES_PREPEND + set LMOD_SYSTEM_DEFAULT_MODULES "$EESSI_DEFAULT_MODULES_PREPEND:$LMOD_SYSTEM_DEFAULT_MODULES" end -if set -q EESSI_SYSTEM_DEFAULT_MODULES_APPEND - set LMOD_SYSTEM_DEFAULT_MODULES "$LMOD_SYSTEM_DEFAULT_MODULES:$EESSI_SYSTEM_DEFAULT_MODULES_APPEND" +if set -q EESSI_DEFAULT_MODULES_APPEND + set LMOD_SYSTEM_DEFAULT_MODULES "$LMOD_SYSTEM_DEFAULT_MODULES:$EESSI_DEFAULT_MODULES_APPEND" end set -x LMOD_SYSTEM_DEFAULT_MODULES $LMOD_SYSTEM_DEFAULT_MODULES diff --git a/init/lmod/ksh b/init/lmod/ksh index e497a75a..d96285f6 100644 --- a/init/lmod/ksh +++ b/init/lmod/ksh @@ -7,7 +7,7 @@ EESSI_VERSION="${EESSI_VERSION:-${EESSI_VERSION_DEFAULT}}" export EESSI_VERSION_DEFAULT="$EESSI_VERSION" # ability to predefine elsewhere the default list (with options to append or prepend) -LMOD_SYSTEM_DEFAULT_MODULES="${EESSI_SYSTEM_DEFAULT_MODULES_PREPEND:+$EESSI_SYSTEM_DEFAULT_MODULES_PREPEND:}EESSI/$EESSI_VERSION${EESSI_SYSTEM_DEFAULT_MODULES_APPEND:+:$EESSI_SYSTEM_DEFAULT_MODULES_APPEND}" +LMOD_SYSTEM_DEFAULT_MODULES="${EESSI_DEFAULT_MODULES_PREPEND:+$EESSI_DEFAULT_MODULES_PREPEND:}EESSI/$EESSI_VERSION${EESSI_DEFAULT_MODULES_APPEND:+:$EESSI_DEFAULT_MODULES_APPEND}" export LMOD_SYSTEM_DEFAULT_MODULES if [ -z "$__Init_EESSI_Default_Modules" ]; then diff --git a/init/lmod/zsh b/init/lmod/zsh index 869417b4..7738e3a7 100644 --- a/init/lmod/zsh +++ b/init/lmod/zsh @@ -7,7 +7,7 @@ EESSI_VERSION="${EESSI_VERSION:-${EESSI_VERSION_DEFAULT}}" export EESSI_VERSION_DEFAULT="$EESSI_VERSION" # ability to predefine elsewhere the default list (with options to append or prepend) -LMOD_SYSTEM_DEFAULT_MODULES="${EESSI_SYSTEM_DEFAULT_MODULES_PREPEND:+$EESSI_SYSTEM_DEFAULT_MODULES_PREPEND:}EESSI/$EESSI_VERSION${EESSI_SYSTEM_DEFAULT_MODULES_APPEND:+:$EESSI_SYSTEM_DEFAULT_MODULES_APPEND}" +LMOD_SYSTEM_DEFAULT_MODULES="${EESSI_DEFAULT_MODULES_PREPEND:+$EESSI_DEFAULT_MODULES_PREPEND:}EESSI/$EESSI_VERSION${EESSI_DEFAULT_MODULES_APPEND:+:$EESSI_DEFAULT_MODULES_APPEND}" export LMOD_SYSTEM_DEFAULT_MODULES if [ -z "$__Init_EESSI_Default_Modules" ]; then From 785ae1386498229d4251588e51ea08b363484725 Mon Sep 17 00:00:00 2001 From: Alan O'Cais Date: Thu, 29 Jan 2026 16:05:15 +0100 Subject: [PATCH 07/17] Some fancy new runners available! --- .github/workflows/scripts/test_init_scripts.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/scripts/test_init_scripts.sh b/.github/workflows/scripts/test_init_scripts.sh index a8d8652d..5769a64f 100755 --- a/.github/workflows/scripts/test_init_scripts.sh +++ b/.github/workflows/scripts/test_init_scripts.sh @@ -45,7 +45,7 @@ for shell in ${SHELLS[@]}; do else MODULE_SECTIONS=($($shell -c "source init/lmod/$shell 2>/dev/null; module ov 2>&1 | grep -e '---'")) fi - PATTERN="/cvmfs/software\.eessi\.io/versions/$EESSI_VERSION/software/linux/x86_64/(intel/haswell|amd/zen3)/modules/all" + PATTERN="/cvmfs/software\.eessi\.io/versions/$EESSI_VERSION/software/linux/x86_64/(intel/haswell|amd/zen3|intel/icelake)/modules/all" assert_raises 'echo "${MODULE_SECTIONS[1]}" | grep -E "$PATTERN"' echo "${MODULE_SECTIONS[1]}" "$PATTERN" @@ -70,7 +70,7 @@ for shell in ${SHELLS[@]}; do EASYBUILD_PATH=$($shell -c "source init/lmod/$shell 2>/dev/null; module load EasyBuild/${EXPECTED_EASYBUILD_VERSION}; which eb") fi # escape the dots in ${EASYBUILD_VERSION} - PATTERN="/cvmfs/software\.eessi\.io/versions/$EESSI_VERSION/software/linux/x86_64/(intel/haswell|amd/zen3)/software/EasyBuild/${EXPECTED_EASYBUILD_VERSION//./\\.}/bin/eb" + PATTERN="/cvmfs/software\.eessi\.io/versions/$EESSI_VERSION/software/linux/x86_64/(intel/haswell|amd/zen3|intel/icelake)/software/EasyBuild/${EXPECTED_EASYBUILD_VERSION//./\\.}/bin/eb" echo "$EASYBUILD_PATH" | grep -E "$PATTERN" assert_raises 'echo "$EASYBUILD_PATH" | grep -E "$PATTERN"' echo "$EASYBUILD_PATH" "$PATTERN" From 61db94178daf3f3f0ebadf7eb3df425954441ae7 Mon Sep 17 00:00:00 2001 From: Alan O'Cais Date: Thu, 29 Jan 2026 16:10:22 +0100 Subject: [PATCH 08/17] Actually use the CPU override --- .github/workflows/tests_init_module.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/tests_init_module.yml b/.github/workflows/tests_init_module.yml index b4d31435..1cf0ac62 100644 --- a/.github/workflows/tests_init_module.yml +++ b/.github/workflows/tests_init_module.yml @@ -57,6 +57,7 @@ jobs: - name: Run tests for available shells run: | + export EESSI_SOFTWARE_SUBDIR_OVERRIDE=${{matrix.EESSI_SOFTWARE_SUBDIR_OVERRIDE}} export EESSI_VERSION=${{matrix.EESSI_VERSION}} export EXPECTED_EASYBUILD_VERSION=${{matrix.EXPECTED_EASYBUILD_VERSION}} .github/workflows/scripts/test_init_scripts.sh "bash" "zsh" "ksh" "fish" "csh" From dcce3405b818b9e41a28d8a0ee11eb281b7240d4 Mon Sep 17 00:00:00 2001 From: Alan O'Cais Date: Fri, 30 Jan 2026 10:13:21 +0100 Subject: [PATCH 09/17] Use specific commit for assert.sh, also run tests on system with Lmod available --- .../workflows/scripts/test_init_scripts.sh | 1 + .github/workflows/tests_init_module.yml | 21 +++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/.github/workflows/scripts/test_init_scripts.sh b/.github/workflows/scripts/test_init_scripts.sh index 5769a64f..21b94ea7 100755 --- a/.github/workflows/scripts/test_init_scripts.sh +++ b/.github/workflows/scripts/test_init_scripts.sh @@ -16,6 +16,7 @@ if [ ! -d assert.sh ]; then echo "assert.sh not cloned." echo "" echo "run \`git clone https://github.com/lehmannro/assert.sh.git\`" + echo "(see workflow file that calls this script for how to only clone specific commit if you are worried about security)" exit 1 fi . assert.sh/assert.sh diff --git a/.github/workflows/tests_init_module.yml b/.github/workflows/tests_init_module.yml index 1cf0ac62..21747562 100644 --- a/.github/workflows/tests_init_module.yml +++ b/.github/workflows/tests_init_module.yml @@ -46,8 +46,13 @@ jobs: sed -i "s/__EESSI_VERSION_DEFAULT__/${{matrix.EESSI_VERSION}}/g" init/lmod/${shell} done - - name: Clone assert.sh script - run: git clone https://github.com/lehmannro/assert.sh.git + - name: Clone assert.sh at pinned commit + run: | + ASSERT_COMMIT_SHA=fe359e341670f1e8e86a3804ca00e5a3ebc30fa4 + git clone --no-checkout https://github.com/lehmannro/assert.sh.git + cd assert.sh + git fetch --depth 1 origin $ASSERT_COMMIT_SHA + git checkout $ASSERT_COMMIT_SHA - name: Install missing shells run: | @@ -55,10 +60,18 @@ jobs: sudo apt install zsh ksh fish tcsh echo "# INIT ZSH" > ~/.zshrc - - name: Run tests for available shells + - name: Run tests for available shells without system Lmod run: | export EESSI_SOFTWARE_SUBDIR_OVERRIDE=${{matrix.EESSI_SOFTWARE_SUBDIR_OVERRIDE}} export EESSI_VERSION=${{matrix.EESSI_VERSION}} export EXPECTED_EASYBUILD_VERSION=${{matrix.EXPECTED_EASYBUILD_VERSION}} .github/workflows/scripts/test_init_scripts.sh "bash" "zsh" "ksh" "fish" "csh" - + - name: Run tests for available shells with system Lmod + run: | + # We also want to perform the same test when there is an Lmod version available on the system + sudo apt install lmod + source /usr/share/lmod/lmod/init/bash + export EESSI_SOFTWARE_SUBDIR_OVERRIDE=${{matrix.EESSI_SOFTWARE_SUBDIR_OVERRIDE}} + export EESSI_VERSION=${{matrix.EESSI_VERSION}} + export EXPECTED_EASYBUILD_VERSION=${{matrix.EXPECTED_EASYBUILD_VERSION}} + .github/workflows/scripts/test_init_scripts.sh "bash" "zsh" "ksh" "fish" "csh" From a97140abe64dda99e4dbebc67a4d611872922473 Mon Sep 17 00:00:00 2001 From: Alan O'Cais Date: Fri, 30 Jan 2026 10:42:06 +0100 Subject: [PATCH 10/17] Don't clobber an existing .cshrc --- .github/workflows/scripts/test_init_scripts.sh | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/scripts/test_init_scripts.sh b/.github/workflows/scripts/test_init_scripts.sh index 21b94ea7..7d850904 100755 --- a/.github/workflows/scripts/test_init_scripts.sh +++ b/.github/workflows/scripts/test_init_scripts.sh @@ -29,9 +29,13 @@ for shell in ${SHELLS[@]}; do echo RUNNING TESTS FOR SHELL: $shell echo = | awk 'NF += (OFS = $_) + 100' if [[ ! " ${TEST_SHELLS[*]} " =~ [[:space:]]${shell}[[:space:]] ]]; then - ### EXCEPTION FOR CSH ### echo -e "\033[33mWe don't now how to test the shell '$shell', PRs are Welcome.\033[0m" else + if [ "$shell" = "csh" ]; then + # make sure our .cshrc is empty before we begin as we will clobber it + [ -f "~/.cshrc" ] && mv "~/.cshrc" "~/.cshrc_orig" + fi + # TEST 1: Source Script and check Module Output expected="Module for EESSI/$EESSI_VERSION loaded successfully" assert "$shell -c 'source init/lmod/$shell' 2>&1 " "${expected}" @@ -105,6 +109,12 @@ for shell in ${SHELLS[@]}; do # End Test Suite assert_end "source_eessi_$shell" + + if [ "$shell" = "csh" ]; then + # Restore our .cshrc + [ -f "~/.cshrc_orig" ] && mv "~/.cshrc_orig" "~/.cshrc" + fi + fi done From d779b54aa42de413145eebcca452f324419dacd5 Mon Sep 17 00:00:00 2001 From: Alan O'Cais Date: Fri, 30 Jan 2026 10:43:35 +0100 Subject: [PATCH 11/17] Add a sanity check to make sure module command works --- .github/workflows/tests_init_module.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/tests_init_module.yml b/.github/workflows/tests_init_module.yml index 21747562..d4d1f3b4 100644 --- a/.github/workflows/tests_init_module.yml +++ b/.github/workflows/tests_init_module.yml @@ -71,6 +71,7 @@ jobs: # We also want to perform the same test when there is an Lmod version available on the system sudo apt install lmod source /usr/share/lmod/lmod/init/bash + module avail export EESSI_SOFTWARE_SUBDIR_OVERRIDE=${{matrix.EESSI_SOFTWARE_SUBDIR_OVERRIDE}} export EESSI_VERSION=${{matrix.EESSI_VERSION}} export EXPECTED_EASYBUILD_VERSION=${{matrix.EXPECTED_EASYBUILD_VERSION}} From d91ded8ca2b2fdc84f17ce4aa1c564599f467343 Mon Sep 17 00:00:00 2001 From: Alan O'Cais Date: Fri, 30 Jan 2026 10:48:00 +0100 Subject: [PATCH 12/17] Set explicit MODULEPATH --- .github/workflows/tests_init_module.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/tests_init_module.yml b/.github/workflows/tests_init_module.yml index d4d1f3b4..902c31e3 100644 --- a/.github/workflows/tests_init_module.yml +++ b/.github/workflows/tests_init_module.yml @@ -71,6 +71,7 @@ jobs: # We also want to perform the same test when there is an Lmod version available on the system sudo apt install lmod source /usr/share/lmod/lmod/init/bash + export MODULEPATH=/usr/share/lmod/lmod/modulefiles module avail export EESSI_SOFTWARE_SUBDIR_OVERRIDE=${{matrix.EESSI_SOFTWARE_SUBDIR_OVERRIDE}} export EESSI_VERSION=${{matrix.EESSI_VERSION}} From fc13853360e357a0d379c95df759b71e7ef313a6 Mon Sep 17 00:00:00 2001 From: Alan O'Cais Date: Fri, 30 Jan 2026 11:30:12 +0100 Subject: [PATCH 13/17] No quotes on ~ --- .github/workflows/scripts/test_init_scripts.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/scripts/test_init_scripts.sh b/.github/workflows/scripts/test_init_scripts.sh index 7d850904..2cfe138e 100755 --- a/.github/workflows/scripts/test_init_scripts.sh +++ b/.github/workflows/scripts/test_init_scripts.sh @@ -33,7 +33,7 @@ for shell in ${SHELLS[@]}; do else if [ "$shell" = "csh" ]; then # make sure our .cshrc is empty before we begin as we will clobber it - [ -f "~/.cshrc" ] && mv "~/.cshrc" "~/.cshrc_orig" + [ -f ~/.cshrc ] && mv ~/.cshrc ~/.cshrc_orig fi # TEST 1: Source Script and check Module Output @@ -112,7 +112,7 @@ for shell in ${SHELLS[@]}; do if [ "$shell" = "csh" ]; then # Restore our .cshrc - [ -f "~/.cshrc_orig" ] && mv "~/.cshrc_orig" "~/.cshrc" + [ -f ~/.cshrc_orig ] && mv ~/.cshrc_orig ~/.cshrc fi fi From 7d621f10db92a15eea7c8e551db470b29659038c Mon Sep 17 00:00:00 2001 From: Alan O'Cais Date: Fri, 30 Jan 2026 11:36:28 +0100 Subject: [PATCH 14/17] Make test init script listen to EESSI_SOFTWARE_SUBDIR_OVERRIDE --- .github/workflows/scripts/test_init_scripts.sh | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/scripts/test_init_scripts.sh b/.github/workflows/scripts/test_init_scripts.sh index 2cfe138e..e775c632 100755 --- a/.github/workflows/scripts/test_init_scripts.sh +++ b/.github/workflows/scripts/test_init_scripts.sh @@ -11,6 +11,11 @@ if [ -z ${EXPECTED_EASYBUILD_VERSION} ]; then exit 1 fi +if [ -z ${EESSI_SOFTWARE_SUBDIR_OVERRIDE} ]; then + echo "\$EESSI_SOFTWARE_SUBDIR_OVERRIDE has to be set (e.g., x86_64/intel/haswell) so we can do well defined string comparison for the architecture." + exit 1 +fi + # initialize assert framework if [ ! -d assert.sh ]; then echo "assert.sh not cloned." @@ -50,7 +55,7 @@ for shell in ${SHELLS[@]}; do else MODULE_SECTIONS=($($shell -c "source init/lmod/$shell 2>/dev/null; module ov 2>&1 | grep -e '---'")) fi - PATTERN="/cvmfs/software\.eessi\.io/versions/$EESSI_VERSION/software/linux/x86_64/(intel/haswell|amd/zen3|intel/icelake)/modules/all" + PATTERN="/cvmfs/software\.eessi\.io/versions/$EESSI_VERSION/software/linux/$EESSI_SOFTWARE_SUBDIR_OVERRIDE/modules/all" assert_raises 'echo "${MODULE_SECTIONS[1]}" | grep -E "$PATTERN"' echo "${MODULE_SECTIONS[1]}" "$PATTERN" @@ -75,7 +80,7 @@ for shell in ${SHELLS[@]}; do EASYBUILD_PATH=$($shell -c "source init/lmod/$shell 2>/dev/null; module load EasyBuild/${EXPECTED_EASYBUILD_VERSION}; which eb") fi # escape the dots in ${EASYBUILD_VERSION} - PATTERN="/cvmfs/software\.eessi\.io/versions/$EESSI_VERSION/software/linux/x86_64/(intel/haswell|amd/zen3|intel/icelake)/software/EasyBuild/${EXPECTED_EASYBUILD_VERSION//./\\.}/bin/eb" + PATTERN="/cvmfs/software\.eessi\.io/versions/$EESSI_VERSION/software/linux/$EESSI_SOFTWARE_SUBDIR_OVERRIDE/software/EasyBuild/${EXPECTED_EASYBUILD_VERSION//./\\.}/bin/eb" echo "$EASYBUILD_PATH" | grep -E "$PATTERN" assert_raises 'echo "$EASYBUILD_PATH" | grep -E "$PATTERN"' echo "$EASYBUILD_PATH" "$PATTERN" From 78e286b84587776ded80e2412768ea1b08ee5339 Mon Sep 17 00:00:00 2001 From: Alan O'Cais Date: Fri, 30 Jan 2026 11:38:46 +0100 Subject: [PATCH 15/17] Remove copy/pasted comment --- .github/workflows/scripts/test_init_scripts.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/scripts/test_init_scripts.sh b/.github/workflows/scripts/test_init_scripts.sh index e775c632..509f71f4 100755 --- a/.github/workflows/scripts/test_init_scripts.sh +++ b/.github/workflows/scripts/test_init_scripts.sh @@ -100,7 +100,6 @@ for shell in ${SHELLS[@]}; do TEST_LMOD_SYSTEM_DEFAULT_MODULES=$($shell -c 'export EESSI_DEFAULT_MODULES_APPEND=append_module ; export EESSI_DEFAULT_MODULES_PREPEND=prepend_module ; export EESSI_EXTRA_MODULEPATH=.github/workflows/modules ; source init/lmod/'"$shell"' ; echo $LMOD_SYSTEM_DEFAULT_MODULES') TEST_MODULEPATH=$($shell -c 'export EESSI_DEFAULT_MODULES_APPEND=append_module ; export EESSI_DEFAULT_MODULES_PREPEND=prepend_module ; export EESSI_EXTRA_MODULEPATH=.github/workflows/modules ; source init/lmod/'"$shell"' 2>/dev/null; echo $MODULEPATH') fi - # escape the dots in ${EASYBUILD_VERSION} LMOD_SYSTEM_DEFAULT_MODULES_PATTERN='^prepend_module:.*:append_module$' echo "$TEST_LMOD_SYSTEM_DEFAULT_MODULES" AND "$LMOD_SYSTEM_DEFAULT_MODULES_PATTERN" assert_raises 'echo "$TEST_LMOD_SYSTEM_DEFAULT_MODULES" | grep -E "$LMOD_SYSTEM_DEFAULT_MODULES_PATTERN"' From 4d9725682e6177d8f039d9101351c34bdb3fec39 Mon Sep 17 00:00:00 2001 From: Alan O'Cais Date: Fri, 30 Jan 2026 16:20:41 +0100 Subject: [PATCH 16/17] Add licence and more extensive documentation --- init/lmod/bash | 67 ++++++++++++++++++++++++++++++++++++++++++++------ init/lmod/csh | 45 +++++++++++++++++++++++---------- init/lmod/fish | 29 +++++++++++++++++++--- init/lmod/ksh | 25 ++++++++++++++++--- init/lmod/zsh | 25 ++++++++++++++++--- 5 files changed, 159 insertions(+), 32 deletions(-) diff --git a/init/lmod/bash b/init/lmod/bash index 9cbec4f7..15dbdf8b 100644 --- a/init/lmod/bash +++ b/init/lmod/bash @@ -1,12 +1,62 @@ +#!/usr/bin/env bash + +# SPDX-License-Identifier: GPL-2.0-only +# Copyright (C) 2020-2026 EESSI contributors +# +# EESSI - European Environment for Scientific Software Installations +# +# This file is a template for initialising EESSI via Lmod for the environment indicated by the shebang. +# +# Assumptions: +# - EESSI accessible under $EESSI_CVMFS_REPO or /cvmfs/software.eessi.io +# - expected to be true as this file is also meant to be shipped under that location +# - Lmod must the shipped in the repository in the correct location +# +# Options: +# - The script listens to environment variables so that it can be silently configured by a site +# - EESSI_CVMFS_REPO: perform the initialisation from a respository other than /cvmfs/software.eessi.io +# - EESSI_VERSION: loads a specific EESSI version ignoring the default in the file +# - EESSI_DEFAULT_MODULES_PREPEND: environment variable allows you to prepend modules to the defaults (loaded last) +# - EESSI_DEFAULT_MODULES_APPEND: environment variable allows you to append modules to the defaults (loaded first) +# - EESSI_EXTRA_MODULEPATH: environment variable allows a site to append to MODULEPATH (lower priority than EESSI MODULEPATH) +# +# Other options that can be set to influence the end result: +# - The EESSI module also listens to environment variables so that it can be silently configured by a site +# - EESSI_MODULE_FAMILY_NAME: use the value of the environment variable to set an Lmod family for the EESSI module +# - EESSI_MODULE_STICKY: make the EESSI module sticky +# - EESSI_MODULE_UPDATE_PS1: have the EESSI module update PS1 to give a prompt that is prepended with "{EESSI/...} " +# +# Effects: +# - Should always succeed +# - Initialises Lmod from specific version of EESSI +# - Clobbers any existing Lmod configuration +# - Some special environment variables that are internal to Lmod (__LMOD_REF_COUNT_MODULEPATH and +# _ModuleTable001_) are used to force a hard reset of an existing Lmod installation. This +# approach may be brittle. +# - Then loads module EESSI/... to initialise EESSI +# - use `module show EESSI/...` to see the environment variables set by the EESSI module +# +# Reverting the effects: +# - EESSI initialisation via `module unload EESSI/...` +# - Lmod initialisation cannot be undone + # Choose an EESSI CVMFS repository EESSI_CVMFS_REPO="${EESSI_CVMFS_REPO:-/cvmfs/software.eessi.io}" -# Choose an EESSI version -EESSI_VERSION_DEFAULT="__EESSI_VERSION_DEFAULT__" + +# Choose an EESSI version (the default is only used if the EESSI_VERSION environment variable is not provided) +EESSI_VERSION_DEFAULT="${__EESSI_VERSION_USED_FOR_INIT:-__EESSI_VERSION_DEFAULT__}" EESSI_VERSION="${EESSI_VERSION:-${EESSI_VERSION_DEFAULT}}" -# Now that we know our EESSI version let's not forget it -export EESSI_VERSION_DEFAULT="$EESSI_VERSION" +# On the first run we want to record the EESSI version used for init as an environment variable so that if a different +# version of this script is called (e.g, for a a different EESSI version) it retains a memory which EESSI +# version was actually used in the initialisation. This is useful as __Init_EESSI_Default_Modules used below will +# be defined on the first call and Lmod initialisation will not happen twice. +# This sets the value only on first execution, if the variable already exists in the environment +# the original value is retained. +export __EESSI_VERSION_USED_FOR_INIT="${__EESSI_VERSION_USED_FOR_INIT:-${EESSI_VERSION}}" -# ability to predefine elsewhere the default list (with options to append or prepend) +# Ability to predefine elsewhere the default list of modules to load (colon separated): +# - EESSI_DEFAULT_MODULES_PREPEND environment variable allows you to prepend modules (loaded last) +# - EESSI_DEFAULT_MODULES_APPEND environment variable allows you to append modules (loaded first) LMOD_SYSTEM_DEFAULT_MODULES="${EESSI_DEFAULT_MODULES_PREPEND:+$EESSI_DEFAULT_MODULES_PREPEND:}EESSI/$EESSI_VERSION${EESSI_DEFAULT_MODULES_APPEND:+:$EESSI_DEFAULT_MODULES_APPEND}" export LMOD_SYSTEM_DEFAULT_MODULES @@ -17,11 +67,14 @@ if [ -z "$__Init_EESSI_Default_Modules" ]; then # (has no effect except on Lmod itself, and compatible caches are still created/supported by EESSI) LMOD_EESSI_VERSION=${EESSI_VERSION/2023.06/2025.06} - # If there is a local Lmod, make it forget about the system set MODULEPATH + # Lmod may have been initialised so we need to clear some internal variables to allow for a full reset + # - make it forget about the system set MODULEPATH unset __LMOD_REF_COUNT_MODULEPATH - # and clear out any memory Lmod might have + # - and clear out any memory Lmod might have unset _ModuleTable001_ + # Path to top-level module tree + # - EESSI_EXTRA_MODULEPATH environment variable allows a site to append to MODULEPATH (lower priority than EESSI MODULEPATH) export MODULEPATH="${EESSI_CVMFS_REPO}/init/modules${EESSI_EXTRA_MODULEPATH:+:$EESSI_EXTRA_MODULEPATH}" . "${EESSI_CVMFS_REPO}/versions/${LMOD_EESSI_VERSION}/compat/linux/$(uname -m)/usr/share/Lmod/init/bash" module --initial_load --no_redirect restore diff --git a/init/lmod/csh b/init/lmod/csh index 9c8f45d0..a10836d1 100644 --- a/init/lmod/csh +++ b/init/lmod/csh @@ -1,22 +1,41 @@ +#!/usr/bin/env csh + +# SPDX-License-Identifier: GPL-2.0-only +# Copyright (C) 2020-2026 EESSI contributors +# +# EESSI - European Environment for Scientific Software Installations +# +# This file is a template for initialising EESSI via Lmod for the environment indicated by the shebang. +# +# Please refer to the reference bash implementation for full documentation, only minimal comments are included here + # Choose an EESSI CVMFS repository if ( ! $?EESSI_CVMFS_REPO) then set EESSI_CVMFS_REPO = "/cvmfs/software.eessi.io" endif -# Choose an EESSI version -setenv EESSI_VERSION_DEFAULT "__EESSI_VERSION_DEFAULT__" -if ( ! $?EESSI_VERSION) then - set EESSI_VERSION = "${EESSI_VERSION_DEFAULT}" + +# Choose an EESSI version (default is used if EESSI_VERSION is not provided) +if ( ! $?__EESSI_VERSION_USED_FOR_INIT ) then + set EESSI_VERSION_DEFAULT = "__EESSI_VERSION_DEFAULT__" +else + set EESSI_VERSION_DEFAULT = "$__EESSI_VERSION_USED_FOR_INIT" +endif +if ( ! $?EESSI_VERSION ) then + set EESSI_VERSION = "$EESSI_VERSION_DEFAULT" +endif +# On first run, record the EESSI version used for init as an environment variable. +# We use setenv to ensure it is available to child processes (equivalent to export). +if ( ! $?__EESSI_VERSION_USED_FOR_INIT ) then + setenv __EESSI_VERSION_USED_FOR_INIT "$EESSI_VERSION" endif -# Now that we know our EESSI version let's not forget it -setenv EESSI_VERSION_DEFAULT "${EESSI_VERSION}" # ability to predefine elsewhere the default list (with options to append or prepend) -set LMOD_SYSTEM_DEFAULT_MODULES="EESSI/${EESSI_VERSION}" +set LMOD_SYSTEM_DEFAULT_MODULES = "EESSI/${EESSI_VERSION}" if ( $?EESSI_DEFAULT_MODULES_PREPEND ) then - set LMOD_SYSTEM_DEFAULT_MODULES="${EESSI_DEFAULT_MODULES_PREPEND}:${LMOD_SYSTEM_DEFAULT_MODULES}" + set LMOD_SYSTEM_DEFAULT_MODULES = "${EESSI_DEFAULT_MODULES_PREPEND}:${LMOD_SYSTEM_DEFAULT_MODULES}" endif if ( $?EESSI_DEFAULT_MODULES_APPEND ) then - set LMOD_SYSTEM_DEFAULT_MODULES="${LMOD_SYSTEM_DEFAULT_MODULES}:${EESSI_DEFAULT_MODULES_APPEND}" + set LMOD_SYSTEM_DEFAULT_MODULES = "${LMOD_SYSTEM_DEFAULT_MODULES}:${EESSI_DEFAULT_MODULES_APPEND}" endif setenv LMOD_SYSTEM_DEFAULT_MODULES "${LMOD_SYSTEM_DEFAULT_MODULES}" @@ -25,9 +44,9 @@ if ( ! $?__Init_EESSI_Default_Modules ) then # Lmod version in 2023.06 has a problem with newer Lmod caches, so let's stick to more recent Lmod # (has no effect except on Lmod itself, and compatible caches are still created/supported by EESSI) - set LMOD_EESSI_VERSION="${EESSI_VERSION}" + set LMOD_EESSI_VERSION = "${EESSI_VERSION}" if ( "${LMOD_EESSI_VERSION}" == "2023.06" ) then - set LMOD_EESSI_VERSION="2025.06" + set LMOD_EESSI_VERSION = "2025.06" endif # If there is a local Lmod, make it forget about the system set MODULEPATH @@ -35,11 +54,11 @@ if ( ! $?__Init_EESSI_Default_Modules ) then # and clear out any memory Lmod might have unsetenv _ModuleTable001_ # Path to top-level module tree - set modulepath="${EESSI_CVMFS_REPO}/init/modules" + set modulepath = "${EESSI_CVMFS_REPO}/init/modules" if ( $?EESSI_EXTRA_MODULEPATH ) then # Now that we know it exists, check IF it is not empty if ( "$EESSI_EXTRA_MODULEPATH" != "" ) then - set modulepath="${modulepath}:${EESSI_EXTRA_MODULEPATH}" + set modulepath = "${modulepath}:${EESSI_EXTRA_MODULEPATH}" endif endif setenv MODULEPATH "$modulepath" diff --git a/init/lmod/fish b/init/lmod/fish index 1e0ed23d..881e6262 100644 --- a/init/lmod/fish +++ b/init/lmod/fish @@ -1,10 +1,31 @@ +#!/usr/bin/env fish + +# SPDX-License-Identifier: GPL-2.0-only +# Copyright (C) 2020-2026 EESSI contributors +# +# EESSI - European Environment for Scientific Software Installations +# +# This file is a template for initialising EESSI via Lmod for the environment indicated by the shebang. +# +# Please refer to the reference bash implementation for full documentation, only minimal comments are included here + # Choose an EESSI CVMFS repository set EESSI_CVMFS_REPO (set -q EESSI_CVMFS_REPO; and echo "$EESSI_CVMFS_REPO"; or echo "/cvmfs/software.eessi.io") + # Choose an EESSI version -set EESSI_VERSION_DEFAULT "__EESSI_VERSION_DEFAULT__" -set EESSI_VERSION (set -q EESSI_VERSION; and echo "$EESSI_VERSION"; or echo "$EESSI_VERSION_DEFAULT") -# Now that we know our EESSI version let's not forget it -set -x EESSI_VERSION_DEFAULT "$EESSI_VERSION" +if not set -q __EESSI_VERSION_USED_FOR_INIT + set EESSI_VERSION_DEFAULT "__EESSI_VERSION_DEFAULT__" +else + set EESSI_VERSION_DEFAULT "$__EESSI_VERSION_USED_FOR_INIT" +end +if not set -q EESSI_VERSION + set EESSI_VERSION "$EESSI_VERSION_DEFAULT" +end + +# Record version used for init; -x exports it to the environment +if not set -q __EESSI_VERSION_USED_FOR_INIT + set -x __EESSI_VERSION_USED_FOR_INIT "$EESSI_VERSION" +end # ability to predefine elsewhere the default list (with options to append or prepend) set LMOD_SYSTEM_DEFAULT_MODULES "EESSI/$EESSI_VERSION" diff --git a/init/lmod/ksh b/init/lmod/ksh index d96285f6..37c3caff 100644 --- a/init/lmod/ksh +++ b/init/lmod/ksh @@ -1,10 +1,27 @@ +#!/usr/bin/env ksh + +# SPDX-License-Identifier: GPL-2.0-only +# Copyright (C) 2020-2026 EESSI contributors +# +# EESSI - European Environment for Scientific Software Installations +# +# This file is a template for initialising EESSI via Lmod for the environment indicated by the shebang. +# +# Please refer to the reference bash implementation for full documentation, only minimal comments are included here + # Choose an EESSI CVMFS repository EESSI_CVMFS_REPO="${EESSI_CVMFS_REPO:-/cvmfs/software.eessi.io}" -# Choose an EESSI version -EESSI_VERSION_DEFAULT="__EESSI_VERSION_DEFAULT__" + +# Choose an EESSI version (the default is only used if the EESSI_VERSION environment variable is not provided) +EESSI_VERSION_DEFAULT="${__EESSI_VERSION_USED_FOR_INIT:-__EESSI_VERSION_DEFAULT__}" EESSI_VERSION="${EESSI_VERSION:-${EESSI_VERSION_DEFAULT}}" -# Now that we know our EESSI version let's not forget it -export EESSI_VERSION_DEFAULT="$EESSI_VERSION" +# On the first run we want to record the EESSI version used for init as an environment variable so that if a different +# version of this script is called (e.g, for a a different EESSI version) it retains a memory which EESSI +# version was actually used in the initialisation. This is useful as __Init_EESSI_Default_Modules used below will +# be defined on the first call and Lmod initialisation will not happen twice. +# This sets the value only on first execution, if the variable already exists in the environment +# the original value is retained. +export __EESSI_VERSION_USED_FOR_INIT="${__EESSI_VERSION_USED_FOR_INIT:-${EESSI_VERSION}}" # ability to predefine elsewhere the default list (with options to append or prepend) LMOD_SYSTEM_DEFAULT_MODULES="${EESSI_DEFAULT_MODULES_PREPEND:+$EESSI_DEFAULT_MODULES_PREPEND:}EESSI/$EESSI_VERSION${EESSI_DEFAULT_MODULES_APPEND:+:$EESSI_DEFAULT_MODULES_APPEND}" diff --git a/init/lmod/zsh b/init/lmod/zsh index 7738e3a7..f7c0fc25 100644 --- a/init/lmod/zsh +++ b/init/lmod/zsh @@ -1,10 +1,27 @@ +#!/usr/bin/env zsh + +# SPDX-License-Identifier: GPL-2.0-only +# Copyright (C) 2020-2026 EESSI contributors +# +# EESSI - European Environment for Scientific Software Installations +# +# This file is a template for initialising EESSI via Lmod for the environment indicated by the shebang. +# +# Please refer to the reference bash implementation for full documentation, only minimal comments are included here + # Choose an EESSI CVMFS repository EESSI_CVMFS_REPO="${EESSI_CVMFS_REPO:-/cvmfs/software.eessi.io}" -# Choose an EESSI version -EESSI_VERSION_DEFAULT="__EESSI_VERSION_DEFAULT__" + +# Choose an EESSI version (the default is only used if the EESSI_VERSION environment variable is not provided) +EESSI_VERSION_DEFAULT="${__EESSI_VERSION_USED_FOR_INIT:-__EESSI_VERSION_DEFAULT__}" EESSI_VERSION="${EESSI_VERSION:-${EESSI_VERSION_DEFAULT}}" -# Now that we know our EESSI version let's not forget it -export EESSI_VERSION_DEFAULT="$EESSI_VERSION" +# On the first run we want to record the EESSI version used for init as an environment variable so that if a different +# version of this script is called (e.g, for a a different EESSI version) it retains a memory which EESSI +# version was actually used in the initialisation. This is useful as __Init_EESSI_Default_Modules used below will +# be defined on the first call and Lmod initialisation will not happen twice. +# This sets the value only on first execution, if the variable already exists in the environment +# the original value is retained. +export __EESSI_VERSION_USED_FOR_INIT="${__EESSI_VERSION_USED_FOR_INIT:-${EESSI_VERSION}}" # ability to predefine elsewhere the default list (with options to append or prepend) LMOD_SYSTEM_DEFAULT_MODULES="${EESSI_DEFAULT_MODULES_PREPEND:+$EESSI_DEFAULT_MODULES_PREPEND:}EESSI/$EESSI_VERSION${EESSI_DEFAULT_MODULES_APPEND:+:$EESSI_DEFAULT_MODULES_APPEND}" From 30a8f7c56606bf0b9a4659b07eb1af50fb2fcea8 Mon Sep 17 00:00:00 2001 From: Alan O'Cais Date: Fri, 30 Jan 2026 16:36:09 +0100 Subject: [PATCH 17/17] Add some additional comments to the bash script --- init/lmod/bash | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/init/lmod/bash b/init/lmod/bash index 15dbdf8b..2110400d 100644 --- a/init/lmod/bash +++ b/init/lmod/bash @@ -44,6 +44,8 @@ EESSI_CVMFS_REPO="${EESSI_CVMFS_REPO:-/cvmfs/software.eessi.io}" # Choose an EESSI version (the default is only used if the EESSI_VERSION environment variable is not provided) +# (Note: in the repository which is home to this file a template value __EESSI_VERSION_DEFAULT__ is present in +# the line below which is replaced within our deployment pipeline.) EESSI_VERSION_DEFAULT="${__EESSI_VERSION_USED_FOR_INIT:-__EESSI_VERSION_DEFAULT__}" EESSI_VERSION="${EESSI_VERSION:-${EESSI_VERSION_DEFAULT}}" # On the first run we want to record the EESSI version used for init as an environment variable so that if a different @@ -54,7 +56,13 @@ EESSI_VERSION="${EESSI_VERSION:-${EESSI_VERSION_DEFAULT}}" # the original value is retained. export __EESSI_VERSION_USED_FOR_INIT="${__EESSI_VERSION_USED_FOR_INIT:-${EESSI_VERSION}}" -# Ability to predefine elsewhere the default list of modules to load (colon separated): +# LMOD_SYSTEM_DEFAULT_MODULES are used by Lmod to load a default set of modules in the scenario +# - where we initialise Lmod (the if part of the clause below) +# - where we reset Lmod (the else part of the clause below) +# This means that if we call this script twice we will get the same end result: an Lmod installation +# with a set of default modules loaded. +# +# We also allow the ability to predefine elsewhere the default list of modules to load (colon separated): # - EESSI_DEFAULT_MODULES_PREPEND environment variable allows you to prepend modules (loaded last) # - EESSI_DEFAULT_MODULES_APPEND environment variable allows you to append modules (loaded first) LMOD_SYSTEM_DEFAULT_MODULES="${EESSI_DEFAULT_MODULES_PREPEND:+$EESSI_DEFAULT_MODULES_PREPEND:}EESSI/$EESSI_VERSION${EESSI_DEFAULT_MODULES_APPEND:+:$EESSI_DEFAULT_MODULES_APPEND}"