From 4ee53d12fa99519d121d2823d2abbc26fe1bcf39 Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Mon, 5 Dec 2022 15:35:26 +0100 Subject: [PATCH] changes made in version 1.0 merged/added - Issue #176, MR !149 relocatable modulecmd - Issue #175, MR !148 new logmessage format - Issue #173, MR !146 additional dirs in search path of CMake and pkgconfig - Issue #172, MR !145: fix in reading legacy variants files --- Pmodules/libmodules.tcl | 129 ++++++++++++------------------------- Pmodules/modbuild.in | 7 ++ Pmodules/modulecmd.bash.in | 18 ++++-- Pmodules/modulecmd.in | 2 +- build | 2 + 5 files changed, 64 insertions(+), 94 deletions(-) diff --git a/Pmodules/libmodules.tcl b/Pmodules/libmodules.tcl index 942ae33..f91a4b6 100644 --- a/Pmodules/libmodules.tcl +++ b/Pmodules/libmodules.tcl @@ -172,104 +172,59 @@ proc _pmodules_setenv { PREFIX name version } { debug "this is a legacy module..." return } - - set NAME [string toupper $name] - regsub -- "-" ${NAME} "_" NAME - + if { ![file isdirectory "$PREFIX"] } { + debug "$PREFIX is not a directory" + return + } if { ! [info exist ::dont-setenv] } { set ::dont-setenv {} } - if { ${version} != "" } { - if { [lsearch ${::dont-setenv} "${NAME}_VERSION"] == -1 } { - setenv ${NAME}_VERSION $version - } - } + set NAME [string toupper $name] + regsub -- "-" ${NAME} "_" NAME - if { [file isdirectory "$PREFIX"] } { - if { [lsearch ${::dont-setenv} "${NAME}_PREFIX"] == -1 } { - setenv ${NAME}_PREFIX $PREFIX - } - if { [lsearch ${::dont-setenv} "${NAME}_DIR"] == -1 } { - setenv ${NAME}_DIR $PREFIX - } - if { [lsearch ${::dont-setenv} "${NAME}_HOME"] == -1 } { - setenv ${NAME}_HOME $PREFIX - } - if { [lsearch ${::dont-setenv} "${NAME}_ROOT"] == -1 } { - setenv ${NAME}_ROOT $PREFIX - } - } else { - debug "$PREFIX is not a directory" - } + set prefix_evars [dict create \ + "${NAME}_VERSION" "${version}" \ + "${NAME}_PREFIX" "${PREFIX}" \ + "${NAME}_DIR" "${PREFIX}" \ + "${NAME}_HOME" "${PREFIX}" \ + ] + set setenv_dirs [dict create \ + "${PREFIX}/include" "${NAME}_INCLUDE_DIR" \ + "${PREFIX}/lib" "${NAME}_LIBRARY_DIR" \ + "${PREFIX}/lib64" "${NAME}_LIBRARY_DIR" \ + ] + set prepend_dirs [dict create \ + "${PREFIX}/bin" { "PATH" } \ + "${PREFIX}/sbin" { "PATH" } \ + "${PREFIX}/share/man" { "MANPATH" } \ + "${PREFIX}/include" { "C_INCLUDE_PATH" "CPLUS_INCLUDE_PATH" } \ + "${PREFIX}/lib" { "LIBRARY_PATH" "LD_LIBRARY_PATH"} \ + "${PREFIX}/lib/pkgconfig" { "PKG_CONFIG_PATH" } \ + "${PREFIX}/share/pkgconfig" { "PKG_CONFIG_PATH" } \ + "${PREFIX}/lib/cmake" { "CMAKE_MODULE_PATH" } \ + "${PREFIX}/share/cmake" { "CMAKE_MODULE_PATH" } \ + "${PREFIX}/share/${name}/cmake" { "CMAKE_MODULE_PATH" } \ + ] - if { [file isdirectory "$PREFIX/bin"] } { - if { [lsearch ${::dont-setenv} "PATH"] == -1 } { - prepend-path PATH $PREFIX/bin + dict for {key value} $prefix_evars { + if { [lsearch ${::dont-setenv} $key] >= 0 } { + continue } + setenv $key $value } - - if { [file isdirectory "$PREFIX/sbin"] } { - if { [lsearch ${::dont-setenv} "PATH"] == -1 } { - prepend-path PATH $PREFIX/sbin + dict for {key value} $setenv_dirs { + if { [lsearch ${::dont-setenv} $key] >= 0 || ![file isdirectory $key] } { + continue } + setenv $value $key } - - if { [file isdirectory "$PREFIX/share/man"] } { - if { [lsearch ${::dont-setenv} "MANPATH"] == -1 } { - prepend-path MANPATH $PREFIX/share/man + dict for {key value} $prepend_dirs { + if { [lsearch ${::dont-setenv} $key] >= 0 || ![file isdirectory $key] } { + continue } - } - - # set various environment variables - as long as they are not blacklisted - debug "prepend to include paths" - if { [file isdirectory "$PREFIX/include"] } { - if { [lsearch ${::dont-setenv} "C_INCLUDE_PATH"] == -1 } { - prepend-path C_INCLUDE_PATH $PREFIX/include - } - if { [lsearch ${::dont-setenv} "CPLUS_INCLUDE_PATH"] == -1 } { - prepend-path CPLUS_INCLUDE_PATH $PREFIX/include - } - if { [lsearch ${::dont-setenv} "${NAME}_INCLUDE_DIR"] == -1 } { - setenv ${NAME}_INCLUDE_DIR $PREFIX/include - } - } - - debug "prepend to library paths" - if { [file isdirectory "$PREFIX/lib"] } { - if { [lsearch ${::dont-setenv} "LIBRARY_PATH"] == -1 } { - prepend-path LIBRARY_PATH $PREFIX/lib - } - if { [lsearch ${::dont-setenv} "LD_LIBRARY_PATH"] == -1 } { - prepend-path LD_LIBRARY_PATH $PREFIX/lib - } - if { [lsearch ${::dont-setenv} "${NAME}_LIBRARY_DIR"] == -1 } { - setenv ${NAME}_LIBRARY_DIR $PREFIX/lib - } - } - - if { [file isdirectory "$PREFIX/lib/pkgconfig"] } { - if { [lsearch ${::dont-setenv} "PKG_CONFIG_PATH"] == -1 } { - prepend-path PKG_CONFIG_PATH $PREFIX/lib/pkgconfig - } - } - - if { [file isdirectory "$PREFIX/lib/cmake"] } { - if { [lsearch ${::dont-setenv} "CMAKE_MODULE_PATH"] == -1 } { - prepend-path CMAKE_MODULE_PATH $PREFIX/lib/cmake - } - } - - debug "prepend to library paths (64bit)" - if { [file isdirectory "$PREFIX/lib64"] } { - if { [lsearch ${::dont-setenv} "LIBRARY_PATH"] == -1 } { - prepend-path LIBRARY_PATH $PREFIX/lib64 - } - if { [lsearch ${::dont-setenv} "LD_LIBRARY_PATH"] == -1 } { - prepend-path LD_LIBRARY_PATH $PREFIX/lib64 - } - if { [lsearch ${::dont-setenv} "${NAME}_LIBRARY_DIR"] == -1 } { - setenv ${NAME}_LIBRARY_DIR $PREFIX/lib64 + foreach var $value { + prepend-path $var $key } } } diff --git a/Pmodules/modbuild.in b/Pmodules/modbuild.in index c3f501a..a8cc14f 100755 --- a/Pmodules/modbuild.in +++ b/Pmodules/modbuild.in @@ -367,6 +367,9 @@ bash_expand(){ build_modules_legacy() { find_variants_files(){ + shopt -q nullglob || : + local -i nullglob_set=$? + local files=( "${BUILDBLOCK_DIR}"/*/"${BNAME_VARIANTS}"\.${opt_system} ) files+=( "${BUILDBLOCK_DIR}"/*/"${BNAME_VARIANTS}.$(uname -s)" ) local f @@ -375,6 +378,10 @@ build_modules_legacy() { || [[ -e "${f}.$(uname -s)" ]] \ || files+=( "$f" ) done + if (( ${#files[@]} == 0 )); then + std::die 2 "No suitable variants file found!" + fi + (( nullglob_set == 1 )) && shopt -u nullglob std::upvar "$1" "${files[@]}" } diff --git a/Pmodules/modulecmd.bash.in b/Pmodules/modulecmd.bash.in index b35fa96..2f8d894 100644 --- a/Pmodules/modulecmd.bash.in +++ b/Pmodules/modulecmd.bash.in @@ -699,15 +699,20 @@ subcommand_load() { if [[ -n "${error}" ]]; then echo "${error}" 1>&2 fi - - local msg=$(printf "%s %s: %s -- %s" \ - "${CMD}" 'load' \ - "${rel_stage} module has been loaded" \ - "${m}") + local msg='' if [[ ${verbosity_lvl} != silent ]] && \ - [[ ${rel_stage} != stable ]]; then + [[ ${rel_stage} != stable ]]; then + msg=$(printf "%s %s: %s -- %s" \ + "${CMD}" 'load' \ + "${rel_stage} module has been loaded" \ + "${m}") std::info "%s" "${msg}" fi + msg=$(printf "%s: %s %s %s" \ + 'load' \ + "modulefile=${current_modulefile}" \ + "rel-stage=${rel_stage}" \ + "user=${USER}") ${logger} -t Pmodules "${msg}" done # fix LOADEDMODULES @@ -2878,6 +2883,7 @@ done if [[ -z "${subcommand}" ]]; then std::die 1 "${CMD}: no sub-command specified." fi +declare -rx TCL_LIBRARY="${PMODULES_HOME}/lib/tcl@TCL_VERSION@" if [[ -z "${Subcommands[${subcommand}]}" ]]; then std::die 1 "${CMD}: unknown sub-command -- ${subcommand}" diff --git a/Pmodules/modulecmd.in b/Pmodules/modulecmd.in index bce0367..02a5b41 100644 --- a/Pmodules/modulecmd.in +++ b/Pmodules/modulecmd.in @@ -2,4 +2,4 @@ unset BASH_ENV -"@BASH@" --noprofile --norc "@MODULECMD@" "$@" +"${PMODULES_HOME}/libexec/bash" --noprofile --norc "${PMODULES_HOME}/libexec/modulecmd.bash" "$@" diff --git a/build b/build index 99f8959..bee2ad5 100755 --- a/build +++ b/build @@ -7,6 +7,7 @@ if (( "${BASH_VERSINFO[0]}" < 5 )); then echo "BASH version 5.0 or newer is required and must be available in PATH!" 1>&2 exit 1 fi +declare TCL_VERSION='8.6' set -o nounset set -o pipefail @@ -432,6 +433,7 @@ build::install() { sed_cmd+="s:@VERSIONING@:#:g;" sed_cmd+="s:@BASH@:${PREFIX}/${UTILBIN_DIR}/bash:g;" sed_cmd+="s:@MODULECMD@:${PREFIX}/${UTILBIN_DIR}/modulecmd.bash:g;" + sed_cmd+="s:@TCL_VERSION@:${TCL_VERSION}:g;" sed "${sed_cmd}" "${SRC_DIR}/profile.bash.in" \ > "${INSTALL_ROOT}/${CONFIG_DIR}/profile.bash-${VERSION}"