From 0b43ed228083a9eacce5cd2af510f11a164a4a60 Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Fri, 13 May 2022 11:32:35 +0200 Subject: [PATCH] derive PMODULES_ROOT from PMODULES_HOME --- Pmodules/bash | 6 -- Pmodules/csh | 7 -- Pmodules/libmodules.tcl | 6 +- Pmodules/libpbuild.bash | 26 +++++- Pmodules/libpmodules.bash.in | 29 +++---- Pmodules/modbuild.in | 156 ++++++++++++++++++++--------------- Pmodules/modulecmd.bash.in | 50 +++++++---- Pmodules/modulefile | 2 +- Pmodules/profile.bash.in | 9 +- Pmodules/profile.csh.in | 22 +---- Pmodules/profile.zsh.in | 49 ++--------- Pmodules/zsh | 118 +++++--------------------- Tools/modules/build | 4 +- config/modbuild.conf.in | 7 +- 14 files changed, 204 insertions(+), 287 deletions(-) diff --git a/Pmodules/bash b/Pmodules/bash index 5afa1be..9f0963a 100644 --- a/Pmodules/bash +++ b/Pmodules/bash @@ -11,10 +11,6 @@ fi ############################################################################ # some sanity checks # -if [[ ! -d ${PMODULES_ROOT} ]]; then - echo "Oops: ${PMODULES_ROOT}: Set as Pmodules root, but this is not a directory." 1>&2 - return 1 -fi if [[ ! -d ${PMODULES_HOME} ]]; then echo "Oops: ${PMODULES_HOME}: Set as Pmodules home, but this is not a directory." 1>&2 return 1 @@ -35,8 +31,6 @@ unset MODULE_VERSION_STACK unset MODULESHOME unset PMODULES_ENV -declare -x PMODULES_MODULEFILES_DIR='modulefiles' -declare -x PMODULES_CONFIG_DIR='config' declare -x PMODULES_DIR="${PMODULES_HOME}" diff --git a/Pmodules/csh b/Pmodules/csh index 5fb9926..cf6f2dc 100644 --- a/Pmodules/csh +++ b/Pmodules/csh @@ -35,13 +35,6 @@ unset prefix unset postfix setenv MODULEPATH -foreach group ( ${DefaultGroups} ) - if ( "${MODULEPATH}" == "" ) then - setenv MODULEPATH "${PMODULES_ROOT}/${group}/${PMODULES_MODULEFILES_DIR}" - else - setenv MODULEPATH "${MODULEPATH}:${PMODULES_ROOT}/${group}/${PMODULES_MODULEFILES_DIR}" - endif -end if (! $?LOADEDMODULES ) then setenv LOADEDMODULES "" diff --git a/Pmodules/libmodules.tcl b/Pmodules/libmodules.tcl index cf8f88f..e153655 100644 --- a/Pmodules/libmodules.tcl +++ b/Pmodules/libmodules.tcl @@ -314,11 +314,11 @@ proc ModulesHelp { } { # intialize global vars # Modulefile is something like # -# ${PMODULES_ROOT}/group/modulefiles/name/version +# /group/modulefiles/name/version # or -# ${PMODULES_ROOT}/group/modulefiles/X1/Y1/name/version +# /group/modulefiles/X1/Y1/name/version # or -# ${PMODULES_ROOT}/group/modulefiles/X1/Y1//X2/Y2/name/version +# /group/modulefiles/X1/Y1//X2/Y2/name/version # proc _find_overlay { modulefile_components } { debug "_find_overlay()" diff --git a/Pmodules/libpbuild.bash b/Pmodules/libpbuild.bash index 6ec7ac5..165d84b 100644 --- a/Pmodules/libpbuild.bash +++ b/Pmodules/libpbuild.bash @@ -941,7 +941,7 @@ pbuild::make_all() { } #...................................................................... - # Install modulefile in ${PMODULES_ROOT}/${GROUP}/modulefiles/... + # Install modulefile in ${pm_root}/${GROUP}/modulefiles/... # # Arguments # none @@ -1436,10 +1436,10 @@ pbuild.build_module() { # :FIXME: this is a hack!!! # shouldn't this be set in the build-script? - if [[ -e "${PMODULES_ROOT}/Libraries" ]]; then + if [[ -e "${PMODULES_HOME%%/Tools*}/Libraries" ]]; then eval $( "${MODULECMD}" bash use Libraries ) fi - if [[ -e "${PMODULES_ROOT}/System" ]]; then + if [[ -e "${PMODULES_HOME%%/Tools*}/System" ]]; then eval $( "${MODULECMD}" bash use System ) fi unset C_INCLUDE_PATH @@ -1493,6 +1493,26 @@ pbuild.bootstrap() { pbuild::make_all } +#----------------------------------------------------------------------------- +# +read_config_file() { + local fname="$1" + if [[ ! -r "${fname}" ]]; then + std::die 1 "Configuration file '${fname}' does not exist or is not readable!" + fi + + eval $(std::parse_yaml "${fname}" '') || std::die 1 "Cannot read configuration file '${fname}'" + + PMODULES_ROOT="${Overlays_base_install_root}" + PMODULES_DISTFILESDIR="${DistfilesDir}" + PMODULES_TMPDIR="${TmpDir}" + PMODULES_HOME="${PMODULES_ROOT}/Tools/Pmodules/${PMODULES_VERSION}" + + if [[ -z "${PMODULES_HOME}" ]]; then + std::die 1 "Error in configuration file '${fname}': PMODULE_HOME not defined!" + fi +} + # Local Variables: # mode: sh # sh-basic-offset: 8 diff --git a/Pmodules/libpmodules.bash.in b/Pmodules/libpmodules.bash.in index 5a2dfe8..b78e1d6 100644 --- a/Pmodules/libpmodules.bash.in +++ b/Pmodules/libpmodules.bash.in @@ -9,7 +9,7 @@ declare -A Help=() # initialize help text of 'module --version' Help['version']=" -Pmodules @PMODULES_VERSION@ using Tcl Environment Modules @MODULES_VERSION@ +Pmodules @PMODULES_VERSION@ using Tcl Environment Modules Copyright GNU GPL v2 " @@ -78,14 +78,14 @@ get_ol_config_files(){ if [[ -r "${HOME}/.Pmodules/Pmodules.yaml" ]]; then files+=("${HOME}/.Pmodules/Pmodules.yaml") fi - test -r "${PMODULES_ROOT}/config/Pmodules.yaml" || \ + test -r "${PMODULES_HOME%%/Tools*}/config/Pmodules.yaml" || \ std::die 3 \ "%s %s -- %s" \ "base overlay definition file" \ "does not exist or is not readable" \ "$_" - files+=("${PMODULES_ROOT}/config/Pmodules.yaml") + files+=("${PMODULES_HOME%%/Tools*}/config/Pmodules.yaml") std::upvar "$1" "${files[@]}" } @@ -93,24 +93,24 @@ get_ol_config_files(){ get_ol_install_root(){ # $1 overlay name # ${@:2} files - yq -Ne e ".overlays.$1.install_root" - < <(cat "${@:2}") 2>/dev/null + yq -Ne e ".Overlays.$1.install_root" - < <(cat "${@:2}") 2>/dev/null } get_ol_modulefiles_root(){ # $1 overlay name # ${@:2} files - yq -Ne e ".overlays.$1.modulefiles_root" - < <(cat "${@:2}") 2>/dev/null + yq -Ne e ".Overlays.$1.modulefiles_root" - < <(cat "${@:2}") 2>/dev/null } get_ol_type(){ # $1 overlay name # ${@:2} files - yq -Ne e ".overlays.$1.type" - < <(cat "${@:2}") 2>/dev/null + yq -Ne e ".Overlays.$1.type" - < <(cat "${@:2}") 2>/dev/null } get_ol_names(){ # ${@} files - yq -Ne e ".overlays|keys" - < <(cat "$@") 2>/dev/null | cut -b3- + yq -Ne e ".Overlays|keys" - < <(cat "$@") 2>/dev/null | cut -b3- } get_ol_info(){ @@ -154,19 +154,20 @@ get_ol_info(){ "${ol_name}" \ "${files[@]}") || \ ol_type="${ol_normal}" - elif [[ "${name_or_dir}" == 'default' ]]; then - ol_name='default' + elif [[ "${name_or_dir}" == 'base' ]]; then + ol_name='base' ol_type="${ol_normal}" - ol_modulefiles_root="${PMODULES_ROOT}" - ol_install_root="${PMODULES_ROOT}" - else + ol_modulefiles_root="${PMODULES_HOME%%/Tools*}" + ol_install_root="${PMODULES_HOME%%/Tools*}" + else return 1 fi - + [[ -n "$2" ]] && std::upvar "$2" "${ol_name}" [[ -n "$3" ]] && std::upvar "$3" "${ol_type}" [[ -n "$4" ]] && std::upvar "$4" "${ol_install_root}" - [[ -n "$5" ]] && std::upvar "$5" "${ol_modulefiles_root}" + [[ -n "$5" ]] && std::upvar "$5" "$(eval "echo ${ol_modulefiles_root}")" + return 0 } # Local Variables: diff --git a/Pmodules/modbuild.in b/Pmodules/modbuild.in index 17cfb84..78a600e 100755 --- a/Pmodules/modbuild.in +++ b/Pmodules/modbuild.in @@ -34,6 +34,7 @@ source libstd.bash || { # can be set in the configuration file declare PMODULES_DISTFILESDIR='' declare PMODULES_TMPDIR='' +declare pm_root="${PMODULES_HOME%%/Tools*}" source libpbuild.bash || \ std::die 3 "Oops: cannot source library -- '$_'" @@ -131,7 +132,7 @@ MISCELLANEOUS OPTIONS: Directory used for building a module. --overlay - Install in this overlay. Defaults to '${PMODULES_ROOT}'. + Install in this overlay. Defaults to '${PMODULES_HOME%%/Tools*}'. " exit 1 } @@ -147,7 +148,7 @@ MISCELLANEOUS OPTIONS: # versions to be build, '.*' or none means all declare -a versions=() declare opt_bootstrap='no' -declare opt_build_config='modbuild.conf' +declare opt_build_config='Pmodules.yaml' declare opt_build_target='all' declare opt_dry_run='no' declare opt_enable_cleanup_build='yes' @@ -408,10 +409,10 @@ build_modules_legacy() { done std::die 10 "Aborting..." fi - declare ol_name='default' + declare ol_name='base' declare ol_type='' - declare ol_dir="${PMODULES_ROOT}" - declare ol_install_dir="${PMODULES_ROOT}" + declare ol_dir="${pm_root}" + declare ol_install_dir="${pm_root}" local -i i=0 local -i num_variants=${#variants[@]} for ((i = 0; i < num_variants; i++)); do @@ -430,27 +431,52 @@ build_modules_yaml(){ local variants_file="${BUILDBLOCK_DIR}/files/" variants_file+="${BNAME_VARIANTS}.${opt_system}.yaml" + # + # $1 file name + # $2 module name + # $3 index + # yaml_get_overlay(){ - local ol=$(yq e ".overlay" "${variants_file}") - [[ "${ol}" == 'null' ]] && ol='default' - echo "${ol}" + local ol=$(yq e ".$2.variants[$3].overlay" "$1") + if [[ "${ol}" != 'null' ]]; then + echo "${ol}" + return + fi + ol=$(yq e ".$2.overlay" "$1") + if [[ "${ol}" != 'null' ]]; then + echo "${ol}" + return + fi + echo 'base' } yaml_get_versions(){ - yq e "with_entries(select(.key | test(\"$1\"))) | keys" \ - "${variants_file}"|cut -b3- - } - yaml_get_num_variants(){ - yq e ".[\"$1\"].variants | length" \ - "${variants_file}" - } - yaml_get_dependencies(){ - yq e ".[\"$1\"].variants[$2].dependencies[]" \ - "${variants_file}" + yq e ".$2.variants[].version" "$1" } - yaml_get_rel_stage(){ - yq e ".[\"$1\"].variants[$2].relstage" \ - "${variants_file}" + yaml_get_num_variants(){ + yq e ".$2.variants | length" "$1" + } + + yaml_get_version(){ + yq e ".$2.variants[$3].version" "$1" + } + + yaml_get_dependencies(){ + yq e ".$2.variants[$2].dependencies[]" "$1" + } + + yaml_get_relstage(){ + local relstage=$(yq e ".$2.variants[$3].relstage" "$1") + if [[ "${relstage}" != 'null' ]]; then + echo "${relstage}" + return + fi + relstage=$(yq e ".$2.relstage" "$1") + if [[ "${relstage}" != 'null' ]]; then + echo "${relstage}" + return + fi + echo 'unstable' } local name="$1" @@ -464,39 +490,38 @@ build_modules_yaml(){ pattern+=" && /${m//\//\\/}( |$)/" done - # precidency: - # 1. overlay passed as argument - # 2. overlay defined for the variant - # 3. default in variants file - # 4. default overlay - local ol_name_or_dir=$(yaml_get_overlay) - get_ol_info "${ol_name_or_dir}" \ - ol_name \ - ol_type \ - ol_dir \ - ol_install_dir \ - || std::die 3 "${variants_file##*/}: unknown overlay -- ${ol_name_or_dir}" - - # loop over all matching versions and all variants - local key='' - local -a keys=( $(yaml_get_versions "${version}") ) - for key in "${keys[@]}"; do - local -i n_variants=$(yaml_get_num_variants "${key}") - for ((i=0; i 0 )); then - with_modules=( $(brace_expand ${deps[@]} | awk "${pattern}") ) - (( ${#with_modules[@]} == 0 )) && continue - fi - local name="${key%/*}" - local version="${key#*/}" - local relstage=$(yaml_get_rel_stage "${key}" "$i") - pbuild.build_module \ - "${name}" "${version}" \ - "${relstage}" "${with_modules[@]}" - done + local -i n_variants=$(yaml_get_num_variants \ + "${variants_file}" "${name}") + local i + for (( i=0; i 0 )); then + with_modules=( $(brace_expand ${deps[@]} | awk "${pattern}") ) + (( ${#with_modules[@]} == 0 )) && continue + fi + local relstage=$(yaml_get_relstage \ + "${variants_file}" \ + "${name}" \ + "$i") + local ol=$(yaml_get_overlay \ + "${variants_file}" \ + "${name}" \ + "$i") + get_ol_info "${ol}" \ + ol_name \ + ol_type \ + ol_install_dir \ + ol_dir \ + || std::die 3 "${variants_file##*/}: unknown overlay -- ${ol_name_or_dir}" + pbuild.build_module \ + "${name}" "${version}" \ + "${relstage}" "${with_modules[@]}" done } @@ -526,26 +551,21 @@ pbuild.update_modulefiles "${opt_update_modulefiles}" pbuild.system "${opt_system}" pbuild.verbose "${opt_verbose}" +# +# read configuration for modbuild +# if [[ "${opt_bootstrap}" == 'yes' ]]; then test -d "${BUILDBLOCK_DIR}/../../config" && PATH+=":$_" -else - # Please note: if we trap DEBUG a statement like - # test -d ... && PATH+=$_ - # does not work (at least on macOS with bash 4 and 5) - if [[ -d "${PMODULES_ROOT}/${PMODULES_CONFIG_DIR}" ]]; then - PATH+=":${PMODULES_ROOT}/${PMODULES_CONFIG_DIR}" - fi fi -source "${opt_build_config}" || \ - std::die 3 "Oops: Cannot source configuration file -- '$_'" +read_config_file "${pm_root}/${PMODULES_CONFIG_DIR}/${opt_build_config}" # :FIXME: should go dist files to -# ${PMODULES_ROOT}/var/distfiles +# ${pm_root}/var/distfiles # or # ${overlay}/var/distfiles # ? -: ${PMODULES_DISTFILESDIR:=${PMODULES_ROOT}/var/distfiles} +: ${PMODULES_DISTFILESDIR:=${pm_root}/var/distfiles} : ${PMODULES_TMPDIR:=/var/tmp/${USER}} declare -r BUILD_SCRIPT @@ -559,10 +579,10 @@ module_name=${fname[${#fname[@]}-2]} # are we bootstrapping? If yes, go for it... # if [[ "${opt_bootstrap}" == 'yes' ]]; then - declare ol_name='default' + declare ol_name='base' declare ol_type='' - declare ol_dir="${PMODULES_ROOT}" - declare ol_install_dir="${PMODULES_ROOT}" + declare ol_dir="${pm_root}" + declare ol_install_dir="${pm_root}" pbuild.bootstrap "${module_name}" "${versions[0]}" 'stable' exit $? fi diff --git a/Pmodules/modulecmd.bash.in b/Pmodules/modulecmd.bash.in index 7cb9bd2..4a5a504 100644 --- a/Pmodules/modulecmd.bash.in +++ b/Pmodules/modulecmd.bash.in @@ -17,8 +17,10 @@ declare -r libexecdir="${prefix}/libexec" source "${libdir}/libstd.bash" source "${libdir}/libpmodules.bash" +declare -r os_name="$(uname -s)" + path="/bin:/usr/bin" -[[ $(uname -s) == 'Darwin' ]] && path="${libexecdir}:${path}" +[[ ${os_name} == 'Darwin' ]] && path="${libexecdir}:${path}" std::def_cmds "${path}" \ 'awk' 'base64' 'find' 'getopt' 'logger' 'mktemp' \ 'rm' 'sort' 'find' @@ -38,7 +40,7 @@ declare verbosity_lvl=${PMODULES_VERBOSITY:-'verbose'} declare Shell='' -declare -r pmodules_config_file="${PMODULES_ROOT}/${PMODULES_CONFIG_DIR}/Pmodules.yaml" +declare -r pmodules_config_file="${PMODULES_HOME%%/Tools*}/${PMODULES_CONFIG_DIR}/Pmodules.yaml" # the following settings are used if the config file doesn't exist @@ -92,6 +94,21 @@ export_env() { # declare g_env_must_be_saved='no' +encode_base64(){ + case "${os_name}" in + Linux ) + "${base64}" --wrap=0 <<< "$1" + ;; + Darwin ) + # does not wrap if running in a script + "${base64}" <<< "$1" + ;; + * ) + std::die 255 "Oops: Unsupported OS" + ;; + esac +} + save_env() { [[ $1 == 'no' ]] && return 0 local vars=( Version ) @@ -104,7 +121,7 @@ save_env() { vars+=( OverlayDict Dir2OverlayMap) local s=$(typeset -p ${vars[@]}) - declare -g PMODULES_ENV=$( "${base64}" --wrap=0 <<< "$s" ) + declare -g PMODULES_ENV=$( encode_base64 "$s" ) export_env 'PMODULES_ENV' } @@ -172,7 +189,7 @@ get_release_stage() { } is_release_stage() { - [[ ${ReleaseStages} =~ :$1: ]] + [[ :${ReleaseStages}: =~ :$1: ]] } # @@ -1627,7 +1644,7 @@ subcommand_unuse() { "is not an overlay directory" \ "${ol_name_or_dir%:*}" - [[ "${ol_dir}" == "${PMODULES_ROOT}" ]] && \ + [[ "${ol_dir}" == "${PMODULES_HOME%%/Tools*}" ]] && \ std::die 3 "%s %s: %s -- %s" \ "${CMD}" "${subcommand}" \ "cannot remove root overlay" \ @@ -1862,13 +1879,13 @@ init_manpath() { } pmodules_init() { - if [[ -r "${pmodules_config_file}" ]]; then - eval $(yq -Ne e ".defaults" ${pmodules_config_file} | \ - awk '/DefaultGroups|ReleaseStages|DefaultReleaseStages/ { - printf "%s=%s\n",substr($1,1,length($1)-1), $2}') || \ - std::die 3 "Oops: cannot parse config file -- %s\n" \ - "${pmodules_config_file}" - fi + [[ -r "${pmodules_config_file}" ]] || \ + std::die 3 "Oops: cannot read config file -- %s\n" \ + "${pmodules_config_file}" + + eval $(std::parse_yaml "${pmodules_config_file}" '') || \ + std::die 3 "Oops: cannot parse config file -- %s\n" \ + "${pmodules_config_file}" declare -gx LOADEDMODULES='' declare -gx _LMFILES_='' declare -gx UsedGroups='' @@ -2445,7 +2462,7 @@ subcommand_search() { # :FIXME: do we need this? if (( ${#GroupDepths[@]} == 0 )) || \ - [[ ${src_prefix} != ${PMODULES_ROOT} ]]; then + [[ ${src_prefix} != ${PMODULES_HOME%%/Tools*} ]]; then scan_groups "${src_prefix}" g_env_must_be_saved='yes' fi @@ -2768,9 +2785,10 @@ if [[ -z "${Subcommands[${subcommand}]}" ]]; then fi init_overlay_vars() { - declare -ag OverlayList=( "${PMODULES_ROOT}" ) - declare -Ag OverlayNames=( [${PMODULES_ROOT}]='base' ) - declare -Ag OverlayDict=([${PMODULES_ROOT}]="0:${PMODULES_ROOT}") + local -r pm_root="${PMODULES_HOME%%/Tools*}" + declare -ag OverlayList=( "${pm_root}" ) + declare -Ag OverlayNames=( [${pm_root}]='base' ) + declare -Ag OverlayDict=([${pm_root}]="0:${pm_root}") declare -Ag Dir2OverlayMap=() local overlay for overlay in "${!OverlayDict[@]}"; do diff --git a/Pmodules/modulefile b/Pmodules/modulefile index 1893fdb..40eba48 100644 --- a/Pmodules/modulefile +++ b/Pmodules/modulefile @@ -10,7 +10,7 @@ Pmodules are a hierarchical module environment based on Environment Modules. " # -# It might be that '${PMODULES_ROOT}/Tools/Pmodules/VERSION' is in PATH. +# It might be that '${PMODULES_HOME}' is in PATH. # Why? With older version the PATH might have been set without loading # a module. # diff --git a/Pmodules/profile.bash.in b/Pmodules/profile.bash.in index f25eee8..69312fb 100644 --- a/Pmodules/profile.bash.in +++ b/Pmodules/profile.bash.in @@ -1,13 +1,14 @@ #!/bin/bash # -# The following settings are system defaults. They can be (re-)defined -# in a system wide profile or in a user's profile. # set default version : ${PMODULES_VERSION:=@PMODULES_VERSION@} -declare -x PMODULES_ROOT=$(cd $(dirname "${BASH_SOURCE}")/.. && pwd) -declare -x PMODULES_HOME="${PMODULES_ROOT}/Tools/Pmodules/${PMODULES_VERSION}" +##### no changes below this line ###### + +declare __pm_root__=$(cd $(dirname "${BASH_SOURCE}")/.. && pwd) +declare -x PMODULES_HOME="${__pm_root__}/Tools/Pmodules/${PMODULES_VERSION}" +unset __pm_root__ test -r "${PMODULES_HOME}/init/bash" && source "$_" diff --git a/Pmodules/profile.csh.in b/Pmodules/profile.csh.in index b00013e..4409628 100755 --- a/Pmodules/profile.csh.in +++ b/Pmodules/profile.csh.in @@ -9,28 +9,8 @@ if ( ${PMODULES_VERSION} == "" ) then setenv PMODULES_VERSION "@PMODULES_VERSION@" endif -############################################################################# -# N O C H A N G E S B E L O W T H I S L I N E ! # -############################################################################# +setenv PMODULES_HOME "@PMODULES_ROOT@/Tools/Pmodules/${PMODULES_VERSION}" -setenv PMODULES_MODULEFILES_DIR 'modulefiles' -setenv ReleaseStages ':unstable:stable:deprecated:' - -setenv PMODULES_ROOT "@PMODULES_ROOT@" -setenv PMODULES_CONFIG_DIR 'config' -setenv PMODULES_HOME "${PMODULES_ROOT}/Tools/Pmodules/${PMODULES_VERSION}" -setenv PMODULES_DIR "${PMODULES_HOME}" - -############################################################################ -# some sanity checks -# - -# fixme: add some checks - - -############################################################################ -# inititialize Pmodules for csh -# set _init_csh="${PMODULES_HOME}/init/csh" if ( ! -r "${_init_csh}" ) then echo "Oops: cannot initialize Modules!" diff --git a/Pmodules/profile.zsh.in b/Pmodules/profile.zsh.in index 8077e79..fceda7d 100644 --- a/Pmodules/profile.zsh.in +++ b/Pmodules/profile.zsh.in @@ -1,50 +1,19 @@ -#!/bin/bash -# -# Notes: -# - PMODULES_ROOT is derived from the location of this file. -# - Some for PMODULES_CONFIG_DIR. -# - The Pmodules software must be installed in -# ${PMODULES_ROOT}/Tools/Pmodules/${PMODULES_VERSION} +#!/bin/zsh # -declare -xa DefaultGroups -declare -xa DefaultReleaseStages -declare -x PMODULES_VERSION - -: ${DefaultGroups:=(Tools Programming)} -: ${DefaultReleaseStages:=(stable)} +# set default version : ${PMODULES_VERSION:=@PMODULES_VERSION@} -############################################################################# -# N O C H A N G E S B E L O W T H I S L I N E ! # -############################################################################# +##### no changes below this line ###### -declare -x PMODULES_MODULEFILES_DIR='modulefiles' -declare -x ReleaseStages=':unstable:stable:deprecated:' +declare __pm_root__=$(cd $(dirname "${BASH_SOURCE}")/.. && pwd) +declare -x PMODULES_HOME="${__pm_root__}/Tools/Pmodules/${PMODULES_VERSION}" +unset __pm_root__ -declare -x PMODULES_ROOT=$(cd $(dirname "${(%):-%N}")/.. && pwd) -declare -x PMODULES_CONFIG_DIR=$(basename $(cd $(dirname "${(%):-%N}") && pwd)) -declare -x PMODULES_HOME="${PMODULES_ROOT}/Tools/Pmodules/${PMODULES_VERSION}" -declare -x PMODULES_DIR="${PMODULES_HOME}" +test -r "${PMODULES_HOME}/init/bash" && source "$_" -############################################################################ -# some sanity checks -# -if [[ ! -d ${PMODULES_ROOT} ]]; then - echo "Oops: ${PMODULES_ROOT}: Set as Pmodules root, but this is not a directory." 1>&2 - return 1 -fi -if [[ ! -d ${PMODULES_HOME} ]]; then - echo "Oops: ${PMODULES_HOME}: Set as Pmodules home, but this is not a directory." 1>&2 - return 1 -fi - -############################################################################ -# inititialize Pmodules for zsh -# -test -r "${PMODULES_HOME}/init/zsh" && source "$_" -if (( $? != 0 )); then - echo "Oops: cannot initialize Pmodules environment!" +if [[ $? != 0 ]]; then + echo "Oops: cannot initialize Pmodules!" return 1 fi diff --git a/Pmodules/zsh b/Pmodules/zsh index f1a0a4c..b479748 100644 --- a/Pmodules/zsh +++ b/Pmodules/zsh @@ -1,105 +1,19 @@ #!/bin/zsh -############################################################################# -# implement module comand as function +############################################################################ +# some sanity checks # -module() { - local -r modulecmd="${PMODULES_HOME}/bin/modulecmd" - - local -a args=() - local -a modulecmd_opts=() - local -a subcmd_opts=() - - while (( $# > 0 )); do - case $1 in - -* ) - modulecmd_opts+=( $1 ) - shift - ;; - * ) - break - ;; - esac - done - local -r subcmd="$1" - shift - while (( $# > 0 )); do - case $1 in - -* ) - subcmd_opts+=( $1 ) - ;; - [/~a-zA-Z]* ) - args+=( $1 ) - ;; - esac - shift - done - - [[ -z ${subcmd} ]] && args+=( 'help' ) - [[ ${#args[@]} == 0 ]] && args+=( '--' ) - - # Loop over all modules to load. - # Note: We have to eval here, otherwise we cannot do something like - # $ module load gcc/5.2.0 openmpi/1.8.8 hdf5/1.8.15 - local m - for module in ${args[@]}; do - eval $( "${modulecmd}" zsh "${modulecmd_opts[@]}" "${subcmd}" \ - "${subcmd_opts[@]}" "${module}" ) - done -} -export -f module +if [[ ! -d ${PMODULES_HOME} ]]; then + echo "Oops: ${PMODULES_HOME}: Set as Pmodules home, but this is not a directory." 1>&2 + return 1 +fi ############################################################################# -# helper functions +# initialize bash completion # -save_env() { - local s='' - while (( $# > 0 )); do - s+="$( typeset -p $1 );" - shift - done - echo export PMODULES_ENV=$( "${PMODULES_HOME}/sbin/base64" --wrap=0 <<< "$s" ) -} - -############################################################################# -# setup environment -# -declare -x LOADEDMODULES='' -declare -x _LMFILES_='' - -# build initial MODULEPATH -declare -x MODULEPATH='' -typeset -T MODULEPATH modulepath -for group in ${DefaultGroups[@]}; do - dir="${PMODULES_ROOT}/${group}/${PMODULES_MODULEFILES_DIR}" - modulepath=( "${dir}" ${(m)modulepath:#${dir}} ) -done - -# build initial list of used releases -declare -x UsedReleases='' -typeset -T UsedReleases usedreleases -for r in ${DefaultReleaseStages[@]}; do - usedreleases=( "${r}" ${(m)usedreleases:#${r}} ) -done - -eval $(save_env UsedReleases DefaultReleaseStages DefaultGroups ReleaseStages) - -unset UsedReleases -unset DefaultReleaseStages -unset DefaultGroups -unset ReleaseStages - -# initialize MANPATH with output of `man --path` if not set -[[ -z "${MANPATH}" ]] && manpath=$( man --path ) - -# add man pages of Pmodules and remove all other Pmodules man pages -manpath=( "${PMODULES_HOME}/share/man" ${(m)manpath:#${dirs_to_remove}} ) - -# initialize completion -test -r "${PMODULES_HOME}/init/zsh_completion" && source "$_" - -# cleanup -unset group dir r dirs_to_remove +if [[ -r "${PMODULES_HOME}/init/bash_completion" ]]; then + source "${PMODULES_HOME}/init/bash_completion" +fi ############################################################################# # legacy... @@ -107,6 +21,18 @@ unset group dir r dirs_to_remove unset MODULE_VERSION unset MODULE_VERSION_STACK unset MODULESHOME +unset PMODULES_ENV + +declare -x PMODULES_DIR="${PMODULES_HOME}" + + +############################################################################# +# implement module comand as shell function +# +module() { + eval $("${PMODULES_HOME}/bin/modulecmd" bash "$@") +} +export -f module # Local Variables: # mode: sh diff --git a/Tools/modules/build b/Tools/modules/build index 8a1f45f..14399de 100755 --- a/Tools/modules/build +++ b/Tools/modules/build @@ -5,7 +5,7 @@ declare -rx CC=gcc pbuild::set_download_url "https://amas.web.psi.ch/Downloads/$P/$P-$V.tar.bz2" -TCL_DIR="${PMODULES_ROOT}/Tools/Pmodules/${PMODULES_VERSION}" +TCL_DIR="${PMODULES_HOME}" PATH="${TCL_DIR}/bin:${PATH}" @@ -21,7 +21,7 @@ pbuild::configure() { CPPFLAGS="-DUSE_INTERP_ERRORLINE" "${SRC_DIR}"/configure \ --prefix="${PREFIX}" \ --exec-prefix="${PREFIX}" \ - --with-module-path="${PMODULES_ROOT}/Tools/${PMODULES_MODULEFILES_DIR}" \ + --with-module-path="${PMODULES_HOME%%/Tools*}/Tools/${PMODULES_MODULEFILES_DIR}" \ --with-tcl="${TCL_DIR}/lib" \ --without-x \ --disable-versioning \ diff --git a/config/modbuild.conf.in b/config/modbuild.conf.in index cfce2aa..6292ea6 100644 --- a/config/modbuild.conf.in +++ b/config/modbuild.conf.in @@ -1,16 +1,11 @@ #!/bin/bash # -: ${PMODULES_ROOT:=@PMODULES_ROOT@} : ${PMODULES_DISTFILESDIR:=@PMODULES_DISTFILESDIR@} : ${PMODULES_TMPDIR:=@PMODULES_TMPDIR@} -export PMODULES_ROOT export PMODULES_DISTFILESDIR export PMODULES_TMPDIR -declare -x PMODULES_CONFIG_DIR='config' -declare -x PMODULES_MODULEFILES_DIR='modulefiles' - -declare -x PMODULES_HOME="${PMODULES_ROOT}/Tools/Pmodules/${PMODULES_VERSION}" +declare -x PMODULES_HOME="@PMODULES_ROOT@/Tools/Pmodules/${PMODULES_VERSION}" declare -x DefaultGroups='Tools Programming' declare ReleaseStages=':unstable:stable:deprecated:'