mirror of
https://github.com/Pmodules/Pmodules.git
synced 2026-06-29 02:39:39 +02:00
upstream merged
This commit is contained in:
@@ -1,5 +1,86 @@
|
||||
# Changelog of Pmodules
|
||||
|
||||
## Version 1.1.10
|
||||
* **modulecmd**
|
||||
* *User visible changes*
|
||||
* ...
|
||||
* *Internal changes and fixes*
|
||||
* ...
|
||||
|
||||
* **build-system**
|
||||
* *User visible changes*
|
||||
* ...
|
||||
* *Internal changes and fixes*
|
||||
* ...
|
||||
|
||||
* **other changes**
|
||||
* ...
|
||||
|
||||
## Version 1.1.9
|
||||
* **modulecmd**
|
||||
* *User visible changes*
|
||||
* Overlay info added to output of sub-command `search`.
|
||||
* Output of `module search --verbose` revised for better readability.
|
||||
* *Internal changes and fixes*
|
||||
* The shell`s init file is sourced, when Pmodules is loaded as module.
|
||||
This is required if there are changes in the module function or too
|
||||
define new shell functions.
|
||||
* A bug in `libmodules.tcl:module-addgroup()` which crashed
|
||||
`module load ...` has been fixed.
|
||||
* In versions before 1.1.9 a colon at the beginning or end of `MODULEPATH`
|
||||
crashed the module function. This has been fixed.
|
||||
|
||||
* **build-system**
|
||||
* *User visible changes*
|
||||
* The command `modbuild` is now defined as shell function analog to
|
||||
the `module` command. The main reason to introduce this function
|
||||
is due to the fact that Bash version 5 or newer is now required
|
||||
by `modbuild`. The function `modbuild` load Bash 5.x as module
|
||||
before calling the modbuild-script. If you want to use the script
|
||||
directly, a Bash binary with version 5.x must be in PATH.
|
||||
* If a build-script is in the current working directory,
|
||||
`modbuild` can now be called without specifying the build-script.
|
||||
* In case of an error in a build-step the build process did not
|
||||
abort as it should. This has been fixed.
|
||||
* The option `--overlay` can now be used
|
||||
- to define an overlay if legacy variants files are used
|
||||
- to override the overlay in a YAML variants file.
|
||||
* The new keyword `with` has been introduced in YAML variants file
|
||||
to specified hierarchical dependencies.
|
||||
|
||||
* **Internal changes and fixes**
|
||||
* bugfix in setting `PATH`
|
||||
* requires bash 5 or later
|
||||
|
||||
## Version 1.1.8
|
||||
* **modulecmd**
|
||||
* *User visible changes*
|
||||
* configuration in YAML files
|
||||
* modulefiles and software must not
|
||||
have a common root directory
|
||||
* the installation root must be specified, it doesn`t default
|
||||
to the base 'overlay' any more.
|
||||
* zsh initialisation fixed.
|
||||
* *Internal changes and fixes*
|
||||
* std::upvar() replaced with reference variables in part of the
|
||||
code.
|
||||
* environment variable `PMODULES_ROOT` removed.
|
||||
* unsetting aliases fixed.
|
||||
* update to bash 5.1.16
|
||||
* update to findutils 4.9 (macOS only)
|
||||
* minor fixes
|
||||
* **build-system**
|
||||
* *User visible changes*
|
||||
* YAML format for variants files
|
||||
* *Internal changes and fixes*
|
||||
* use lib `libpmodules.bash`
|
||||
* bugfixes
|
||||
* **modmanage**
|
||||
* *User visible changes*
|
||||
* none, support for overlays still missing
|
||||
* *Internal changes and fixes*
|
||||
* none
|
||||
|
||||
## Version 1.1.7
|
||||
* **modulecmd**
|
||||
* list of available overlays in subcommand `use` is now better readable
|
||||
|
||||
+5
-2
@@ -29,11 +29,9 @@ fi
|
||||
unset MODULE_VERSION
|
||||
unset MODULE_VERSION_STACK
|
||||
unset MODULESHOME
|
||||
unset PMODULES_ENV
|
||||
|
||||
declare -x PMODULES_DIR="${PMODULES_HOME}"
|
||||
|
||||
|
||||
#############################################################################
|
||||
# implement module comand as shell function
|
||||
#
|
||||
@@ -43,6 +41,11 @@ module() {
|
||||
}
|
||||
export -f module
|
||||
|
||||
modbuild(){
|
||||
"${PMODULES_HOME}/bin/modbuild" "$@"
|
||||
}
|
||||
export -f modbuild
|
||||
|
||||
# Local Variables:
|
||||
# mode: sh
|
||||
# sh-basic-offset: 8
|
||||
|
||||
+25
-23
@@ -43,15 +43,15 @@ proc _pmodules_parse_pmodules_env { } {
|
||||
Dir2OverlayMap {
|
||||
array set ::Dir2OverlayMap [regsub -all {[]=[]} $value " "]
|
||||
}
|
||||
OverlayDict {
|
||||
array set ::OverlayDict [regsub -all {[]=[]} $value " "]
|
||||
OverlayInfo {
|
||||
array set ::OverlayInfo [regsub -all {[]=[]} $value " "]
|
||||
}
|
||||
OverlayList {
|
||||
UsedOverlays {
|
||||
array set tmp [regsub -all {[]=[]} $value " "]
|
||||
set ::OverlayList {}
|
||||
set ::UsedOverlays {}
|
||||
set l [lsort [array names tmp]]
|
||||
foreach k $l {
|
||||
lappend ::OverlayList $tmp($k)
|
||||
lappend ::UsedOverlays $tmp($k)
|
||||
}
|
||||
}
|
||||
UsedGroups {
|
||||
@@ -79,9 +79,10 @@ proc module-addgroup { group } {
|
||||
|
||||
if { [module-info mode load] } {
|
||||
set overlays_to_add {}
|
||||
foreach overlay $::OverlayList {
|
||||
foreach overlay $::UsedOverlays {
|
||||
lappend overlays_to_add $overlay
|
||||
set ol_type [lindex [split $::OverlayDict($overlay) ":"] 0]
|
||||
set ol_type $::OverlayInfo($overlay:type)
|
||||
debug "ol_type=$ol_type"
|
||||
if { [string compare $ol_type $::ol_replacing] == 0 } {
|
||||
break
|
||||
}
|
||||
@@ -91,10 +92,11 @@ proc module-addgroup { group } {
|
||||
debug "group=$group"
|
||||
debug "::variant=$::variant"
|
||||
set dir [file join \
|
||||
$overlay \
|
||||
$::OverlayInfo($overlay:mod_root) \
|
||||
$group \
|
||||
$::MODULEFILES_DIR \
|
||||
{*}$::variant]
|
||||
debug "dir=$dir"
|
||||
if { [file isdirectory $dir] } {
|
||||
debug "prepend $dir to MODULEPATH "
|
||||
prepend-path MODULEPATH $dir
|
||||
@@ -122,7 +124,7 @@ proc module-addgroup { group } {
|
||||
debug "mode=remove: no orphan modules to unload"
|
||||
}
|
||||
debug "mode=remove: $env(MODULEPATH)"
|
||||
foreach overlay $::OverlayList {
|
||||
foreach overlay $::UsedOverlays {
|
||||
set dir [file join \
|
||||
$overlay \
|
||||
$group \
|
||||
@@ -325,22 +327,22 @@ proc ModulesHelp { } {
|
||||
#
|
||||
proc _find_overlay { modulefile_components } {
|
||||
debug "_find_overlay()"
|
||||
foreach ol $::OverlayList {
|
||||
foreach ol $::UsedOverlays {
|
||||
debug "$ol"
|
||||
set ol_dir $::OverlayDict(${ol}:mod_root)
|
||||
if { [string range $ol_dir end end] == "/" } {
|
||||
set ol_dir [string range $ol_dir 0 end-1]
|
||||
set ol_mod_root $::OverlayInfo(${ol}:mod_root)
|
||||
if { [string range $ol_mod_root end end] == "/" } {
|
||||
set ol_mod_root [string range $ol_mod_root 0 end-1]
|
||||
}
|
||||
debug "$ol_dir"
|
||||
set ol_dir_splitted [file split $ol_dir]
|
||||
debug "$ol_mod_root"
|
||||
set ol_mod_root_splitted [file split $ol_mod_root]
|
||||
set modulefile_root [file join \
|
||||
{*}[lrange \
|
||||
$modulefile_components \
|
||||
0 [expr [llength $ol_dir_splitted] - 1]]]
|
||||
0 [expr [llength $ol_mod_root_splitted] - 1]]]
|
||||
debug "$modulefile_root"
|
||||
if { [string compare $ol_dir $modulefile_root] == 0 } {
|
||||
debug "$ol_dir_splitted"
|
||||
return $ol_dir_splitted
|
||||
if { [string compare $ol_mod_root $modulefile_root] == 0 } {
|
||||
debug "$ol_mod_root_splitted"
|
||||
return $ol_mod_root_splitted
|
||||
}
|
||||
}
|
||||
debug "not found"
|
||||
@@ -372,8 +374,8 @@ proc _pmodules_init_global_vars { } {
|
||||
|
||||
set modulefile_splitted [file split $::ModulesCurrentModulefile]
|
||||
|
||||
set ol_dir_splitted [_find_overlay ${modulefile_splitted}]
|
||||
set rel_modulefile [lrange $modulefile_splitted [llength $ol_dir_splitted] end]
|
||||
set ol_mod_root_splitted [_find_overlay ${modulefile_splitted}]
|
||||
set rel_modulefile [lrange $modulefile_splitted [llength $ol_mod_root_splitted] end]
|
||||
set group [lindex $rel_modulefile 0]
|
||||
set GROUP "${group}"
|
||||
set name [lindex $modulefile_splitted end-1]
|
||||
@@ -384,11 +386,11 @@ proc _pmodules_init_global_vars { } {
|
||||
set V_RELEASE [lindex [split $tmp _] 0]
|
||||
lassign [split $V_PKG .] V_MAJOR V_MINOR V_PATCHLVL
|
||||
set variant [lrange $rel_modulefile 2 end]
|
||||
set mod_root [file join {*}$ol_dir_splitted]
|
||||
set mod_root [file join {*}$ol_mod_root_splitted]
|
||||
debug "mod_root=$mod_root"
|
||||
set ol $::Dir2OverlayMap($mod_root)
|
||||
debug "ol=$ol"
|
||||
set install_prefix [file split $::OverlayDict(${ol}:inst_root)]
|
||||
set install_prefix [file split $::OverlayInfo(${ol}:inst_root)]
|
||||
set prefix "$install_prefix $group [lreverse_n $variant 2]"
|
||||
set PREFIX [file join {*}$prefix]
|
||||
debug "PREFIX=$PREFIX"
|
||||
|
||||
+1088
-1016
File diff suppressed because it is too large
Load Diff
@@ -1,24 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
eval "pbuild::pre_prep_${system}() { :; }"
|
||||
eval "pbuild::pre_prep_${OS}() { :; }"
|
||||
eval "pbuild::post_prep_${system}() { :; }"
|
||||
eval "pbuild::post_prep_${OS}() { :; }"
|
||||
|
||||
eval "pbuild::add_patch_${system}() { pbuild::add_patch \"\$@\"; }"
|
||||
eval "pbuild::add_patch_${OD}() { pbuild::add_patch \"\$@\"; }"
|
||||
|
||||
eval "pbuild::pre_configure_${system}() { :; }"
|
||||
eval "pbuild::pre_configure_${OS}() { :; }"
|
||||
eval "pbuild::post_configure_${system}() { :; }"
|
||||
eval "pbuild::post_configure_${OS}() { :; }"
|
||||
|
||||
eval "pbuild::pre_compile_${system}() { :; }"
|
||||
eval "pbuild::pre_compile_${OS}() { :; }"
|
||||
eval "pbuild::post_compile_${system}() { :; }"
|
||||
eval "pbuild::post_compile_${OS}() { :; }"
|
||||
|
||||
eval "pbuild::pre_install_${system}() { :; }"
|
||||
eval "pbuild::pre_install_${OS}() { :; }"
|
||||
eval "pbuild::post_install_${system}() { :; }"
|
||||
eval "pbuild::post_install_${OS}() { :; }"
|
||||
@@ -8,9 +8,14 @@ declare -A Options=()
|
||||
declare -A Help=()
|
||||
|
||||
declare -a Overlays=()
|
||||
declare -A OverlayDict
|
||||
declare -a OverlayList
|
||||
declare -Ag Dir2OverlayMap
|
||||
declare -A OverlayInfo
|
||||
declare -a UsedOverlays
|
||||
declare -A Dir2OverlayMap
|
||||
|
||||
declare -r ol_normal='n'
|
||||
declare -r ol_hiding='h'
|
||||
declare -r ol_replacing='r'
|
||||
|
||||
|
||||
# initialize help text of 'module --version'
|
||||
Help['version']="
|
||||
@@ -33,33 +38,42 @@ print_help() {
|
||||
# $1: absolute path of a modulefile directory
|
||||
#
|
||||
compute_group_depth () {
|
||||
local -r dir=$1
|
||||
test -d "${dir}" || return 1
|
||||
local -n result="$1"
|
||||
local -r dir="$2"
|
||||
if [[ ! -d "${dir}" ]]; then
|
||||
${mkdir} -p "${dir}" || \
|
||||
std::die 1 "Cannot create directory -- ${dir}"
|
||||
fi
|
||||
local group=${dir%/*}
|
||||
local group=${group##*/}
|
||||
[[ -n "${GroupDepths[${group}]}" ]] && return 0
|
||||
local -i depth=$(${find} "${dir}" -depth \( -type f -o -type l \) \
|
||||
result=$(${find} "${dir}" -depth \( -type f -o -type l \) \
|
||||
-printf "%d" -quit 2>/dev/null)
|
||||
(( depth-=2 ))
|
||||
(( result-=2 ))
|
||||
# if a group doesn't contain a modulefile, depth is negativ
|
||||
# :FIXME: better solution?
|
||||
(( depth < 0 )) && (( depth = 0 ))
|
||||
GroupDepths[$group]=${depth}
|
||||
(( result < 0 )) && (( result = 0 ))
|
||||
}
|
||||
|
||||
#
|
||||
# (Re-)Scan available groups in given overlays and compute group depth's
|
||||
#
|
||||
# Args:
|
||||
# $1: array of overlays
|
||||
# $@: overlay names
|
||||
#
|
||||
scan_groups () {
|
||||
local ol
|
||||
local depth
|
||||
for ol in "$@"; do
|
||||
local mod_root="${OverlayDict[${ol}:mod_root]}"
|
||||
local moduledir
|
||||
for moduledir in ${mod_root}/*/${PMODULES_MODULEFILES_DIR}; do
|
||||
compute_group_depth "${moduledir}"
|
||||
local mod_root="${OverlayInfo[${ol}:mod_root]}"
|
||||
local dir
|
||||
for dir in ${mod_root}/*/${PMODULES_MODULEFILES_DIR}; do
|
||||
local group="${dir%/*}"
|
||||
group="${group##*/}"
|
||||
if [[ ! -v GroupDepths[${group}] ]]; then
|
||||
compute_group_depth depth "${dir}"
|
||||
GroupDepths[$group]=${depth}
|
||||
fi
|
||||
Dir2OverlayMap[${dir%/${PMODULES_MODULEFILES_DIR}*}]="${ol}"
|
||||
done
|
||||
done
|
||||
}
|
||||
@@ -73,17 +87,24 @@ pm::read_config(){
|
||||
#
|
||||
# Args:
|
||||
# $1 [upvar] result
|
||||
local -n fnames="$1"
|
||||
|
||||
# user defined via environment variable
|
||||
if [[ -v PMODULES_OVERLAYS_DEF ]]; then
|
||||
test -r "${PMODULES_OVERLAYS_DEF}" || \
|
||||
std::die 3 \
|
||||
"%s -- %s" \
|
||||
"overlay definition file is not readable" \
|
||||
"$_"
|
||||
config_files+=("${PMODULES_OVERLAYS_DEF}")
|
||||
fnames+=("${PMODULES_OVERLAYS_DEF}")
|
||||
fi
|
||||
|
||||
# user defined
|
||||
if [[ -r "${HOME}/.Pmodules/Pmodules.yaml" ]]; then
|
||||
config_files+=("${HOME}/.Pmodules/Pmodules.yaml")
|
||||
fnames+=("${HOME}/.Pmodules/Pmodules.yaml")
|
||||
fi
|
||||
|
||||
# system config file
|
||||
test -r "${PMODULES_HOME%%/Tools*}/config/Pmodules.yaml" || \
|
||||
std::die 3 \
|
||||
"%s %s -- %s" \
|
||||
@@ -91,14 +112,19 @@ pm::read_config(){
|
||||
"does not exist or is not readable" \
|
||||
"$_"
|
||||
|
||||
config_files+=("${PMODULES_HOME%%/Tools*}/config/Pmodules.yaml")
|
||||
fnames+=("${PMODULES_HOME%%/Tools*}/config/Pmodules.yaml")
|
||||
}
|
||||
|
||||
_get_ol_names(){
|
||||
${yq} -Ne eval-all '. as $item ireduce ({}; . *+ $item) |.Overlays|keys()' "${config_files[@]}" | awk '{print $2}'
|
||||
#
|
||||
# get the names of all overlays
|
||||
#
|
||||
local -n fnames="$1"
|
||||
${yq} -Ne eval-all '. as $item ireduce ({}; . *+ $item) |.Overlays|keys()' \
|
||||
"${fnames[@]}" | awk '{print $2}'
|
||||
}
|
||||
|
||||
_get_config_files
|
||||
_get_config_files config_files
|
||||
|
||||
eval $(std::parse_yaml "${config_files[-1]}" 'cfg_')
|
||||
[[ -v cfg_DefaultGroups ]] && DefaultGroups="${cfg_DefaultGroups}"
|
||||
@@ -106,14 +132,37 @@ pm::read_config(){
|
||||
[[ -v cfg_ReleaseStages ]] && ReleaseStages="${cfg_ReleaseStages}"
|
||||
unset ${!cfg_*}
|
||||
|
||||
Overlays=( $(_get_ol_names) )
|
||||
#
|
||||
# loop over all overlays and save config in OverlayInfo and Dir2OverlayMap
|
||||
#
|
||||
# - at least install_root must be specified
|
||||
# - modulefiles_root default so install_root
|
||||
# - the type defaults to ${ol_normal}
|
||||
#
|
||||
Overlays=( $(_get_ol_names config_files) )
|
||||
local ol=''
|
||||
for ol in "${Overlays[@]}"; do
|
||||
eval $(${yq} -Ne eval-all \
|
||||
". as \$item ireduce ({}; . *+ \$item) |.Overlays.${ol}" \
|
||||
"${config_files[@]}" | \
|
||||
sed 's/: /=/; s/\(.*\)/local \1/')
|
||||
: ${type:=n}
|
||||
|
||||
[[ -n ${install_root} ]] || \
|
||||
std::die 3 \
|
||||
"install_root missing for overlay -- ${ol}"
|
||||
[[ -d ${install_root} ]] || \
|
||||
std::die 3 \
|
||||
"Invalid installation root directory for overlay '${ol}' -- ${install_root}"
|
||||
OverlayInfo[${ol}:inst_root]="${install_root}"
|
||||
|
||||
: ${modulefiles_root:=${install_root}}
|
||||
[[ -d ${modulefiles_root} ]] || \
|
||||
std::die 3 \
|
||||
"Invalid modulefiles root directory for overlay '${ol}' -- ${modulefiles_root}"
|
||||
OverlayInfo[${ol}:mod_root]="${modulefiles_root}"
|
||||
Dir2OverlayMap[${modulefiles_root}]="${ol}"
|
||||
|
||||
: ${type:=${ol_normal}}
|
||||
case ${type} in
|
||||
${ol_normal} | ${ol_replacing} | ${ol_hiding} )
|
||||
:
|
||||
@@ -122,23 +171,9 @@ pm::read_config(){
|
||||
std::die 3 "Invalid type for overlay '${ol}' -- ${type}"
|
||||
;;
|
||||
esac
|
||||
OverlayDict[${ol}:type]="${type}"
|
||||
OverlayInfo[${ol}:type]="${type}"
|
||||
|
||||
: ${modulefiles_root:=${PMODULES_HOME%%/Tools*}}
|
||||
[[ -d ${modulefiles_root} ]] || \
|
||||
std::die 3 \
|
||||
"Invalid modulefiles root directory for overlay '${ol}' -- ${modulefiles_root}"
|
||||
: ${modulefiles_root:=${PMODULES_HOME%%/Tools*}}
|
||||
OverlayDict[${ol}:mod_root]="${modulefiles_root}"
|
||||
Dir2OverlayMap[${modulefiles_root}]="${ol}"
|
||||
|
||||
: ${install_root:=${PMODULES_HOME%%/Tools*}}
|
||||
[[ -d ${install_root} ]] || \
|
||||
std::die 3 \
|
||||
"Invalid installation root directory for overlay '${ol}' -- ${install_root}"
|
||||
OverlayDict[${ol}:inst_root]="${install_root:-${PMODULES_HOME%%/Tools*}}"
|
||||
|
||||
OverlayDict[${ol}:used]='no'
|
||||
OverlayInfo[${ol}:used]='no'
|
||||
unset type modulefiles_root install_root
|
||||
done
|
||||
}
|
||||
|
||||
+46
-44
@@ -20,7 +20,7 @@ std::error() {
|
||||
}
|
||||
|
||||
std::debug() {
|
||||
[[ ${PMODULES_DEBUG} ]] || return 0
|
||||
[[ -v PMODULES_DEBUG ]] || return 0
|
||||
std::log 2 "$@"
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ std::def_cmds(){
|
||||
local path="$1"
|
||||
shift
|
||||
for cmd in "$@"; do
|
||||
eval declare -g ${cmd}=$(PATH="${path}" which $cmd 2>/dev/null)
|
||||
eval declare -gr ${cmd}=$(PATH="${path}" /usr/bin/which $cmd 2>/dev/null)
|
||||
if [[ -z "${!cmd}" ]]; then
|
||||
std::die 255 "${cmd} not found"
|
||||
fi
|
||||
@@ -78,42 +78,42 @@ std::get_abspath() {
|
||||
}
|
||||
|
||||
std::append_path () {
|
||||
local -r P=$1
|
||||
local -r d=$2
|
||||
local -nr P="$1"
|
||||
shift 1
|
||||
local dir
|
||||
local dirs=''
|
||||
for dir in "$@"; do
|
||||
[[ "${P}" == @(|*:)${dir}@(|:*) ]] && continue
|
||||
dirs+=":${dir}"
|
||||
done
|
||||
|
||||
if ! echo ${!P} | egrep -q "(^|:)${d}($|:)" ; then
|
||||
if [[ -z ${!P} ]]; then
|
||||
export "$P=${d}"
|
||||
else
|
||||
export "$P=${!P}:${d}"
|
||||
fi
|
||||
fi
|
||||
if [[ -z ${P} ]]; then
|
||||
P="${dirs:1}" # remove leading ':'
|
||||
else
|
||||
P="${P}${dirs}"
|
||||
fi
|
||||
}
|
||||
|
||||
std::prepend_path () {
|
||||
local -r P="$1"
|
||||
local -nr P="$1"
|
||||
shift 1
|
||||
local new_path="$1"
|
||||
shift 1
|
||||
local dir
|
||||
|
||||
if [[ -z ${!P} ]]; then
|
||||
for dir in "$@"; do
|
||||
new_path+=":${dir}"
|
||||
done
|
||||
export "$P=${new_path}"
|
||||
local dir
|
||||
local dirs=''
|
||||
for dir in "$@"; do
|
||||
[[ "${P}" == @(|*:)${dir}@(|:*) ]] && continue
|
||||
dirs+="${dir}:"
|
||||
done
|
||||
|
||||
if [[ -z ${P} ]]; then
|
||||
P="${dirs:0:-1}" # remove trailing ':'
|
||||
else
|
||||
for dir in "$@"; do
|
||||
[[ "${!P}" == @(|*:)${dir}@(|:*) ]] && continue
|
||||
new_path+=":${dir}"
|
||||
done
|
||||
new_path+=":${!P}"
|
||||
P="${dirs}${P}"
|
||||
fi
|
||||
std::upvar "$P" "${new_path}"
|
||||
}
|
||||
|
||||
std::remove_path() {
|
||||
local -r P=$1
|
||||
local -nr P="$1"
|
||||
shift 1
|
||||
local -ar dirs="$@"
|
||||
local new_path=''
|
||||
@@ -125,8 +125,7 @@ std::remove_path() {
|
||||
[[ "${entry}" != "${dir}" ]] && new_path+=":${entry}"
|
||||
done
|
||||
done
|
||||
# remove leading ':'
|
||||
std::upvar "$P" "${new_path:1}"
|
||||
P="${new_path:1}" # remove leading ':'
|
||||
}
|
||||
|
||||
#
|
||||
@@ -176,22 +175,23 @@ std::replace_path () {
|
||||
# analog to std::split_abspath() with a relative path.
|
||||
#
|
||||
std::split_path() {
|
||||
local parts="$1"
|
||||
local -r path="$2"
|
||||
local -n parts="$1"
|
||||
local -r path="$2"
|
||||
|
||||
IFS='/'
|
||||
local std__split_path_result=( ${std__split_path_tmp} )
|
||||
unset IFS
|
||||
std::upvar ${parts} "${std__split_path_result[@]}"
|
||||
parts="${std__split_path_result[@]}"
|
||||
if (( $# >= 3 )); then
|
||||
# return number of parts
|
||||
std::upvar "$3" ${#std__split_path_result[@]}
|
||||
local -n num="$3"
|
||||
num="${#std__split_path_result[@]}"
|
||||
fi
|
||||
}
|
||||
|
||||
std::split_abspath() {
|
||||
local parts="$1"
|
||||
local -r path="$2"
|
||||
local -n parts="$1"
|
||||
local -r path="$2"
|
||||
if [[ "${path:0:1}" == '/' ]]; then
|
||||
local -r std__split_path_tmp="${path:1}"
|
||||
else
|
||||
@@ -201,16 +201,17 @@ std::split_abspath() {
|
||||
IFS='/'
|
||||
local std__split_path_result=( ${std__split_path_tmp} )
|
||||
unset IFS
|
||||
std::upvar ${parts} "${std__split_path_result[@]}"
|
||||
parts="${std__split_path_result[@]}"
|
||||
if (( $# >= 3 )); then
|
||||
# return number of parts
|
||||
std::upvar "$3" ${#std__split_path_result[@]}
|
||||
local -n num="$3"
|
||||
num="${#std__split_path_result[@]}"
|
||||
fi
|
||||
}
|
||||
|
||||
std::split_relpath() {
|
||||
local parts="$1"
|
||||
local -r path="$2"
|
||||
local -n parts="$1"
|
||||
local -r path="$2"
|
||||
if [[ "${path:0:1}" == '/' ]]; then
|
||||
std::die 255 "Oops: Internal error in '${FUNCNAME[0]}' called by '${FUNCNAME[1]}' }"
|
||||
else
|
||||
@@ -220,10 +221,11 @@ std::split_relpath() {
|
||||
IFS='/'
|
||||
local std__split_path_result=( ${std__split_path_tmp} )
|
||||
unset IFS
|
||||
std::upvar ${parts} "${std__split_path_result[@]}"
|
||||
parts="${std__split_path_result[@]}"
|
||||
if (( $# >= 3 )); then
|
||||
# return number of parts
|
||||
std::upvar "$3" ${#std__split_path_result[@]}
|
||||
local -n num="$3"
|
||||
num="${#std__split_path_result[@]}"
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -287,11 +289,11 @@ std::upvar() {
|
||||
}
|
||||
|
||||
std.get_os_release_linux() {
|
||||
local lsb_release=$(which lsb_release)
|
||||
#local lsb_release=$(which lsb_release)
|
||||
local ID=''
|
||||
local VERSION_ID=''
|
||||
|
||||
if [[ -n $(which lsb_release) ]]; then
|
||||
if [[ -n $(which lsb_release 2>/dev/null) ]]; then
|
||||
ID=$(lsb_release -is)
|
||||
VERSION_ID=$(lsb_release -rs)
|
||||
elif [[ -r '/etc/os-release' ]]; then
|
||||
@@ -322,7 +324,7 @@ std::get_os_release() {
|
||||
local -A func_map;
|
||||
func_map['Linux']=std.get_os_release_linux
|
||||
func_map['Darwin']=std.get_os_release_macos
|
||||
${func_map[${OS}]}
|
||||
${func_map[$(uname -s)]}
|
||||
}
|
||||
|
||||
std::get_type() {
|
||||
|
||||
+265
-183
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
#!@BASH@
|
||||
#
|
||||
# The following build specific variables are set and used in libpbuild.bash:
|
||||
# ARGS
|
||||
@@ -7,45 +7,59 @@
|
||||
#
|
||||
#.............................................................................
|
||||
|
||||
set -x
|
||||
declare VERSION='@PMODULES_VERSION@'
|
||||
|
||||
# get absolute path of script
|
||||
declare mydir=$(dirname "$0")
|
||||
declare -r mydir=$(cd ${mydir} && pwd -P)
|
||||
|
||||
# initialize PATH,
|
||||
# add library installation directories to the PATH,
|
||||
# so 'source' is able find them
|
||||
|
||||
if [[ $(uname -s) == 'Darwin' ]]; then
|
||||
PATH='/opt/local/bin:'
|
||||
else
|
||||
PATH=''
|
||||
fi
|
||||
PATH+='/usr/bin:/bin:/usr/sbin:/sbin'
|
||||
PATH+=":${mydir}"
|
||||
PATH+=":${mydir}/../lib:${mydir}/../config"
|
||||
PATH+=":${PMODULES_DIR}/libexec"
|
||||
|
||||
source libstd.bash || {
|
||||
source "${mydir}/../lib/libstd.bash" || {
|
||||
echo "Oops: cannot source library -- '$_'" 1>&2; exit 3;
|
||||
}
|
||||
|
||||
# can be set in the configuration file
|
||||
declare PMODULES_DISTFILESDIR=''
|
||||
declare PMODULES_TMPDIR=''
|
||||
declare pm_root="${PMODULES_HOME%%/Tools*}"
|
||||
##############################################################################
|
||||
#
|
||||
# check availability of used commands and set environment variables
|
||||
# cmd=$(which cmd)
|
||||
# in the following we use these environment variable to call binaries.
|
||||
#
|
||||
declare -r MODULECMD="${PMODULES_HOME}/bin/modulecmd"
|
||||
[[ -x ${MODULECMD} ]] || \
|
||||
std::die 1 "Oops: modulecmd binary not available!"
|
||||
|
||||
source libpbuild.bash || \
|
||||
std::def_cmds "${mydir}/../libexec" \
|
||||
'yq'
|
||||
|
||||
std::def_cmds '/usr/bin:/bin:/usr/sbin:/sbin' \
|
||||
'awk' 'base64' 'cat' 'cp' 'find' 'getopt' 'grep' \
|
||||
'install' 'logger' 'make' 'mkdir' 'mktemp' 'patch' 'pwd' \
|
||||
'rm' 'rmdir' 'sort' 'tar' 'tee' 'uname'
|
||||
|
||||
declare -r OS="$(${uname} -s)"
|
||||
if [[ ${OS} == 'Darwin' ]]; then
|
||||
std::def_cmds '/usr/bin:/bin:/usr/sbin:/sbin:/opt/local/bin' \
|
||||
'curl' 'otool' 'shasum' 'sysctl'
|
||||
declare -r sha256sum="${shasum -a 256}"
|
||||
else
|
||||
std::def_cmds '/usr/bin:/bin:/usr/sbin:/sbin' \
|
||||
'ldd' 'curl' 'sha256sum'
|
||||
fi
|
||||
|
||||
# for the time being, we still set PATH. Just in case we forgot a binary
|
||||
PATH='/usr/bin:/bin:/usr/sbin:/sbin'
|
||||
|
||||
##############################################################################
|
||||
source "${mydir}/../lib/libpbuild.bash" || \
|
||||
std::die 3 "Oops: cannot source library -- '$_'"
|
||||
source libpmodules.bash || \
|
||||
source "${mydir}/../lib/libpmodules.bash" || \
|
||||
std::die 3 "Oops: cannot source library -- '$_'"
|
||||
|
||||
# save arguments, (still) required for building dependencies
|
||||
declare -r ARGS="$@"
|
||||
|
||||
shopt -s nocaseglob
|
||||
shopt -s extglob
|
||||
##############################################################################
|
||||
set -o nounset
|
||||
shopt -s nocaseglob
|
||||
shopt -s extglob
|
||||
shopt -s nullglob
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
@@ -145,10 +159,13 @@ MISCELLANEOUS OPTIONS:
|
||||
# then configuration file
|
||||
# last default
|
||||
|
||||
# save arguments, required for building dependencies
|
||||
declare -r ARGS="$@"
|
||||
declare PMODULES_DISTFILESDIR=''
|
||||
declare PMODULES_TMPDIR=''
|
||||
|
||||
# versions to be build, '.*' or none means all
|
||||
declare -a versions=()
|
||||
declare opt_bootstrap='no'
|
||||
declare opt_build_config='Pmodules.yaml'
|
||||
declare opt_build_target='all'
|
||||
declare opt_dry_run='no'
|
||||
declare opt_enable_cleanup_build='yes'
|
||||
@@ -157,12 +174,12 @@ declare opt_force_rebuild='no'
|
||||
declare -i opt_jobs=0
|
||||
declare opt_update_modulefiles='no'
|
||||
declare opt_system=''
|
||||
declare opt_overlay=''
|
||||
declare opt_verbose='no'
|
||||
# array collecting all modules specified on the command line via '--with=module'
|
||||
declare -a opt_with_modules=()
|
||||
|
||||
declare opt_ol_name_or_dir=''
|
||||
|
||||
declare BUILD_SCRIPT=''
|
||||
|
||||
parse_args() {
|
||||
while (( $# > 0 )); do
|
||||
@@ -193,13 +210,6 @@ parse_args() {
|
||||
--dry-run )
|
||||
opt_dry_run='yes'
|
||||
;;
|
||||
--config )
|
||||
opt_build_config="$2"
|
||||
shift 1
|
||||
;;
|
||||
--config=* )
|
||||
opt_build_config="${1#*=}"
|
||||
;;
|
||||
--enable-cleanup )
|
||||
opt_enable_cleanup_build='yes'
|
||||
opt_enable_cleanup_src='yes'
|
||||
@@ -220,19 +230,21 @@ parse_args() {
|
||||
--disable-cleanup-src )
|
||||
opt_enable_cleanup_src='no'
|
||||
;;
|
||||
--distdir )
|
||||
PMODULES_DISTFILESDIR="$2"
|
||||
shift
|
||||
--distdir | --distdir=* )
|
||||
if [[ $1 == *=* ]]; then
|
||||
PMODULES_DISTFILESDIR="${1/--distdir=}"
|
||||
else
|
||||
PMODULES_DISTFILESDIR="$2"
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
--distdir=* )
|
||||
PMODULES_DISTFILESDIR="${1/--distdir=}"
|
||||
;;
|
||||
--tmpdir )
|
||||
PMODULES_TMPDIR="$2"
|
||||
shift
|
||||
;;
|
||||
--tmpdir=* )
|
||||
PMODULES_TMPDIR="${1/--tmpdir=}"
|
||||
--tmpdir | --tmpdir=* )
|
||||
if [[ $1 == *=* ]]; then
|
||||
PMODULES_TMPDIR="${1#--*=}"
|
||||
else
|
||||
PMODULES_TMPDIR="$2"
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
--system | --system=* )
|
||||
if [[ $1 == *=* ]]; then
|
||||
@@ -250,27 +262,25 @@ parse_args() {
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
--use-flags )
|
||||
USE_FLAGS="y:$2:"
|
||||
shift
|
||||
--use-flags | --use-flags=* )
|
||||
if [[ $1 == *=* ]]; then
|
||||
USE_FLAGS=":${1#--*=}:"
|
||||
else
|
||||
USE_FLAGS=":$2:"
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
--use-flags=* )
|
||||
USE_FLAGS=":${1/--use-flags=}:"
|
||||
;;
|
||||
--with )
|
||||
opt_with_modules+=( "$2" )
|
||||
shift
|
||||
;;
|
||||
--with=*/* )
|
||||
m="${1/--with=}"
|
||||
opt_with_modules+=( ${m} )
|
||||
--with | --with=*/* )
|
||||
if [[ $1 == *=* ]]; then
|
||||
opt_with_modules+=( "${1#--*=}" )
|
||||
else
|
||||
opt_with_modules+=( "$2" )
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
--prep | --configure | --compile | --install | --all )
|
||||
opt_build_target=${1:2}
|
||||
;;
|
||||
--bootstrap )
|
||||
opt_bootstrap='yes'
|
||||
;;
|
||||
--update-modulefiles )
|
||||
opt_update_modulefiles='yes'
|
||||
;;
|
||||
@@ -301,7 +311,17 @@ parse_args() {
|
||||
esac
|
||||
shift
|
||||
done
|
||||
[[ -n ${BUILD_SCRIPT} ]] || std::die 1 "No build-block specified!"
|
||||
if [[ -z ${BUILD_SCRIPT} ]]; then
|
||||
if [[ -r "${PWD}/build" ]]; then
|
||||
if grep -q '#!.* modbuild' "${PWD}/build"; then
|
||||
BUILD_SCRIPT="${PWD}/build"
|
||||
BUILDBLOCK_DIR=$(dirname "${BUILD_SCRIPT}")
|
||||
fi
|
||||
fi
|
||||
if [[ -z ${BUILD_SCRIPT} ]]; then
|
||||
std::die 1 "Don't know what to build!"
|
||||
fi
|
||||
fi
|
||||
(( ${#versions[@]} > 0)) || versions+=( '.*' )
|
||||
}
|
||||
|
||||
@@ -317,7 +337,7 @@ parse_args() {
|
||||
# "text gcc/10.3.0 openmpi/4.0.5"
|
||||
# "text gcc/10.3.0 openmpi/4.1.0"
|
||||
#
|
||||
brace_expand_with_prefix(){
|
||||
bash_expand(){
|
||||
local text="$1"
|
||||
shift
|
||||
local to_expand=( "${@}" )
|
||||
@@ -328,20 +348,13 @@ brace_expand_with_prefix(){
|
||||
eval list=( ${to_expand[0]} )
|
||||
local s
|
||||
for s in ${list[*]}; do
|
||||
brace_expand_with_prefix "${text} ${s}" "${to_expand[@]:1}"
|
||||
bash_expand "${text} ${s}" "${to_expand[@]:1}"
|
||||
done;
|
||||
fi;
|
||||
}
|
||||
|
||||
brace_expand(){
|
||||
brace_expand_with_prefix "" "$@"
|
||||
}
|
||||
|
||||
build_modules_legacy() {
|
||||
find_variants_files(){
|
||||
shopt -q nullglob || :
|
||||
local -i nullglob_set=$?
|
||||
shopt -s nullglob
|
||||
local files=( "${BUILDBLOCK_DIR}"/*/"${BNAME_VARIANTS}"\.${opt_system} )
|
||||
files+=( "${BUILDBLOCK_DIR}"/*/"${BNAME_VARIANTS}.$(uname -s)" )
|
||||
local f
|
||||
@@ -350,7 +363,6 @@ build_modules_legacy() {
|
||||
|| [[ -e "${f}.$(uname -s)" ]] \
|
||||
|| files+=( "$f" )
|
||||
done
|
||||
(( nullglob_set == 1 )) && shopt -u nullglob
|
||||
std::upvar "$1" "${files[@]}"
|
||||
}
|
||||
|
||||
@@ -361,7 +373,7 @@ build_modules_legacy() {
|
||||
[[ -z ${toks} ]] && continue
|
||||
[[ ${toke:0:1} == '#' ]] && continue
|
||||
local -a deps=( ${toks[*]:2} )
|
||||
brace_expand_with_prefix "${toks[0]} ${toks[1]}" "${deps[@]}"
|
||||
bash_expand "${toks[0]} ${toks[1]}" "${deps[@]}"
|
||||
done < "${input}"
|
||||
}
|
||||
|
||||
@@ -384,7 +396,7 @@ build_modules_legacy() {
|
||||
local m
|
||||
local pattern="/^${name}\/${version}[[:blank:]]/"
|
||||
for m in "${with_modules[@]}"; do
|
||||
if [[ -n $(awk "/${m%/*}[\/ ]/" "${files[@]}") ]]; then
|
||||
if [[ -n $(${awk} "/${m%/*}[\/ ]/" "${files[@]}") ]]; then
|
||||
pattern+=" && /${m//\//\\/}/"
|
||||
fi
|
||||
done
|
||||
@@ -394,7 +406,7 @@ build_modules_legacy() {
|
||||
local line=''
|
||||
while read line; do
|
||||
variants+=( "${line}" )
|
||||
done < <(expand_variants_file "${f}" | awk "${pattern}")
|
||||
done < <(expand_variants_file "${f}" | ${awk} "${pattern}")
|
||||
done
|
||||
if (( ${#variants[@]} == 0 )); then
|
||||
std::info "%s " \
|
||||
@@ -410,9 +422,9 @@ build_modules_legacy() {
|
||||
std::die 10 "Aborting..."
|
||||
fi
|
||||
declare ol_name='base'
|
||||
declare ol_type=''
|
||||
declare ol_dir="${pm_root}"
|
||||
declare ol_install_dir="${pm_root}"
|
||||
declare ol_type='n'
|
||||
declare ol_mod_root="${PMODULES_HOME%%/Tools*}"
|
||||
declare ol_inst_root="${PMODULES_HOME%%/Tools*}"
|
||||
local -i i=0
|
||||
local -i num_variants=${#variants[@]}
|
||||
for ((i = 0; i < num_variants; i++)); do
|
||||
@@ -428,106 +440,195 @@ build_modules_legacy() {
|
||||
}
|
||||
|
||||
build_modules_yaml(){
|
||||
local variants_file="${BUILDBLOCK_DIR}/files/"
|
||||
variants_file+="${BNAME_VARIANTS}.${opt_system}.yaml"
|
||||
local -a fnames=()
|
||||
local -A mod_overlays=()
|
||||
|
||||
#
|
||||
# $1 file name
|
||||
# $2 module name
|
||||
# $3 index
|
||||
#
|
||||
yaml_get_overlay(){
|
||||
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'
|
||||
}
|
||||
fnames+=( "${BUILDBLOCK_DIR}/files/${BNAME_VARIANTS}.${opt_system}.yaml" )
|
||||
fnames+=( "${BUILDBLOCK_DIR}/files/${BNAME_VARIANTS}.yaml" )
|
||||
fnames+=( '__zzzzz__' )
|
||||
for fname in "${fnames[@]}"; do
|
||||
[[ -r "${fname}" ]] && break
|
||||
done
|
||||
[[ ${fname} == '__zzzzz__' ]] && \
|
||||
std::die 3 "No suitable YAML variants file found"
|
||||
echo "Using ${fname}..."
|
||||
yaml_get_versions(){
|
||||
yq e ".$2.variants[].version" "$1"
|
||||
local -n _result="$1"
|
||||
local fname="$2"
|
||||
local version="$3"
|
||||
_result=( $(${yq} -Ne e \
|
||||
"with_entries(select(.key | test(\"^${version}\$\")))|keys" \
|
||||
"${fname}" 2>/dev/null | ${awk} '{print $2}') )
|
||||
}
|
||||
|
||||
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"
|
||||
local -n _result="$1"
|
||||
local fname="$2"
|
||||
local version="$3"
|
||||
_result=$(${yq} -Ne e ".\"${version}\"|length" \
|
||||
"${fname}" 2>/dev/null)
|
||||
if (( $? != 0 )); then
|
||||
_result=0
|
||||
fi
|
||||
}
|
||||
|
||||
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 -n _result="$1"
|
||||
local fname="$2"
|
||||
local version="$3"
|
||||
local idx="$4"
|
||||
_result=$(${yq} -Ne e ".\"${version}\"[${idx}].relstage" \
|
||||
"${fname}" 2>/dev/null)
|
||||
(( $? == 0 )) && return
|
||||
_result=$(${yq} -Ne e ".relstage" "${fname}" 2>/dev/null)
|
||||
(( $? == 0 )) && return
|
||||
_result='unstable'
|
||||
}
|
||||
|
||||
local name="$1"
|
||||
yaml_get_overlay(){
|
||||
local -n _result="$1"
|
||||
local fname="$2"
|
||||
local version="$3"
|
||||
local idx="$4"
|
||||
_result=$(${yq} -Ne e ".\"${version}\"[${idx}].overlay" \
|
||||
"${fname}" 2>/dev/null)
|
||||
(( $? == 0 )) && return
|
||||
_result=$(${yq} -Ne e ".overlay" "${fname}" 2>/dev/null)
|
||||
(( $? == 0 )) && return
|
||||
_result='base'
|
||||
}
|
||||
|
||||
yaml_get_systems(){
|
||||
local -n _result="$1"
|
||||
local fname="$2"
|
||||
local version="$3"
|
||||
local idx="$4"
|
||||
_result=$(${yq} -Ne e ".\"${version}\"[${idx}].systems" \
|
||||
"${fname}" 2>/dev/null)
|
||||
(( $? == 0 )) && return
|
||||
_result=$(${yq} -Ne e ".systems" "${fname}" 2>/dev/null)
|
||||
(( $? == 0 )) && return
|
||||
_result='any'
|
||||
}
|
||||
|
||||
yaml_get_dependencies(){
|
||||
local -n _result="$1"
|
||||
local fname="$2"
|
||||
local version="$3"
|
||||
local idx="$4"
|
||||
_result=( $(${yq} -Ne e ".\"${version}\"[${idx}]|(.with, .dependencies)" \
|
||||
"${fname}" 2>/dev/null) )
|
||||
if (( $? != 0 )); then
|
||||
# neither .with nor .dependencies are set
|
||||
_result=()
|
||||
return
|
||||
fi
|
||||
# if one of .with, .dependencies is not set, the vaulue is
|
||||
# returned as 'null'.
|
||||
local -i i
|
||||
for i in "${!_result[@]}"; do
|
||||
[[ ${_result[$i]} == 'null' ]] && unset -v '_result[$i]'
|
||||
done
|
||||
_result=("${_result[@]}")
|
||||
}
|
||||
|
||||
yaml_get_build_requirements(){
|
||||
local -n _result="$1"
|
||||
local fname="$2"
|
||||
local version="$3"
|
||||
local idx="$4"
|
||||
_result=( $(${yq} -Ne e ".\"${version}\"[${idx}].build_requires" \
|
||||
"${fname}" 2>/dev/null) )
|
||||
if (( $? != 0 )); then
|
||||
_result=()
|
||||
return
|
||||
fi
|
||||
}
|
||||
|
||||
local name="$1"
|
||||
local version="$2"
|
||||
shift 2
|
||||
local with_modules=( $* )
|
||||
|
||||
# pattern used in the for-loop to filter dependencies via awk
|
||||
local m
|
||||
local pattern="//"
|
||||
for m in "${with_modules[@]}"; do
|
||||
pattern+=" && /${m//\//\\/}( |$)/"
|
||||
pattern+=" && /${m//\//\\/}/"
|
||||
done
|
||||
|
||||
local -i n_variants=$(yaml_get_num_variants \
|
||||
"${variants_file}" "${name}")
|
||||
local i
|
||||
for (( i=0; i<n_variants; i++ )); do
|
||||
local vers=$(yaml_get_version "${variants_file}" "${name}" $i)
|
||||
[[ "${vers}" != "${version}" ]] && continue
|
||||
# check dependencies
|
||||
local with_modules=()
|
||||
local -a deps=( $(yaml_get_dependencies \
|
||||
"${variants_file}" \
|
||||
"${name}" "$i") )
|
||||
if (( ${#deps[@]} > 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[@]}"
|
||||
local -a versions
|
||||
yaml_get_versions versions "${fname}" "${name}/${version}"
|
||||
for v in "${versions[@]}"; do
|
||||
local -i n_variants
|
||||
yaml_get_num_variants n_variants "${fname}" "${v}"
|
||||
(( n_variants == 0 )) && (( n_variants = 1 ))
|
||||
local -i i
|
||||
local -a deps=()
|
||||
local -a build_requires=()
|
||||
local relstage
|
||||
local ol_name
|
||||
for (( i=0; i<n_variants; i++)); do
|
||||
if [[ -z ${opt_overlay} ]]; then
|
||||
yaml_get_overlay ol_name "${fname}" "${v}" $i
|
||||
else
|
||||
ol_name="${opt_overlay}"
|
||||
fi
|
||||
if [[ ! -v OverlayInfo[${ol_name}:inst_root] ]]; then
|
||||
std::die 3 "Overlay is not defined -- ${ol_name}"
|
||||
fi
|
||||
mod_overlays[$i]="${ol_name}"
|
||||
done
|
||||
|
||||
for (( i=0; i<n_variants; i++)); do
|
||||
ol_name="${mod_overlays[$i]}"
|
||||
yaml_get_relstage relstage "${fname}" "${v}" $i
|
||||
yaml_get_dependencies deps "${fname}" "${v}" $i
|
||||
yaml_get_build_requirements build_requires "${fname}" "${v}" $i
|
||||
# :FIXME:
|
||||
# for the time being we prefix the build requirements
|
||||
# with 'b:' and append them to the other dependencies.
|
||||
# With this solution we don't have to change anything
|
||||
# else in the code but have better readable variant
|
||||
# files.
|
||||
deps+=("${build_requires[@]/#/b:}")
|
||||
declare ol_inst_root="${OverlayInfo[${ol_name}:inst_root]}"
|
||||
declare ol_mod_root="${OverlayInfo[${ol_name}:mod_root]}"
|
||||
|
||||
local systems
|
||||
yaml_get_systems systems "${fname}" "${v}" $i
|
||||
# build module if
|
||||
# - systems is any
|
||||
# - opt_system is listed in systems
|
||||
local build_it='no'
|
||||
if [[ "${systems}" == 'any' ]]; then
|
||||
build_it='yes'
|
||||
fi
|
||||
if [[ ,${systems}, == *,${opt_system},* ]]; then
|
||||
build_it='yes'
|
||||
fi
|
||||
if [[ ${build_it} == 'no' ]]; then
|
||||
# we don't build, but we remember the overlay for
|
||||
# cleaning up the modulefiles later.
|
||||
continue
|
||||
fi
|
||||
if (( ${#deps[@]} > 0 )); then
|
||||
while read -a with_modules; do
|
||||
pbuild.build_module \
|
||||
"${name}" "${v##*/}" \
|
||||
"${relstage}" "${with_modules[@]}"
|
||||
done < <(bash_expand "" ${deps[@]}|${awk} "${pattern}")
|
||||
else
|
||||
pbuild.build_module \
|
||||
"${name}" "${v##*/}" \
|
||||
"${relstage}"
|
||||
fi
|
||||
done
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
build_modules() {
|
||||
local variants_file="${BUILDBLOCK_DIR}/files/${BNAME_VARIANTS}.${opt_system}"
|
||||
if [[ -e "${variants_file}.yaml" ]]; then
|
||||
if [[ -n $(ls "${BUILDBLOCK_DIR}/files/${BNAME_VARIANTS}"*.yaml 2>/dev/null) ]]; then
|
||||
build_modules_yaml "$@"
|
||||
else
|
||||
build_modules_legacy "$@"
|
||||
@@ -554,18 +655,14 @@ pbuild.verbose "${opt_verbose}"
|
||||
#
|
||||
# read configuration for modbuild
|
||||
#
|
||||
if [[ "${opt_bootstrap}" == 'yes' ]]; then
|
||||
test -d "${BUILDBLOCK_DIR}/../../config" && PATH+=":$_"
|
||||
fi
|
||||
pm::read_config
|
||||
|
||||
read_config_file "${pm_root}/${PMODULES_CONFIG_DIR}/${opt_build_config}"
|
||||
|
||||
# :FIXME: should go dist files to
|
||||
# :FIXME: should dist files go to
|
||||
# ${pm_root}/var/distfiles
|
||||
# or
|
||||
# ${overlay}/var/distfiles
|
||||
# ?
|
||||
: ${PMODULES_DISTFILESDIR:=${pm_root}/var/distfiles}
|
||||
: ${PMODULES_DISTFILESDIR:="${PMODULES_HOME%%/Tools*}/var/distfiles"}
|
||||
: ${PMODULES_TMPDIR:=/var/tmp/${USER}}
|
||||
|
||||
declare -r BUILD_SCRIPT
|
||||
@@ -575,21 +672,6 @@ declare -r BUILDBLOCK_DIR
|
||||
IFS=/ read -r -a fname <<< "${BUILD_SCRIPT:1}"
|
||||
module_name=${fname[${#fname[@]}-2]}
|
||||
|
||||
#
|
||||
# are we bootstrapping? If yes, go for it...
|
||||
#
|
||||
if [[ "${opt_bootstrap}" == 'yes' ]]; then
|
||||
declare ol_name='base'
|
||||
declare ol_type=''
|
||||
declare ol_dir="${pm_root}"
|
||||
declare ol_install_dir="${pm_root}"
|
||||
pbuild.bootstrap "${module_name}" "${versions[0]}" 'stable'
|
||||
exit $?
|
||||
fi
|
||||
|
||||
#
|
||||
# else
|
||||
#
|
||||
for version in "${versions[@]}"; do
|
||||
build_modules "${module_name}" "${version}" "${opt_with_modules[@]}"
|
||||
done
|
||||
|
||||
+139
-182
@@ -27,11 +27,10 @@ source "${libdir}/libpmodules.bash"
|
||||
|
||||
declare -r os_name="$(uname -s)"
|
||||
|
||||
path="/bin:/usr/bin"
|
||||
[[ ${os_name} == 'Darwin' ]] && path="${libexecdir}:${path}"
|
||||
path="${libexecdir}:/bin:/usr/bin"
|
||||
std::def_cmds "${path}" \
|
||||
'awk' 'base64' 'find' 'getopt' 'logger' 'mktemp' \
|
||||
'rm' 'sort' 'find' 'yq'
|
||||
'rm' 'sort' 'yq'
|
||||
|
||||
if [[ ${PMODULES_PURETCL} == yes ]]; then
|
||||
declare -r modulecmd="${libexecdir}/modulecmd.tcl"
|
||||
@@ -44,10 +43,6 @@ else
|
||||
declare -r modulecmd="${libexecdir}/modulecmd.bin"
|
||||
fi
|
||||
|
||||
declare -r ol_normal='n'
|
||||
declare -r ol_hiding='h'
|
||||
declare -r ol_replacing='r'
|
||||
|
||||
declare verbosity_lvl=${PMODULES_VERBOSITY:-'verbose'}
|
||||
|
||||
declare Shell=''
|
||||
@@ -131,16 +126,16 @@ save_env() {
|
||||
vars+=( ReleaseStages )
|
||||
vars+=( GroupDepths )
|
||||
vars+=( Overlays )
|
||||
vars+=( OverlayList )
|
||||
vars+=( OverlayDict Dir2OverlayMap)
|
||||
vars+=( UsedOverlays )
|
||||
vars+=( OverlayInfo Dir2OverlayMap)
|
||||
|
||||
local s=$(typeset -p ${vars[@]})
|
||||
declare -g PMODULES_ENV=$( encode_base64 "$s" )
|
||||
export_env 'PMODULES_ENV'
|
||||
declare -gx PMODULES_ENV=$( encode_base64 "$s" )
|
||||
}
|
||||
|
||||
_exit() {
|
||||
save_env "${g_env_must_be_saved}"
|
||||
export_env 'PMODULES_ENV'
|
||||
if [[ -n "${tmpfile}" ]] && [[ -e "${tmpfile}" ]]; then
|
||||
${rm} -f "${tmpfile}" || :
|
||||
fi
|
||||
@@ -148,34 +143,11 @@ _exit() {
|
||||
|
||||
trap '_exit' EXIT
|
||||
|
||||
#
|
||||
# map a moduledir to an overlay
|
||||
#
|
||||
# Args:
|
||||
# $1 upvar for overlay
|
||||
# $2 moduledir
|
||||
#
|
||||
map_moduledir2ol_name() {
|
||||
local "$1"
|
||||
local moduledir="${2//+(\/)/\/}" # replace multpile '/' with one
|
||||
moduledir="${moduledir/%\/}" # remove trailing slash if exist
|
||||
|
||||
if [[ ! -v Dir2OverlayMap[${moduledir}] ]]; then
|
||||
local ol
|
||||
for ol in "${OverlayList[@]}" 'other'; do
|
||||
local mod_root="${OverlayDict[${ol}:mod_root]}"
|
||||
[[ ${moduledir} == ${mod_root}/* ]] && break
|
||||
done
|
||||
Dir2OverlayMap[${moduledir}]="${ol}"
|
||||
fi
|
||||
std::upvar $1 "${Dir2OverlayMap[${moduledir}]}"
|
||||
}
|
||||
|
||||
#
|
||||
# get release stage of module
|
||||
# Note:
|
||||
# - the release stage of a module outside ${OverlayDict[@]} is always 'stable'
|
||||
# - the release stage of a module inside ${OverlayDict[@]} without a
|
||||
# - the release stage of a module outside ${OverlayInfo[@]} is always 'stable'
|
||||
# - the release stage of a module inside ${OverlayInfo[@]} without a
|
||||
# coresponding file is always 'unstable'
|
||||
#
|
||||
# Args:
|
||||
@@ -185,13 +157,10 @@ map_moduledir2ol_name() {
|
||||
#
|
||||
get_release_stage() {
|
||||
local "$1"
|
||||
local -r moduledir=$2
|
||||
local -r modulefile="$2/$3"
|
||||
local -r dir="$2"
|
||||
local -r modulefile="${dir}/$3"
|
||||
|
||||
local ol_name
|
||||
map_moduledir2ol_name ol_name "${moduledir}"
|
||||
|
||||
if [[ "${ol_name}" == 'other' ]]; then
|
||||
if [[ ! -v Dir2OverlayMap[${dir%/${PMODULES_MODULEFILES_DIR}*}] ]]; then
|
||||
std::upvar $1 'stable'
|
||||
return
|
||||
fi
|
||||
@@ -228,15 +197,14 @@ find_overlay () {
|
||||
local "$2"
|
||||
local path="${3//+(\/)/\/}" # replace multpile '/' with one
|
||||
path="${path/%\/}" # remove trailing slash if exist
|
||||
path="${path%/${PMODULES_MODULEFILES_DIR}*}"
|
||||
|
||||
[[ -v Dir2OverlayMap[${path}] ]] || return 1
|
||||
|
||||
local ol="${Dir2OverlayMap[${path}]}"
|
||||
map_moduledir2ol_name ol "${path}"
|
||||
std::upvar $1 "${ol}"
|
||||
|
||||
[[ "${ol}" == 'other' ]] && return 1
|
||||
|
||||
local group="${path#${OverlayDict[${ol}:mod_root]}/}"
|
||||
group=${group%%/*}
|
||||
local group="${path#${OverlayInfo[${ol}:mod_root]}/}"
|
||||
std::upvar $2 "${group}"
|
||||
return 0
|
||||
}
|
||||
@@ -501,8 +469,8 @@ subcommand_load() {
|
||||
local "$1"
|
||||
local -r group="$2/${PMODULES_MODULEFILES_DIR}"
|
||||
local ol
|
||||
for ol in "${OverlayList[@]}"; do
|
||||
local inst_root="${OverlayDict[${ol}:inst_root]}"
|
||||
for ol in "${UsedOverlays[@]}"; do
|
||||
local inst_root="${OverlayInfo[${ol}:inst_root]}"
|
||||
if [[ -d "${inst_root}/${group}" ]]; then
|
||||
std::upvar $1 "${ol}"
|
||||
return 0
|
||||
@@ -515,8 +483,10 @@ subcommand_load() {
|
||||
[[ -n ${group} ]] && [[ -n ${GroupDepths[${group}]} ]] && return 0
|
||||
local ol=''
|
||||
find_overlay_with_group ol "${group}" || return 1
|
||||
local moduledir="${OverlayDict[${ol}:mod_root]}/${group}/${PMODULES_MODULEFILES_DIR}"
|
||||
compute_group_depth "${moduledir}" || return 1
|
||||
local moduledir="${OverlayInfo[${ol}:mod_root]}/${group}/${PMODULES_MODULEFILES_DIR}"
|
||||
local -i depth
|
||||
compute_group_depth depth "${moduledir}" || return 1
|
||||
GroupDepths[${group}]=${depth}
|
||||
g_env_must_be_saved='yes'
|
||||
}
|
||||
|
||||
@@ -613,13 +583,11 @@ subcommand_load() {
|
||||
"${CMD}" "${subcommand}" \
|
||||
"illegal group name" \
|
||||
"${group}"
|
||||
MODULEPATH=""
|
||||
modulepath=()
|
||||
group+="${PMODULES_MODULEFILES_DIR}"
|
||||
for overlay in "${OverlayList[@]}"; do
|
||||
local mod_root="${OverlayDict[${overlay}:mod_root]}"
|
||||
MODULEPATH="${mod_root}/${group}/:${MODULEPATH}"
|
||||
modulepath=( "${mod_root}/${group}/" "${modulepath[@]}" )
|
||||
group+="/${PMODULES_MODULEFILES_DIR}"
|
||||
for overlay in "${UsedOverlays[@]}"; do
|
||||
local mod_root="${OverlayInfo[${overlay}:mod_root]}"
|
||||
modulepath=( "${mod_root}/${group}" "${modulepath[@]}" )
|
||||
done
|
||||
fi
|
||||
if [[ -n ${rel_stage} ]]; then
|
||||
@@ -720,9 +688,11 @@ subcommand_load() {
|
||||
LOADEDMODULES="${_LMFILES_}"
|
||||
local dir
|
||||
while read dir; do
|
||||
# if the first or last character of MODULEPATH is ':',
|
||||
# we read an empty string.
|
||||
[[ -z ${dir} ]] && continue
|
||||
[[ "${dir: -1}" == "/" ]] || dir+="/"
|
||||
LOADEDMODULES="${LOADEDMODULES//${dir}}"
|
||||
map_moduledir2ol_name overlay "${dir}"
|
||||
done <<< "${MODULEPATH//:/$'\n'}"
|
||||
g_env_must_be_saved='yes'
|
||||
export_env 'LOADEDMODULES'
|
||||
@@ -909,6 +879,12 @@ subcommand_show() {
|
||||
# Find all modules in a given modulepath matching a specific string.
|
||||
# The search can be restricted to certain release stages.
|
||||
#
|
||||
# Args:
|
||||
# $1 upvar for results
|
||||
# $2 search pattern
|
||||
# $3 release stages
|
||||
# $4... module directories
|
||||
#
|
||||
# return list like
|
||||
# modulename_1 rel_stage_1 modulefile_1 ...
|
||||
#
|
||||
@@ -931,8 +907,8 @@ get_available_modules() {
|
||||
# - after loading the parent of a hierarchical group
|
||||
# - if we do a search
|
||||
# - if we create a new hierarchical group
|
||||
local ol
|
||||
local group
|
||||
local ol=''
|
||||
local group=''
|
||||
find_overlay ol group "${dir}"
|
||||
|
||||
# if no modules are installed in ${dir}, '*' expands to
|
||||
@@ -941,6 +917,7 @@ get_available_modules() {
|
||||
# implementations.
|
||||
local entries=$(echo *)
|
||||
[[ -n ${entries} ]] || continue
|
||||
local mod='' # module_name/module_version
|
||||
while read mod; do
|
||||
local add='no'
|
||||
if [[ -n "${ol}" ]]; then
|
||||
@@ -953,7 +930,7 @@ get_available_modules() {
|
||||
local name="${mod%/*}"
|
||||
local key="${dir##/${PMODULES_MODULEFILES_DIR}}/${name}"
|
||||
if [[ -z "${modulenames[${key}]}" ]]; then
|
||||
if [[ "${OverlayDict[${ol}:type]}" == "${ol_hiding}" ]]; then
|
||||
if [[ "${OverlayInfo[${ol}:type]}" == "${ol_hiding}" ]]; then
|
||||
modulenames[${key}]="${ol}"
|
||||
else
|
||||
modulenames[${key}]='0'
|
||||
@@ -976,7 +953,7 @@ get_available_modules() {
|
||||
"${mod}"
|
||||
[[ :${used_rel_stages}: =~ :${rel_stage}: ]] || continue
|
||||
|
||||
mods+=( "${mod}" ${rel_stage} "${dir}/${mod}" )
|
||||
mods+=( "${mod}" ${rel_stage} "${dir}/${mod}" "${ol}" )
|
||||
dict[${mod}]=1
|
||||
done < <(${find} -L ${entries} \
|
||||
\( -type f -o -type l \) \
|
||||
@@ -1044,12 +1021,18 @@ find_module() {
|
||||
# no version has been specified. This makes it more
|
||||
# difficult. We have to load the newest version taking
|
||||
# the used release stages and flags into account.
|
||||
|
||||
# get list of reverse sorted version numbers
|
||||
(( col += ${#module} + 1 ))
|
||||
modules=( $(${find} -L "${dir}" -type f -not -name ".*" \
|
||||
-ipath "${dir}/${module}/*" \
|
||||
| cut -b${col}- \
|
||||
| sort -rV ) )
|
||||
# prepend module name
|
||||
modules=( "${modules[@]/#/${module}/}" )
|
||||
|
||||
# now modules contains a reverse sorted list of
|
||||
# available modules in the form name/version
|
||||
for mod in "${modules[@]}"; do
|
||||
#
|
||||
# loop over all used flags. If a module with
|
||||
@@ -1063,7 +1046,7 @@ find_module() {
|
||||
"${dir}" \
|
||||
"${mod}"
|
||||
std::upvar $2 "${rel_stage}"
|
||||
[[ :${release}: =~ :${UsedReleaseStages}: ]] && \
|
||||
[[ :${rel_stage}: =~ :${UsedReleaseStages}: ]] && \
|
||||
return 0
|
||||
done
|
||||
done
|
||||
@@ -1134,7 +1117,7 @@ subcommand_avail() {
|
||||
terse_output() {
|
||||
output_header "$1"
|
||||
local -i i=0
|
||||
for (( i=0; i<${#mods[@]}; i+=3 )); do
|
||||
for (( i=0; i<${#mods[@]}; i+=4 )); do
|
||||
local mod=${mods[i]}
|
||||
local rel_stage=${mods[i+1]}
|
||||
case ${rel_stage} in
|
||||
@@ -1152,7 +1135,7 @@ subcommand_avail() {
|
||||
|
||||
#......................................................................
|
||||
machine_output() {
|
||||
for (( i=0; i<${#mods[@]}; i+=3 )); do
|
||||
for (( i=0; i<${#mods[@]}; i+=4 )); do
|
||||
printf "%-20s\t%s\n" "${mods[i]}" "${mods[i+1]}" 1>&2
|
||||
done
|
||||
}
|
||||
@@ -1161,7 +1144,7 @@ subcommand_avail() {
|
||||
# :FIXME: for the time being, this is the same as terse_output!
|
||||
long_output() {
|
||||
output_header "$1"
|
||||
for (( i=0; i<${#mods[@]}; i+=3 )); do
|
||||
for (( i=0; i<${#mods[@]}; i+=4 )); do
|
||||
local mod=${mods[i]}
|
||||
local rel_stage=${mods[i+1]}
|
||||
case ${rel_stage} in
|
||||
@@ -1184,7 +1167,7 @@ subcommand_avail() {
|
||||
local -a available_modules=()
|
||||
local mod=''
|
||||
local -i max_length=1
|
||||
for ((i=0; i<${#mods[@]}; i+=3)); do
|
||||
for ((i=0; i<${#mods[@]}; i+=4)); do
|
||||
if [[ ${verbosity_lvl} == 'verbose' ]]; then
|
||||
local rel_stage=${mods[i+1]}
|
||||
case ${rel_stage} in
|
||||
@@ -1355,10 +1338,10 @@ subcommand_use() {
|
||||
print_ol_info(){
|
||||
local only_used="$1"
|
||||
local ol=''
|
||||
for ol in "${OverlayList[@]}"; do
|
||||
[[ ${OverlayDict[${ol}:used]} == ${only_used} ]] || continue
|
||||
local inst_root="${OverlayDict[${ol}:inst_root]}"
|
||||
local mod_root="${OverlayDict[${ol}:mod_root]}"
|
||||
for ol in "${Overlays[@]}"; do
|
||||
[[ ${OverlayInfo[${ol}:used]} == ${only_used} ]] || continue
|
||||
local inst_root="${OverlayInfo[${ol}:inst_root]}"
|
||||
local mod_root="${OverlayInfo[${ol}:mod_root]}"
|
||||
local txt="\t${ol}"
|
||||
if [[ ${inst_root} == ${mod_root} ]]; then
|
||||
txt+="\n\t\t${inst_root}"
|
||||
@@ -1366,7 +1349,7 @@ subcommand_use() {
|
||||
txt+="\n\t\t${inst_root} (install root)"
|
||||
txt+="\n\t\t${mod_root} (modulefiles root)"
|
||||
fi
|
||||
case "${OverlayDict[${ol}:type]}" in
|
||||
case "${OverlayInfo[${ol}:type]}" in
|
||||
"${ol_hiding}" )
|
||||
txt+='\n\t\t(hiding modules with same name)'
|
||||
;;
|
||||
@@ -1445,7 +1428,7 @@ subcommand_use() {
|
||||
"modules are already loaded!"
|
||||
fi
|
||||
|
||||
if [[ ${OverlayDict[${ol_name}:used]} == 'yes' ]]; then
|
||||
if [[ ${OverlayInfo[${ol_name}:used]} == 'yes' ]]; then
|
||||
std::die 3 "%s %s: %s -- %s" \
|
||||
"${CMD}" "${subcommand}" \
|
||||
"overlay already in use" \
|
||||
@@ -1453,39 +1436,38 @@ subcommand_use() {
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [[ "${OverlayDict[${ol_name}:type]}" == "${ol_replacing}" ]]; then
|
||||
if [[ "${OverlayInfo[${ol_name}:type]}" == "${ol_replacing}" ]]; then
|
||||
# if this overlay replaces groups, we have
|
||||
# to remove the modules made available by
|
||||
# other overlays in these groups
|
||||
for group in ${UsedGroups//:/ }; do
|
||||
# is this group in the to be added overlay?
|
||||
local dir="${OverlayDict[${ol_name}:mod_root]}/"
|
||||
local dir="${OverlayInfo[${ol_name}:mod_root]}/"
|
||||
dir+="${group}/${PMODULES_MODULEFILES_DIR}"
|
||||
[[ -d "${dir}" ]] || continue # no
|
||||
|
||||
dir="/${group}/${PMODULES_MODULEFILES_DIR}"
|
||||
local -a dirs=()
|
||||
for ol in "${OverlayList[@]}"; do
|
||||
dirs+=( ${OverlayDict[${ol}:mod_root]}${dir} )
|
||||
for ol in "${UsedOverlays[@]}"; do
|
||||
dirs+=( ${OverlayInfo[${ol}:mod_root]}${dir} )
|
||||
done
|
||||
std::remove_path MODULEPATH "${dirs[@]}"
|
||||
done
|
||||
fi
|
||||
|
||||
scan_groups "${ol_name}"
|
||||
for group in ${UsedGroups//:/ }; do
|
||||
local dir="${OverlayDict[${ol_name}:mod_root]}/"
|
||||
local dir="${OverlayInfo[${ol_name}:mod_root]}/"
|
||||
dir+="${group}/${PMODULES_MODULEFILES_DIR}"
|
||||
if [[ -d "${dir}" ]]; then
|
||||
std::prepend_path MODULEPATH "${dir}"
|
||||
Dir2OverlayMap[${dir}]="${ol_name}"
|
||||
fi
|
||||
done
|
||||
|
||||
OverlayList=( "${ol_name}" "${OverlayList[@]}" )
|
||||
OverlayDict[${ol_name}:used]='yes'
|
||||
export_env OverlayList
|
||||
UsedOverlays=( "${ol_name}" "${UsedOverlays[@]}" )
|
||||
OverlayInfo[${ol_name}:used]='yes'
|
||||
export_env UsedOverlays
|
||||
g_env_must_be_saved='yes'
|
||||
scan_groups "${OverlayList[@]}"
|
||||
scan_groups "${UsedOverlays[@]}"
|
||||
}
|
||||
|
||||
#..............................................................
|
||||
@@ -1499,13 +1481,12 @@ subcommand_use() {
|
||||
fi
|
||||
std::append_path UsedGroups "$1"
|
||||
local ol_name
|
||||
for ol_name in "${OverlayList[@]}"; do
|
||||
local dir="${OverlayDict[${ol_name}:mod_root]}/$1/${PMODULES_MODULEFILES_DIR}"
|
||||
for ol_name in "${UsedOverlays[@]}"; do
|
||||
local dir="${OverlayInfo[${ol_name}:mod_root]}/$1/${PMODULES_MODULEFILES_DIR}"
|
||||
[[ -d "${dir}" ]] || continue
|
||||
|
||||
std::prepend_path MODULEPATH "${dir}"
|
||||
Dir2OverlayMap[${dir}]=${ol_name}
|
||||
[[ "${OverlayDict[${ol_name}:type]}" == "${ol_replacing}" ]] && break
|
||||
[[ "${OverlayInfo[${ol_name}:type]}" == "${ol_replacing}" ]] && break
|
||||
done
|
||||
}
|
||||
|
||||
@@ -1522,7 +1503,7 @@ subcommand_use() {
|
||||
UsedFlags+=( "${arg/flag=}" )
|
||||
return
|
||||
fi
|
||||
if [[ -v OverlayDict[${arg}:type] ]]; then
|
||||
if [[ -v OverlayInfo[${arg}:type] ]]; then
|
||||
use_overlay "${arg}"
|
||||
return 0
|
||||
fi
|
||||
@@ -1533,7 +1514,7 @@ subcommand_use() {
|
||||
if [[ ! -v GroupDepths[${arg}] ]]; then
|
||||
# this scan is required if a new group has been
|
||||
# create inside an used overlay
|
||||
scan_groups "${!OverlayDict[@]}"
|
||||
scan_groups "${UsedOverlays[@]}"
|
||||
g_env_must_be_saved='yes'
|
||||
fi
|
||||
if [[ -n ${GroupDepths[${arg}]} ]]; then
|
||||
@@ -1615,46 +1596,46 @@ subcommand_unuse() {
|
||||
"some modules are still loaded!"
|
||||
fi
|
||||
|
||||
[[ "${OverlayDict[ol_name]:mod_root}" == "${PMODULES_HOME%%/Tools*}" ]] && \
|
||||
[[ "${OverlayInfo[ol_name]:mod_root}" == "${PMODULES_HOME%%/Tools*}" ]] && \
|
||||
std::die 3 "%s %s: %s -- %s" \
|
||||
"${CMD}" "${subcommand}" \
|
||||
"cannot remove base overlay" \
|
||||
"${ol_name}"
|
||||
[[ ${OverlayDict[${ol_name}:used]} != 'yes' ]] && \
|
||||
[[ ${OverlayInfo[${ol_name}:used]} != 'yes' ]] && \
|
||||
std::die 3 "%s %s: %s -- %s" \
|
||||
"${CMD}" "${subcommand}" \
|
||||
"not an used overlay" \
|
||||
"${ol_name}"
|
||||
# make sure first index is '0' (it should, but you never know)
|
||||
OverlayList=( "${OverlayList[@]}" )
|
||||
[[ "${ol_name}" != "${OverlayList[0]}" ]] && \
|
||||
UsedOverlays=( "${UsedOverlays[@]}" )
|
||||
[[ "${ol_name}" != "${UsedOverlays[0]}" ]] && \
|
||||
std::die 3 "%s %s: %s %s -- %s" \
|
||||
"${CMD}" "${subcommand}" \
|
||||
"overlay cannot be removed since" \
|
||||
"it not on top of the stack" \
|
||||
"${ol_name}"
|
||||
|
||||
if [[ "${OverlayDict[${ol_name}:type]}" == "${ol_replacing}" ]]; then
|
||||
if [[ "${OverlayInfo[${ol_name}:type]}" == "${ol_replacing}" ]]; then
|
||||
# if this overlay hides groups, we have to re-add
|
||||
# the modules made available by other overlays
|
||||
local mod_root=${OverlayDict[${ol_name}:mod_root]}
|
||||
local mod_root=${OverlayInfo[${ol_name}:mod_root]}
|
||||
for group in ${UsedGroups//:/ }; do
|
||||
# is this group in the to be removed overlay?
|
||||
local dir="${mod_root}/${group}/${PMODULES_MODULEFILES_DIR}"
|
||||
[[ -d "${dir}" ]] || continue # no
|
||||
|
||||
dir="/${group}/${PMODULES_MODULEFILES_DIR}"
|
||||
std::prepend_path MODULEPATH "${OverlayList[@]/%/${dir}}"
|
||||
std::prepend_path MODULEPATH "${UsedOverlays[@]/%/${dir}}"
|
||||
done
|
||||
fi
|
||||
|
||||
OverlayDict[${ol_name}:used]='no'
|
||||
OverlayList=( "${OverlayList[@]:1}")
|
||||
OverlayInfo[${ol_name}:used]='no'
|
||||
UsedOverlays=( "${UsedOverlays[@]:1}")
|
||||
g_env_must_be_saved='yes'
|
||||
export_env OverlayList
|
||||
export_env UsedOverlays
|
||||
local dir
|
||||
for dir in "${modulepath[@]}"; do
|
||||
[[ "${dir}" =~ "${OverlayDict[${ol_name}:mod_root]}" ]] && \
|
||||
[[ "${dir}" =~ "${OverlayInfo[${ol_name}:mod_root]}" ]] && \
|
||||
std::remove_path MODULEPATH "${dir}"
|
||||
done
|
||||
}
|
||||
@@ -1678,7 +1659,7 @@ subcommand_unuse() {
|
||||
fi
|
||||
std::remove_path UsedGroups "${arg}"
|
||||
local overlay
|
||||
for overlay in "${OverlayList[@]}"; do
|
||||
for overlay in "${UsedOverlays[@]}"; do
|
||||
local dir="${overlay}/${arg}/${PMODULES_MODULEFILES_DIR}"
|
||||
std::remove_path MODULEPATH "${dir}"
|
||||
done
|
||||
@@ -1701,7 +1682,7 @@ subcommand_unuse() {
|
||||
done
|
||||
return
|
||||
fi
|
||||
if [[ -v OverlayDict[${arg}:type] ]]; then
|
||||
if [[ -v OverlayInfo[${arg}:type] ]]; then
|
||||
unuse_overlay "${arg}"
|
||||
return 0
|
||||
fi
|
||||
@@ -1796,12 +1777,11 @@ init_modulepath() {
|
||||
declare -gx MODULEPATH=''
|
||||
local group
|
||||
local ol
|
||||
for ol in "${OverlayList[@]}"; do
|
||||
for ol in "${UsedOverlays[@]}"; do
|
||||
for group in ${UsedGroups//:/ }; do
|
||||
local dir="${OverlayDict[${ol}:mod_root]}/${group}/${PMODULES_MODULEFILES_DIR}"
|
||||
local dir="${OverlayInfo[${ol}:mod_root]}/${group}/${PMODULES_MODULEFILES_DIR}"
|
||||
if [[ -d "${dir}" ]]; then
|
||||
std::prepend_path MODULEPATH "${dir}"
|
||||
Dir2OverlayMap[${dir}]="${ol}"
|
||||
fi
|
||||
done
|
||||
done
|
||||
@@ -1842,6 +1822,10 @@ pmodules_init() {
|
||||
done
|
||||
g_env_must_be_saved='yes'
|
||||
}
|
||||
init_overlay_vars() {
|
||||
declare -ag UsedOverlays=( 'base' )
|
||||
OverlayInfo['base:used']='yes'
|
||||
}
|
||||
|
||||
pm::read_config
|
||||
|
||||
@@ -1856,6 +1840,7 @@ pmodules_init() {
|
||||
init_overlay_vars
|
||||
init_modulepath
|
||||
init_manpath
|
||||
save_env
|
||||
export_env \
|
||||
LOADEDMODULES \
|
||||
_LMFILES_ \
|
||||
@@ -1910,13 +1895,15 @@ subcommand_purge() {
|
||||
|
||||
# is a Pmodule module loaded?
|
||||
# if yes, save name in variable 'pmodule'
|
||||
local pmodule=''
|
||||
# We also have to save PMODULES_HOME since it will be
|
||||
# unset while sourcing the shell's init script.
|
||||
IFS=':'
|
||||
local -a lmfiles=($_LMFILES_)
|
||||
unset IFS
|
||||
for f in "${lmfiles[@]}"; do
|
||||
if [[ $f == */${PMODULES_MODULEFILES_DIR}/Pmodules/* ]]; then
|
||||
pmodule="${f##*/${PMODULES_MODULEFILES_DIR}/}"
|
||||
local pm_home="${PMODULES_HOME}"
|
||||
local pmodule="${f##*/${PMODULES_MODULEFILES_DIR}/}"
|
||||
break;
|
||||
fi
|
||||
done
|
||||
@@ -1946,16 +1933,18 @@ subcommand_purge() {
|
||||
echo "${error}" 1>&2
|
||||
fi
|
||||
|
||||
if [[ -n "${pmodule}" ]]; then
|
||||
if [[ -v pmodule ]]; then
|
||||
# reload a previously loaded Pmodule module
|
||||
# stderr is redirected to /dev/null, otherwise
|
||||
# we may get output like
|
||||
# 'unstable module has been loaded'
|
||||
PMODULES_HOME="${pm_home}"
|
||||
export_env PMODULES_HOME
|
||||
subcommand_load "${pmodule}" 2> /dev/null
|
||||
fi
|
||||
init_modulepath
|
||||
|
||||
export_env MODULEPATH PMODULES_HOME
|
||||
export_env MODULEPATH
|
||||
}
|
||||
|
||||
##############################################################################
|
||||
@@ -2045,7 +2034,6 @@ subcommand_clear() {
|
||||
"no arguments allowed"
|
||||
fi
|
||||
pmodules_init
|
||||
export_env LOADEDMODULES MODULEPATH _LMFILES_
|
||||
}
|
||||
|
||||
##############################################################################
|
||||
@@ -2130,7 +2118,7 @@ subcommand_search() {
|
||||
local fmt=''
|
||||
|
||||
print_default() {
|
||||
fmt="%-${max_len_modulename}s %-10s %-12s %-s"
|
||||
fmt="%-${max_len_modulename}s %-10s %-12s %-12s %-s"
|
||||
if [[ ${opt_print_header} == 'yes' ]]; then
|
||||
func_print_header='print_header_default'
|
||||
else
|
||||
@@ -2141,7 +2129,7 @@ subcommand_search() {
|
||||
|
||||
print_header_default() {
|
||||
std::info ''
|
||||
std::info "${fmt}" "Module" "Rel.stage" "Group" "Requires"
|
||||
std::info "${fmt}" "Module" "Rel.stage" "Group" "Overlay" "Requires"
|
||||
std::info '-%.0s' $(seq 1 ${cols})
|
||||
}
|
||||
|
||||
@@ -2154,12 +2142,12 @@ subcommand_search() {
|
||||
std::info "${str}"
|
||||
}
|
||||
if [[ "${opt_wrap}" == 'no' ]]; then
|
||||
local deps="${@:5}"
|
||||
local str=$(printf "${fmt}" "$1" "$2" "$3" "${deps[@]}")
|
||||
local deps="${@:6}"
|
||||
local str=$(printf "${fmt}" "$1" "$2" "$3" "$5" "${deps[@]}")
|
||||
write_line "${str}"
|
||||
else
|
||||
local deps=( "${@:5}" )
|
||||
local str=$(printf "${fmt}" "$1" "$2" "$3" "${deps[0]}")
|
||||
local deps=( "${@:6}" )
|
||||
local str=$(printf "${fmt}" "$1" "$2" "$3" "$5" "${deps[0]}")
|
||||
for (( i = 1; i < ${#deps[@]}; i++ )); do
|
||||
if (( ${#str} + ${#deps[i]} + 1 <= cols )); then
|
||||
str+=" ${deps[i]}"
|
||||
@@ -2173,21 +2161,26 @@ subcommand_search() {
|
||||
}
|
||||
|
||||
print_verbose() {
|
||||
fmt="%-${max_len_modulename}s %-10s %-12s %-s"
|
||||
fmt="%-${max_len_modulename}s %-12s %-14s %-s"
|
||||
func_print_header='print_header_verbose'
|
||||
func_print_line='print_line_verbose'
|
||||
}
|
||||
|
||||
print_header_verbose() {
|
||||
std::info ''
|
||||
std::info "${fmt}" "Module" "Rel.stage" "Group" "Dependencies/Modulefile"
|
||||
std::info '-%.0s' $(seq 1 ${cols})
|
||||
#std::info "${fmt}" "Module" "Rel.stage" "Group" "Overlay" "Dependencies/Modulefile"
|
||||
#std::info '-%.0s' $(seq 1 ${cols})
|
||||
}
|
||||
|
||||
print_line_verbose() {
|
||||
local deps="${@:5}"
|
||||
std::info "${fmt}" "$1" "$2" "$3" "dependencies: ${deps}"
|
||||
std::info "${fmt}" "" "" "" "modulefile: $4"
|
||||
local deps="${@:6}"
|
||||
[[ -z ${deps} ]] && deps="(none)"
|
||||
std::info "$1:"
|
||||
std::info " release stage: $2"
|
||||
std::info " group: $3"
|
||||
std::info " overlay: $5"
|
||||
std::info " modulefile: $4"
|
||||
std::info " dependencies: ${deps}"
|
||||
}
|
||||
|
||||
# print full modulefile names only
|
||||
@@ -2228,7 +2221,7 @@ subcommand_search() {
|
||||
${func_print_header}
|
||||
while read -a toks; do
|
||||
${func_print_line} "${toks[@]}"
|
||||
done < <("${sort}" --version-sort -k 1,1 -k 4,4 -k 5,5 "${tmpfile}" | \
|
||||
done < <("${sort}" --version-sort -k 1,1 -k 6,6 -k 7,7 "${tmpfile}" | \
|
||||
${awk} "${with_modules}")
|
||||
}
|
||||
|
||||
@@ -2271,10 +2264,11 @@ subcommand_search() {
|
||||
"${opt_use_rel_stages}" \
|
||||
"${modulepath[@]}" \
|
||||
|
||||
for (( i=0; i<${#mods[@]}; i+=3 )); do
|
||||
for (( i=0; i<${#mods[@]}; i+=4 )); do
|
||||
local name=${mods[i]}
|
||||
local rel_stage=${mods[i+1]}
|
||||
local modulefile=${mods[i+2]}
|
||||
local ol=${mods[i+3]}
|
||||
|
||||
if (( ${#name} > max_len_modulename)); then
|
||||
max_len_modulename=${#name}
|
||||
@@ -2302,6 +2296,7 @@ subcommand_search() {
|
||||
fi
|
||||
|
||||
echo ${name} ${rel_stage} ${group} ${modulefile} \
|
||||
${ol} \
|
||||
${deps[@]} >> "${tmpfile}"
|
||||
done
|
||||
done
|
||||
@@ -2405,7 +2400,10 @@ subcommand_search() {
|
||||
shift
|
||||
done
|
||||
if [[ -z "${src_prefix}" ]]; then
|
||||
local -a src_prefix=( "${OverlayList[@]}" )
|
||||
local ol=''
|
||||
for ol in "${UsedOverlays[@]}"; do
|
||||
src_prefix+=( "${OverlayInfo[${ol}:mod_root]}" )
|
||||
done
|
||||
fi
|
||||
|
||||
if [[ "${opt_use_rel_stages}" == ":" ]]; then
|
||||
@@ -2740,21 +2738,6 @@ if [[ -z "${Subcommands[${subcommand}]}" ]]; then
|
||||
std::die 1 "${CMD}: unknown sub-command -- ${subcommand}"
|
||||
fi
|
||||
|
||||
init_overlay_vars() {
|
||||
declare -ag OverlayList=( 'base' )
|
||||
OverlayDict['base:used']='yes'
|
||||
#declare -Ag Dir2OverlayMap=()
|
||||
for ol in "${OverlayList[@]}"; do
|
||||
local group
|
||||
for group in ${UsedGroups//:/ }; do
|
||||
local dir="${OverlayDict[${ol}:mod_root]}/${group}/${PMODULES_MODULEFILES_DIR}"
|
||||
if [[ -d "${dir}" ]]; then
|
||||
Dir2OverlayMap[${dir}]=${ol}
|
||||
fi
|
||||
done
|
||||
done
|
||||
}
|
||||
|
||||
case ${subcommand} in
|
||||
add )
|
||||
subcommand='load'
|
||||
@@ -2777,51 +2760,25 @@ if [[ -n ${PMODULES_ENV} ]]; then
|
||||
eval "$("${base64}" -d <<< "${PMODULES_ENV}" 2>/dev/null)"
|
||||
fi
|
||||
if [[ -z ${Version} ]] || [[ ${Version} != ${PMODULES_VERSION} ]]; then
|
||||
# this can only happen if the last command was
|
||||
# module load Pmodules/${PMODULES_VERSION}
|
||||
#
|
||||
# the values these two variables must be saved before initialising
|
||||
declare _tmp_loaded_modules_="${LOADEDMODULES}"
|
||||
declare _tmp_lmfiles_="${_LMFILES_}"
|
||||
|
||||
pmodules_init
|
||||
g_env_must_be_saved='yes'
|
||||
|
||||
# restore and export
|
||||
LOADEDMODULES="${_tmp_loaded_modules_}"
|
||||
_LMFILES_="${_tmp_lmfiles_}"
|
||||
export_env \
|
||||
LOADEDMODULES \
|
||||
_LMFILES_
|
||||
fi
|
||||
|
||||
#if [[ -n ${PMODULES_ENV} ]]; then
|
||||
# eval "$("${base64}" -d <<< "${PMODULES_ENV}" 2>/dev/null)"
|
||||
# if [[ -z ${Version} ]] || [[ ${Version} != ${PMODULES_VERSION} ]]; then
|
||||
# # the Pmodules version changed!
|
||||
# declare -g Version="${PMODULES_VERSION}"
|
||||
# pm::read_config
|
||||
# init_overlay_vars
|
||||
# # renamed in version 1.0.0rc10 and type changed from
|
||||
# # associative array to normal array
|
||||
# if [[ -v UseFlags ]]; then
|
||||
# declare -a UsedFlags=( "${!UseFlags[@]}" )
|
||||
# unset UseFlags
|
||||
# fi
|
||||
# if [[ ! -v UsedFlags ]]; then
|
||||
# declare -a UsedFlags=()
|
||||
# fi
|
||||
# if [[ -v UsedReleases ]]; then
|
||||
# declare -- UsedReleaseStages="${UsedReleases}"
|
||||
# unset UsedReleases
|
||||
# fi
|
||||
# if [[ -v PMODULES_DEFAULT_GROUPS ]]; then
|
||||
# declare -- DefaultGroups="${PMODULES_DEFAULT_GROUPS}"
|
||||
# unset PMODULES_DEFAULT_GROUPS
|
||||
# fi
|
||||
# if [[ -v PMODULES_DEFINED_RELEASES ]]; then
|
||||
# declare -- ReleaseStages="${PMODULES_DEFINED_RELEASES}"
|
||||
# unset PMODULES_DEFINED_RELEASES
|
||||
# fi
|
||||
# if [[ -v PMODULES_DEFAULT_RELEASES ]]; then
|
||||
# declare -- DefaultReleaseStages="${PMODULES_DEFAULT_RELEASES}"
|
||||
# unset PMODULES_DEFAULT_RELEASES
|
||||
# fi
|
||||
# g_env_must_be_saved='yes'
|
||||
# fi
|
||||
#else
|
||||
# pmodules_init
|
||||
# g_env_must_be_saved='yes'
|
||||
#fi
|
||||
|
||||
if (( ${#GroupDepths[@]} == 0 )); then
|
||||
scan_groups "${OverlayList[@]}"
|
||||
scan_groups "${UsedOverlays[@]}"
|
||||
g_env_must_be_saved='yes'
|
||||
fi
|
||||
|
||||
|
||||
+8
-4
@@ -10,9 +10,8 @@ Pmodules are a hierarchical module environment based on Environment Modules.
|
||||
"
|
||||
|
||||
#
|
||||
# It might be that '${PMODULES_HOME}' is in PATH.
|
||||
# Why? With older version the PATH might have been set without loading
|
||||
# a module.
|
||||
# Older versions add '$PREFIX/bin' to PATH without loading Pmodules as
|
||||
# a module. Remove it ...
|
||||
#
|
||||
if { [module-info mode load] } {
|
||||
set PATH ":$::env(PATH):"
|
||||
@@ -21,4 +20,9 @@ if { [module-info mode load] } {
|
||||
remove-path PATH $str
|
||||
}
|
||||
}
|
||||
}
|
||||
remove-path C_INCLUDE_PATH "$PREFIX/include"
|
||||
remove-path CPLUS_INCLUDE_PATH "$PREFIX/include"
|
||||
|
||||
set shell [module-info shell]
|
||||
puts "source \"$PREFIX/init/$shell\""
|
||||
}
|
||||
@@ -34,6 +34,14 @@ module() {
|
||||
}
|
||||
export -f module
|
||||
|
||||
modbuild(){
|
||||
(
|
||||
eval $("${PMODULES_HOME}/bin/modulecmd" bash load System:bash)
|
||||
"${PMODULES_HOME}/bin/modbuild" "$@"
|
||||
)
|
||||
}
|
||||
export -f modbuild
|
||||
|
||||
# Local Variables:
|
||||
# mode: sh
|
||||
# sh-basic-offset: 8
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
#!/usr/bin/env modbuild
|
||||
|
||||
pbuild::set_download_url "https://prdownloads.sourceforge.net/tcl/tcl$V-src.tar.gz"
|
||||
pbuild::install_docfiles 'license.terms' 'README.md'
|
||||
|
||||
pbuild::configure() {
|
||||
case ${OS} in
|
||||
Linux )
|
||||
srcdir="${SRC_DIR}/unix"
|
||||
;;
|
||||
Darwin )
|
||||
srcdir="${SRC_DIR}/macosx"
|
||||
;;
|
||||
esac
|
||||
"${srcdir}"/configure \
|
||||
--prefix="${PREFIX}" \
|
||||
--bindir="${PREFIX}/${UTILBIN_DIR}" \
|
||||
--enable-shared=no \
|
||||
|| exit 1
|
||||
}
|
||||
|
||||
pbuild::post_install() {
|
||||
{ cd "${PREFIX}/${UTILBIN_DIR}" && rm -f tclsh && ln -fs tclsh${V%.*} tclsh; };
|
||||
}
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
#!/usr/bin/env modbuild
|
||||
|
||||
pbuild::set_download_url "https://ftp.gnu.org/gnu/$P/$P-$V.tar.gz"
|
||||
pbuild::add_configure_args "--bindir=${PREFIX}/${UTILBIN_DIR}"
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/usr/bin/env modbuild
|
||||
|
||||
pbuild::set_download_url "http://ftp.gnu.org/gnu/coreutils/$P-$V.tar.xz"
|
||||
pbuild::add_configure_args "--bindir=${PREFIX}/${UTILBIN_DIR}"
|
||||
@@ -1,10 +0,0 @@
|
||||
#!/usr/bin/env pbuild
|
||||
|
||||
pmodules.configure() {
|
||||
"${MODULE_SRCDIR}"/configure \
|
||||
--prefix="${PREFIX}" \
|
||||
|| exit 1
|
||||
}
|
||||
|
||||
pmodules.add_to_group 'Tools'
|
||||
pmodules.make_all
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/usr/bin/env modbuild
|
||||
|
||||
pbuild::set_download_url "https://ftp.gnu.org/pub/gnu/$P/$P-$V.tar.xz"
|
||||
pbuild::add_configure_args "--bindir=${PREFIX}/${UTILBIN_DIR}"
|
||||
@@ -1,12 +0,0 @@
|
||||
diff -u getopt-1.1.6.orig//Makefile getopt-1.1.6/Makefile
|
||||
--- getopt-1.1.6.orig//Makefile 2014-11-24 04:33:39.000000000 -0800
|
||||
+++ getopt-1.1.6/Makefile 2016-10-27 08:27:52.000000000 -0700
|
||||
@@ -61,7 +61,7 @@
|
||||
-$(RM) $(objects) $(binaries)
|
||||
|
||||
getopt: $(objects)
|
||||
- $(CC) $(LDFLAGS) -o $@ $(objects)
|
||||
+ $(CC) -o $@ $(objects) $(LDFLAGS)
|
||||
|
||||
install: getopt install_po
|
||||
$(INSTALL) -m 755 -d $(DESTDIR)$(bindir) $(DESTDIR)$(man1dir)
|
||||
@@ -1,54 +0,0 @@
|
||||
#!/usr/bin/env modbuild
|
||||
set -x
|
||||
|
||||
pbuild::set_download_url "http://frodo.looijaard.name/system/files/software/getopt/getopt-1.1.6.tar.gz"
|
||||
pbuild::compile_in_sourcetree
|
||||
|
||||
pbuild::pre_prep_Linux() {
|
||||
pbuild::add_patch "Makefile.patch"
|
||||
}
|
||||
|
||||
pbuild::configure() {
|
||||
:
|
||||
}
|
||||
|
||||
pbuild::compile() {
|
||||
declare -x C_INCLUDE_PATH="${PREFIX}/include"
|
||||
declare -x LIBRARY_PATH="${PREFIX}/lib"
|
||||
case ${OS} in
|
||||
Linux )
|
||||
declare -x C_INCLUDE_PATH="${PREFIX}/include"
|
||||
declare -x LIBRARY_PATH="${PREFIX}/lib"
|
||||
declare -x LDFLAGS="-lintl -L${PREFIX}/lib"
|
||||
;;
|
||||
Darwin )
|
||||
if [[ ! -d '/opt/local/bin' ]] || [[ ! -x '/opt/local/bin/msgfmt' ]]; then
|
||||
std::die 1 "gettext port from Macports is required to build 'getopt'!"
|
||||
fi
|
||||
PATH+=':/opt/local/bin'
|
||||
declare -x C_INCLUDE_PATH='/opt/local/include'
|
||||
declare -x LDFLAGS="/opt/local/lib/libintl.a /opt/local/lib/libiconv.a -framework CoreFoundation"
|
||||
;;
|
||||
esac
|
||||
|
||||
make -e all || exit 1
|
||||
declare -x DESTDIR="${PREFIX}"
|
||||
declare -x prefix='' || exit 1
|
||||
PATH="${PREFIX}/${UTILBIN_DIR}:${PATH}"
|
||||
make -e install
|
||||
mv "${PREFIX}/bin/getopt" "${PREFIX}/${UTILBIN_DIR}"
|
||||
}
|
||||
|
||||
pbuild::install() {
|
||||
:
|
||||
}
|
||||
|
||||
pbuild::cleanup_build() {
|
||||
:
|
||||
}
|
||||
|
||||
# Local Variables:
|
||||
# mode: sh
|
||||
# sh-basic-offset: 8
|
||||
# tab-width: 8
|
||||
# End:
|
||||
@@ -1,19 +0,0 @@
|
||||
#!/usr/bin/env modbuild
|
||||
|
||||
pbuild::set_download_url "https://ftp.gnu.org/pub/gnu/$P/$P-$V.tar.gz"
|
||||
|
||||
pbuild::add_configure_args "--prefix=${PREFIX}"
|
||||
pbuild::add_configure_args "--bindir=${PREFIX}/${UTILBIN_DIR}"
|
||||
pbuild::add_configure_args "--disable-java"
|
||||
pbuild::add_configure_args "--disable-threads"
|
||||
pbuild::add_configure_args "--disable-shared"
|
||||
pbuild::add_configure_args "--enable-relocatable"
|
||||
pbuild::add_configure_args "--disable-openmp"
|
||||
pbuild::add_configure_args "--disable-acl"
|
||||
pbuild::add_configure_args "--disable-curses"
|
||||
pbuild::add_configure_args "--with-included-gettext"
|
||||
pbuild::add_configure_args "--without-libiconv-prefix"
|
||||
pbuild::add_configure_args "--without-libintl-prefix"
|
||||
pbuild::add_configure_args "--with-included-libxml"
|
||||
pbuild::add_configure_args "--with-pic=yes"
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
#!/usr/bin/env modbuild
|
||||
|
||||
# use system gcc to compile
|
||||
declare -rx CC=gcc
|
||||
|
||||
pbuild::set_download_url "https://amas.web.psi.ch/Downloads/$P/$P-$V.tar.bz2"
|
||||
|
||||
TCL_DIR="${PMODULES_HOME}"
|
||||
|
||||
PATH="${TCL_DIR}/bin:${PATH}"
|
||||
|
||||
pbuild::configure() {
|
||||
case ${OS} in
|
||||
Linux )
|
||||
declare -x LIBS="-lz -lpthread"
|
||||
;;
|
||||
Darwin )
|
||||
declare -x LIBS="-lz -framework CoreFoundation"
|
||||
;;
|
||||
esac
|
||||
CPPFLAGS="-DUSE_INTERP_ERRORLINE" "${SRC_DIR}"/configure \
|
||||
--prefix="${PREFIX}" \
|
||||
--exec-prefix="${PREFIX}" \
|
||||
--with-module-path="${PMODULES_HOME%%/Tools*}/Tools/${PMODULES_MODULEFILES_DIR}" \
|
||||
--with-tcl="${TCL_DIR}/lib" \
|
||||
--without-x \
|
||||
--disable-versioning \
|
||||
|| exit 1
|
||||
}
|
||||
|
||||
pbuild::post_install() {
|
||||
rm -v "${PREFIX}/Modules/bin/add.modules"
|
||||
rm -v "${PREFIX}/Modules/bin/mkroot"
|
||||
rm -rfv "${PREFIX}/Modules/modulefiles"
|
||||
mv -v "${PREFIX}/Modules/share/man/man1/module.1 ${PREFIX}/share/man/man1"
|
||||
mv -v "${PREFIX}/Modules/share/man/man4/modulefile.4 ${PREFIX}/share/man/man4"
|
||||
rmdir "${PREFIX}/Modules/bin"
|
||||
rmdir "${PREFIX}/Modules/share/man/man1"
|
||||
rmdir "${PREFIX}/Modules/share/man/man4"
|
||||
rmdir "${PREFIX}/Modules/share/man"
|
||||
rmdir "${PREFIX}/Modules/share"
|
||||
rmdir "${PREFIX}/Modules"
|
||||
rm -f "${PREIX}/init/{ksh,perl.pm,python.py,ruby.rb,cmake,.modulespath}"
|
||||
cp -v "${BUILD_DIR}/modulecmd" "${PREFIX}/libexec/modulecmd.bin" || exit 1
|
||||
}
|
||||
|
||||
# fake module command
|
||||
module() {
|
||||
:
|
||||
}
|
||||
|
||||
# Local Variables:
|
||||
# mode: sh
|
||||
# sh-basic-offset: 8
|
||||
# tab-width: 8
|
||||
# End:
|
||||
@@ -1,5 +0,0 @@
|
||||
#!/usr/bin/env modbuild
|
||||
|
||||
pbuild::set_download_url "https://core.tcl-lang.org/tcllib/uv/$P-$V.tar.xz"
|
||||
|
||||
|
||||
@@ -1,56 +1,84 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
if [ "${BASH_VERSINFO[0]}" -lt 4 ]; then
|
||||
echo "BASH version >= 4 is required and must be available in PATH!" 1>&2
|
||||
|
||||
declare -rx VERSION='1.1.10'
|
||||
|
||||
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 BOOTSTRAP_DIR=$(dirname "$0")
|
||||
source "${BOOTSTRAP_DIR}/Pmodules/libstd.bash" || { echo "Oops!" 1>&2; exit 42; }
|
||||
source "${BOOTSTRAP_DIR}/Pmodules/libpbuild.bash" || { echo "Oops!" 1>&2; exit 42; }
|
||||
set -o nounset
|
||||
set -o pipefail
|
||||
shopt -s nullglob
|
||||
|
||||
declare -r BOOTSTRAP_DIR=$(std::get_abspath "${BOOTSTRAP_DIR}")
|
||||
declare -r BOOTSTRAP_DIR="$(cd "$(dirname "$0")" && pwd -P)"
|
||||
declare -r SRC_DIR="${BOOTSTRAP_DIR}/Pmodules"
|
||||
|
||||
declare -x PMODULES_ROOT
|
||||
declare -x PMODULES_HOME
|
||||
declare -x PMODULES_DISTFILESDIR
|
||||
declare -x PMODULES_TMPDIR
|
||||
source "${SRC_DIR}/libstd.bash" || { echo "Oops!" 1>&2; exit 42; }
|
||||
source "${SRC_DIR}/libpbuild.bash" || { echo "Oops!" 1>&2; exit 42; }
|
||||
|
||||
declare -r PMOD_DIR="Tools/Pmodules/${VERSION}"
|
||||
# config directory and file relative to install root
|
||||
declare -rx CONFIG_DIR='config'
|
||||
declare -rx CONFIG_FILE='Pmodules.yaml'
|
||||
declare -rx VERSIONS_CFG_FILE="${CONFIG_DIR}/versions.conf"
|
||||
|
||||
# defaults
|
||||
declare -rx DEFAULT_PMODULES_ROOT='/opt/psi'
|
||||
declare -rx DEFAULT_DISTFILES_DIR="var/distfiles"
|
||||
declare -rx DEFAULT_TMPDIR='var/tmp/${USER}'
|
||||
declare -rx CONFIG_FILE="${CONFIG_DIR}/Pmodules.yaml"
|
||||
|
||||
# directory where the required tools will be installed (like bash, tclsh, etc)
|
||||
declare -rx UTILBIN_DIR='libexec'
|
||||
|
||||
# defaults
|
||||
declare -rx DEFAULT_INSTALL_ROOT='/opt/psi'
|
||||
declare -rx DEFAULT_DISTFILES_DIR='var/distfiles'
|
||||
declare -rx DEFAULT_TMP_DIR='var/tmp/${USER}'
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
#
|
||||
# Get version from config file.
|
||||
#
|
||||
# The format of the config file is:
|
||||
#
|
||||
# <PackageName> <version>
|
||||
#
|
||||
get_version() {
|
||||
local -r name="$1"
|
||||
echo $(awk "/^$1[[:blank:]]/ {print \$2}" "${VERSIONS_CFG_FILE}")
|
||||
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}'"
|
||||
|
||||
declare -xg INSTALL_ROOT="${Overlays_base_install_root}"
|
||||
if [[ -z "${INSTALL_ROOT}" ]]; then
|
||||
std::die 1 "Error in configuration file '${fname}': install root not defined!"
|
||||
fi
|
||||
declare -xg PREFIX="${INSTALL_ROOT}/${PMOD_DIR}"
|
||||
declare -xg DOWNLOADS_DIR="${DistfilesDir:-${INSTALL_ROOT}/${DEFAULT_DISTFILES_DIR}}"
|
||||
declare -xg TMP_DIR="${TmpDir:-${INSTALL_ROOT}/${DEFAULT_TMP_DIR}}"
|
||||
}
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# The next functions are used in the sub-commands, if an illegal option
|
||||
# or argument has been passed.
|
||||
#
|
||||
# the Pmodules version is defined in the config file
|
||||
#
|
||||
declare -rx PMODULES_VERSION=$(get_version 'Pmodules')
|
||||
illegal_option(){
|
||||
local subcmd="$1"
|
||||
local opt="$2"
|
||||
std::die 1 \
|
||||
"%s: %s -- %s" \
|
||||
"$(basename $0) ${subcmd}" \
|
||||
"Illegal option" \
|
||||
"${opt}"
|
||||
}
|
||||
|
||||
illegal_arg(){
|
||||
local subcmd="$1"
|
||||
local arg="$2"
|
||||
std::die 1 \
|
||||
"%s: %s -- %s" \
|
||||
"$(basename $0) ${subcmd}" \
|
||||
"Illegal argument" \
|
||||
"${arg}"
|
||||
}
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
#
|
||||
usage() {
|
||||
local prog=$(basename $0)
|
||||
# help for sub-command 'help' (usage)
|
||||
build::help_help(){
|
||||
local prog="$(basename "$0")"
|
||||
echo "
|
||||
Usage: ${prog} help|configure|compile|install
|
||||
|
||||
@@ -73,26 +101,36 @@ to get help for a specific sub-command.
|
||||
}
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# sub-command 'help'
|
||||
#
|
||||
pmodules::help() {
|
||||
if (( $# > 1 )); then
|
||||
usage
|
||||
# print help for sub-commands
|
||||
#
|
||||
build::help() {
|
||||
if (( $# == 0 )); then
|
||||
build::help_help
|
||||
else
|
||||
case $1 in
|
||||
configure|compile|install )
|
||||
build::help_$1
|
||||
;;
|
||||
help )
|
||||
build::help_help
|
||||
;;
|
||||
-* )
|
||||
illegal_option 'help' "$1"
|
||||
;;
|
||||
* )
|
||||
std::error "No such command -- $1"
|
||||
build::help_help
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
case $1 in
|
||||
configure|compile|install )
|
||||
pmodules::help_$1
|
||||
;;
|
||||
* )
|
||||
echo -en "$1 - invalid sub-command!\n" 1>&2
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# help for sub-command 'configure'
|
||||
#
|
||||
pmodules::help_configure() {
|
||||
build::help_configure() {
|
||||
echo "
|
||||
Usage: $(basename $0) configure [OPTION...]
|
||||
|
||||
@@ -100,21 +138,24 @@ Configure and setup a new Pmodules environment. You need permissions
|
||||
to write to the installation root.
|
||||
|
||||
Options:
|
||||
--prefix=DIR
|
||||
--install_root=DIR
|
||||
Root of the Pmodules environment installation. Everything will be
|
||||
installed in a directory hierarchy with 'DIR' as prefix.
|
||||
The default is '${DEFAULT_PMODULES_ROOT}'.
|
||||
The default is '${DEFAULT_INSTALL_ROOT}'.
|
||||
|
||||
--distfilesdir=DIR
|
||||
Directory where downloaded files are stored.
|
||||
The default is 'PREFIX/${DEFAULT_DISTFILES_DIR}' in the
|
||||
The default is '${DEFAULT_INSTALL_ROOT}/${DEFAULT_DISTFILES_DIR}' in the
|
||||
Pmodules root directory.
|
||||
|
||||
--tmpdir=DIR
|
||||
Directory for temporary files.
|
||||
The default is 'PREFIX/${DEFAULT_TMPDIR}'
|
||||
The default is '${DEFAULT_INSTALL_ROOT}/${DEFAULT_TMP_DIR}'
|
||||
|
||||
--help
|
||||
--force|-f
|
||||
Override existing configuration.
|
||||
|
||||
--help|-h|-?
|
||||
Print this help text.
|
||||
|
||||
" 1>&2
|
||||
@@ -122,110 +163,123 @@ Options:
|
||||
}
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# sub-command 'configure'
|
||||
#
|
||||
pmodules::configure() {
|
||||
local prefix="${PMODULES_ROOT:-${DEFAULT_PMODULES_ROOT}}"
|
||||
local distfilesdir=''
|
||||
local tmpdir=''
|
||||
local config_file=''
|
||||
# Create basic directory hierachy and the configuration file in the given
|
||||
# installation root directory
|
||||
#
|
||||
build::configure() {
|
||||
local opt_force='no'
|
||||
|
||||
while (( $# > 0 )); do
|
||||
case "$1" in
|
||||
--prefix )
|
||||
prefix="$2"
|
||||
shift 1
|
||||
;;
|
||||
--prefix=* )
|
||||
prefix="${1#*=}"
|
||||
--install_root | --install_root=* )
|
||||
if [[ $1 == *=* ]]; then
|
||||
INSTALL_ROOT="${1#*=}"
|
||||
else
|
||||
INSTALL_ROOT="$2"
|
||||
shift 1
|
||||
fi
|
||||
;;
|
||||
--distfilesdir )
|
||||
distfilesdir="$2"
|
||||
shift 1
|
||||
;;
|
||||
--distfilesdir=* )
|
||||
distfilesdir="${1#*=}"
|
||||
if [[ $1 == *=* ]]; then
|
||||
DOWNLOADS_DIR="${1#*=}"
|
||||
else
|
||||
DOWNLOADS_DIR="$2"
|
||||
shift 1
|
||||
fi
|
||||
;;
|
||||
-f | --force )
|
||||
opt_force='yes'
|
||||
;;
|
||||
--tmpdir )
|
||||
tmpdir="$2"
|
||||
shift 1
|
||||
;;
|
||||
--tmpdir=* )
|
||||
tmpdir="${1#*=}"
|
||||
--tmpdir | --tmpdir=* )
|
||||
if [[ $1 == *=* ]]; then
|
||||
TMP_DIR="${1#*=}"
|
||||
else
|
||||
TMP_DIR="$2"
|
||||
shift 1
|
||||
fi
|
||||
;;
|
||||
--help | -h | -\? )
|
||||
pmodules::help_configure
|
||||
build::help_configure
|
||||
;;
|
||||
-* )
|
||||
std::die 1 "$1: illegal option"
|
||||
illegal_option 'configure' "$1"
|
||||
;;
|
||||
* )
|
||||
std::die 1 "$1: illegal argument to sub-command 'configure'."
|
||||
illegal_arg 'configure' "$1"
|
||||
;;
|
||||
esac
|
||||
shift 1
|
||||
done
|
||||
if [[ ! -d ${prefix} ]]; then
|
||||
echo "The root directory '${prefix}' does not exist, trying to create it..."
|
||||
if ! mkdir -p "${prefix}"; then
|
||||
std::die 1 "Creating the root directory failed!\nAborting..."
|
||||
: ${INSTALL_ROOT:=${DEFAULT_INSTALL_ROOT}}
|
||||
: ${DOWNLOADS_DIR:=${INSTALL_ROOT}/${DEFAULT_DISTFILES_DIR}}
|
||||
: ${TMP_DIR:=${INSTALL_ROOT}/${DEFAULT_TMP_DIR}}
|
||||
PREFIX="${INSTALL_ROOT}/${PMOD_DIR}"
|
||||
|
||||
#---
|
||||
# check/create the install root
|
||||
if [[ ! -d ${INSTALL_ROOT} ]]; then
|
||||
std::info "%s\n%s" \
|
||||
"The root directory '${INSTALL_ROOT}' does not exist!" \
|
||||
"Trying to create it..."
|
||||
if ! mkdir -p "${INSTALL_ROOT}"; then
|
||||
std::die 1 "%s\n%s" \
|
||||
"Creating the root directory failed!" \
|
||||
"Aborting..."
|
||||
fi
|
||||
fi
|
||||
if [[ ! -w ${prefix} ]]; then
|
||||
std::die 1 "The root directory '${prefix}' is not writable!\nAborting..."
|
||||
if [[ ! -w ${INSTALL_ROOT} ]]; then
|
||||
std::die 1 "%s\n%s" \
|
||||
"The root directory '${INSTALL_ROOT}' is not writable!" \
|
||||
"Aborting..."
|
||||
fi
|
||||
mkdir -p "${prefix}/${CONFIG_DIR}" || \
|
||||
|
||||
#---
|
||||
# check/create YAML config file in install root
|
||||
mkdir -p "${INSTALL_ROOT}/${CONFIG_DIR}" || \
|
||||
std::die 1 "Aborting..."
|
||||
|
||||
local config_file="${prefix}/${CONFIG_DIR}/${CONFIG_FILE}"
|
||||
if [[ "${opt_force}" == 'yes' ]]; then
|
||||
rm -f "${config_file}"
|
||||
local config_file="${INSTALL_ROOT}/${CONFIG_FILE}"
|
||||
if [[ "${opt_force}" != 'yes' ]] && [[ -e "${config_file}" ]]; then
|
||||
std::die 1 "%s\n%s" \
|
||||
"The Pmodules environment in '${INSTALL_ROOT}' has already been configured!" \
|
||||
"Use the option --force to override. Aborting..."
|
||||
fi
|
||||
|
||||
if [[ -e "${config_file}" ]]; then
|
||||
std::die 1 "The Pmodules environment has already been configured!
|
||||
Use the option --force to override.\nAborting..."
|
||||
fi
|
||||
|
||||
[[ -z "${distfilesdir}" ]] && distfilesdir="${prefix}/${DEFAULT_DISTFILES_DIR}"
|
||||
[[ -z "${tmpdir}" ]] && tmpdir="${prefix}/${DEFAULT_TMPDIR}"
|
||||
|
||||
sed_cmd="s:@INSTALL_ROOT@:${prefix}:g;"
|
||||
sed_cmd+="s:@PMODULES_DISTFILESDIR@:${distfilesdir}:g;"
|
||||
sed_cmd+="s:@PMODULES_TMPDIR@:${tmpdir}:g;"
|
||||
sed_cmd+="s:@PMODULES_VERSION@:${PMODULES_VERSION}:g"
|
||||
sed_cmd="s:@INSTALL_ROOT@:${INSTALL_ROOT}:g;"
|
||||
sed_cmd+="s:@PMODULES_DISTFILESDIR@:${DOWNLOADS_DIR}:g;"
|
||||
sed_cmd+="s:@PMODULES_TMPDIR@:${TMP_DIR}:g;"
|
||||
sed_cmd+="s:@PMODULES_VERSION@:${VERSION}:g"
|
||||
|
||||
sed "${sed_cmd}" "${BOOTSTRAP_DIR}/${CONFIG_DIR}/${CONFIG_FILE}.in" \
|
||||
sed "${sed_cmd}" "${BOOTSTRAP_DIR}/${CONFIG_FILE}.in" \
|
||||
> "${config_file}" || \
|
||||
std::die 1 "Cannot create configuration file in Pmodules root\nAborting..."
|
||||
|
||||
sed "${sed_cmd}" "${SRC_DIR}/libpmodules.bash.in" > "${SRC_DIR}/libpmodules.bash"
|
||||
chmod 0755 "${SRC_DIR}/libpmodules.bash"
|
||||
|
||||
read_config_file "${config_file}"
|
||||
install -d -m 0755 "${PMODULES_HOME}/bin"
|
||||
install -d -m 0755 "${PMODULES_HOME}/init"
|
||||
install -d -m 0755 "${PMODULES_HOME}/lib"
|
||||
install -d -m 0755 "${PMODULES_HOME}/libexec"
|
||||
install -d -m 0755 "${PMODULES_ROOT}/Tools/modulefiles/Pmodules"
|
||||
install -d -m 0755 "${PMODULES_ROOT}/Libraries/modulefiles"
|
||||
install -d -m 0755 "${PMODULES_ROOT}/Programming/modulefiles"
|
||||
install -d -m 0755 "${distfilesdir}"
|
||||
#---
|
||||
# create basic directories
|
||||
install -d -m 0755 \
|
||||
"${INSTALL_ROOT}/Tools/modulefiles/Pmodules" \
|
||||
"${INSTALL_ROOT}/Libraries/modulefiles" \
|
||||
"${INSTALL_ROOT}/Programming/modulefiles" \
|
||||
"${DOWNLOADS_DIR}" || \
|
||||
std::die 1 "%s" \
|
||||
"Creating basic directories failed\n" \
|
||||
"Aborting..."
|
||||
|
||||
#---
|
||||
echo "Configuration:"
|
||||
echo " root of Pmodules environment: ${prefix}"
|
||||
echo " Pmodule prefix: ${PMODULES_HOME}"
|
||||
echo " tmp directory: ${tmpdir}"
|
||||
echo " store for downloaded files: ${distfilesdir}"
|
||||
echo " root of Pmodules environment: ${INSTALL_ROOT}"
|
||||
echo " Pmodule prefix: ${PREFIX}"
|
||||
echo " tmp directory: ${TMP_DIR}"
|
||||
echo " store for downloaded files: ${DOWNLOADS_DIR}"
|
||||
echo "Done..."
|
||||
}
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# help for sub-command 'compile'
|
||||
#
|
||||
pmodules::help_compile() {
|
||||
build::help_compile() {
|
||||
echo "
|
||||
Usage: $(basename $0) compile [OPTION...]
|
||||
|
||||
@@ -233,22 +287,14 @@ Compile and install the required tools for a new Pmodules environment.
|
||||
ou need the permissions to write to the installation root.
|
||||
|
||||
Options:
|
||||
--prefix=DIR
|
||||
Root of the Pmodules environment installation. The root of the
|
||||
installation must be either specified via this option or the
|
||||
environment variable PMODULES_ROOT. If this option is used and
|
||||
the PMODULES_ROOT is set, the directory specified with this
|
||||
option will be used.
|
||||
--install_root=DIR
|
||||
Root of the Pmodules environment installation. Everything will be
|
||||
installed in a directory hierarchy with 'DIR' as prefix.
|
||||
The default is '${DEFAULT_INSTALL_ROOT}'.
|
||||
|
||||
--debug
|
||||
Enable verbose/debug output.
|
||||
|
||||
--disable-cleanup )
|
||||
--disable-cleanup
|
||||
Do not cleanup the tmp directory after compilation and installation.
|
||||
|
||||
--force | -f
|
||||
Force compilation.
|
||||
|
||||
--help
|
||||
Print this help text.
|
||||
|
||||
@@ -256,270 +302,208 @@ Options:
|
||||
std::die 1 ""
|
||||
}
|
||||
|
||||
pmodules::compile() {
|
||||
build () {
|
||||
local -r name="$1"
|
||||
local -r version=$(get_version "${name}")
|
||||
shift
|
||||
|
||||
"${BOOTSTRAP_DIR}/Pmodules/modbuild.in" \
|
||||
"--config=${config_file}" \
|
||||
"--disable-cleanup" \
|
||||
"--force-rebuild" \
|
||||
"--debug" \
|
||||
"--verbose" \
|
||||
"${BOOTSTRAP_DIR}/Tools/${name}/build" \
|
||||
"${build_opts[@]}" "$@" "${version}" || \
|
||||
std::die 3 "Compiling '${name}' failed!"
|
||||
# :FIXME: this must be fixed in modbuild!
|
||||
rm -f "${BOOTSTRAP_DIR}/Tools/modulefiles/.release-$V"
|
||||
}
|
||||
|
||||
local prefix="${PMODULES_ROOT:-${DEFAULT_PMODULES_ROOT}}"
|
||||
#-----------------------------------------------------------------------------
|
||||
# sub-command 'compile'
|
||||
#
|
||||
# compile all required tools like bash, tclsh etc for a Pmodules module.
|
||||
# The version is defined at the beginning of this file.
|
||||
#
|
||||
build::compile() {
|
||||
local opt_force='no'
|
||||
local config_file=''
|
||||
local opt_cleanup='yes'
|
||||
|
||||
while (( $# > 0 )); do
|
||||
case $1 in
|
||||
--prefix )
|
||||
prefix="$2"
|
||||
shift 1
|
||||
;;
|
||||
--prefix=* )
|
||||
prefix="${1#*=}"
|
||||
--install_root | --install_root=* )
|
||||
if [[ $1 == *=* ]]; then
|
||||
INSTALL_ROOT="${1#*=}"
|
||||
else
|
||||
INSTALL_ROOT="$2"
|
||||
shift 1
|
||||
fi
|
||||
;;
|
||||
--disable-cleanup )
|
||||
build_opts+=( "$1" )
|
||||
;;
|
||||
--debug )
|
||||
build_opts+=( "$1" )
|
||||
;;
|
||||
-f | --force )
|
||||
opt_force='yes'
|
||||
opt_cleanup='no'
|
||||
;;
|
||||
--help | -h | -\? )
|
||||
pmodules::help_compile
|
||||
build::help_compile
|
||||
;;
|
||||
-* )
|
||||
std::die 1 "$1: illegal option"
|
||||
illegal_option 'compile' "$1"
|
||||
;;
|
||||
* )
|
||||
std::die 1 "$1: illegal argument for sub-command 'compile'."
|
||||
illegal_arg 'compile' "$1"
|
||||
;;
|
||||
esac
|
||||
shift 1
|
||||
done
|
||||
: ${INSTALL_ROOT:=${DEFAULT_INSTALL_ROOT}}
|
||||
PREFIX="${INSTALL_ROOT}/${PMOD_DIR}"
|
||||
|
||||
local config_file="${prefix}/${CONFIG_DIR}/${CONFIG_FILE}"
|
||||
read_config_file "${config_file}"
|
||||
install -d -m 0755 "${PMODULES_HOME}/bin"
|
||||
install -d -m 0755 "${PMODULES_HOME}/init"
|
||||
install -d -m 0755 "${PMODULES_HOME}/lib"
|
||||
install -d -m 0755 "${PMODULES_HOME}/libexec"
|
||||
read_config_file "${INSTALL_ROOT}/${CONFIG_FILE}"
|
||||
|
||||
echo "Configuration:"
|
||||
echo " root of Pmodules environment: ${prefix}"
|
||||
echo " Pmodule prefix: ${PMODULES_HOME}"
|
||||
echo " root of Pmodules environment: ${INSTALL_ROOT}"
|
||||
echo " Pmodule prefix: ${PREFIX}"
|
||||
|
||||
if [[ "${OS}" == 'Darwin' ]]; then
|
||||
if [[ ! -f "${PMODULES_HOME}/${UTILBIN_DIR}/getopt" ]] || [[ ${opt_force} == 'yes' ]]; then
|
||||
build getopt
|
||||
fi
|
||||
install -m 0755 -d "${PREFIX}"/{bin,init,lib,libexec} \
|
||||
|
||||
if [[ ! -f "${PMODULES_HOME}/${UTILBIN_DIR}/find" ]] || [[ ${opt_force} == 'yes' ]]; then
|
||||
build findutils
|
||||
fi
|
||||
for recipe in recipes/[0-9]*; do
|
||||
"./${recipe}" "${PREFIX}"
|
||||
done
|
||||
if [[ "${opt_cleanup}" == 'yes' ]]; then
|
||||
rm -rf "${TMP_DIR}/*"
|
||||
rm -f "${PREFIX}/lib/libtcl*.a"
|
||||
rm -rf "${PREFIX}/include"
|
||||
fi
|
||||
|
||||
if [[ ! -f "${PMODULES_HOME}/${UTILBIN_DIR}/bash" ]] || [[ ${opt_force} == 'yes' ]]; then
|
||||
build bash
|
||||
fi
|
||||
|
||||
if [[ ! -e "${PMODULES_HOME}/${UTILBIN_DIR}/tclsh" ]] || [[ ${opt_force} == 'yes' ]]; then
|
||||
build Tcl
|
||||
fi
|
||||
|
||||
if [[ ! -e "${PMODULES_HOME}/lib/tcllib1.20" ]] || [[ ${opt_force} == 'yes' ]]; then
|
||||
build tcllib
|
||||
fi
|
||||
|
||||
if [[ ! -e "${PMODULES_HOME}/libexec/modulecmd.bin" ]] || [[ ${opt_force} == 'yes' ]]; then
|
||||
build modules
|
||||
fi
|
||||
rm -rf "${PMODULES_HOME}/include"
|
||||
rm -rf "${PMODULES_HOME}/lib/"*.a
|
||||
rm -rf "${PMODULES_HOME}/lib/"*.la
|
||||
rm -rf "${PMODULES_HOME}/lib/bash"
|
||||
rm -rf "${PMODULES_HOME}/lib/pkginfo"
|
||||
rm -rf "${PMODULES_HOME}/man"
|
||||
rm -rf "${PMODULES_HOME}/share"
|
||||
|
||||
echo "Done..."
|
||||
}
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# help for sub-command 'install'
|
||||
#
|
||||
pmodules::help_install() {
|
||||
build::help_install() {
|
||||
echo "
|
||||
Usage: $(basename $0) install [OPTION...]
|
||||
|
||||
Install a new Pmodules version.
|
||||
|
||||
Options:
|
||||
--prefix=DIR
|
||||
Root of the Pmodules environment installation. The root of the
|
||||
installation must be either specified via this option or the
|
||||
environment variable PMODULES_ROOT. If this option is used and
|
||||
the PMODULES_ROOT is set, the directory specified with this
|
||||
option will be used.
|
||||
--install_root=DIR
|
||||
Root of the Pmodules environment installation. Everything will be
|
||||
installed in a directory hierarchy with 'DIR' as prefix.
|
||||
The default is '${DEFAULT_INSTALL_ROOT}'.
|
||||
|
||||
--debug
|
||||
Enable verbose/debug output.
|
||||
|
||||
--disable-cleanup )
|
||||
Do not cleanup the tmp directory after compilation and installation.
|
||||
|
||||
--force | -f
|
||||
Force compilation.
|
||||
|
||||
--help
|
||||
--help|-h|-?
|
||||
Print this help text.
|
||||
|
||||
" 1>&2
|
||||
std::die 1 ""
|
||||
}
|
||||
|
||||
pmodules::install() {
|
||||
if [[ -v PMOULES_HOME ]]; then
|
||||
local prefix="${PMODULES_HOME%%/Tools*}"
|
||||
else
|
||||
local prefix="${DEFAULT_PMODULES_ROOT}"
|
||||
fi
|
||||
local config_file=''
|
||||
local opt_force='no'
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# sub-command 'install'
|
||||
#
|
||||
# Install Pmodules files.
|
||||
#
|
||||
build::install() {
|
||||
while (( $# > 0 )); do
|
||||
case $1 in
|
||||
--debug )
|
||||
set -x
|
||||
;;
|
||||
--prefix )
|
||||
prefix="$2"
|
||||
shift 1
|
||||
;;
|
||||
--prefix=* )
|
||||
prefix="${1#*=}"
|
||||
;;
|
||||
-f | --force )
|
||||
opt_force='yes'
|
||||
--install_root | --install_root=* )
|
||||
if [[ $1 == *=* ]]; then
|
||||
INSTALL_ROOT="${1#*=}"
|
||||
else
|
||||
INSTALL_ROOT="$2"
|
||||
shift 1
|
||||
fi
|
||||
;;
|
||||
--help | -h | -\? )
|
||||
pmodules::help_install
|
||||
build::help_install
|
||||
;;
|
||||
-* )
|
||||
std::die 1 "$1: illegal option"
|
||||
illegal_option 'install' "$1"
|
||||
;;
|
||||
* )
|
||||
std::die 1 "$1: illegal argument to sub-command 'install'."
|
||||
illegal_arg 'install' "$1"
|
||||
;;
|
||||
esac
|
||||
shift 1
|
||||
done
|
||||
|
||||
local config_file="${prefix}/${CONFIG_DIR}/${CONFIG_FILE}"
|
||||
read_config_file "${config_file}"
|
||||
: ${INSTALL_ROOT:=${DEFAULT_INSTALL_ROOT}}
|
||||
PREFIX="${INSTALL_ROOT}/${PMOD_DIR}"
|
||||
|
||||
read_config_file "${INSTALL_ROOT}/${CONFIG_FILE}"
|
||||
|
||||
###
|
||||
#
|
||||
# begin installation
|
||||
#
|
||||
echo "Configuration:"
|
||||
echo " root of Pmodules environment: ${prefix}"
|
||||
echo " Pmodule prefix: ${PMODULES_HOME}"
|
||||
sed_cmd="s:@PMODULES_HOME@:${PMODULES_HOME}:g;"
|
||||
sed_cmd+="s:@PMODULES_VERSION@:${PMODULES_VERSION}:g;"
|
||||
sed_cmd+="s:@MODULES_VERSION@:${MODULES_VERSION}:g;"
|
||||
sed_cmd+="s:@PMODULES_DISTFILESDIR@:${PMODULES_DISTFILESDIR}:g;"
|
||||
sed_cmd+="s:@PMODULES_TMPDIR@:${PMODULES_TMPDIR}:g;"
|
||||
sed_cmd+="s:@TCLSHDIR@:${PMODULES_HOME}/${UTILBIN_DIR}:g;"
|
||||
sed_cmd+="s:@pager@::g;"
|
||||
sed_cmd+="s:@pageropts@::g;"
|
||||
sed_cmd+="s:@etcdir@:${PMODULES_ROOT}/${CONFIG_DIR}:g;"
|
||||
echo " root of Pmodules environment: ${INSTALL_ROOT}"
|
||||
echo " Pmodule prefix: ${PREFIX}"
|
||||
sed_cmd+="s:@PMODULES_VERSION@:${VERSION}:g;"
|
||||
sed_cmd+="s:@VERSIONING@:#:g;"
|
||||
sed_cmd+="s:@prefix@:${PMODULES_HOME}:g;"
|
||||
sed_cmd+="s:@initdir@:${PMODULES_HOME}/init:g;"
|
||||
sed_cmd+="s:@MODULES_RELEASE@:${PMODULES_VERSION}:g;"
|
||||
sed_cmd+="s:@BASH@:${PMODULES_HOME}/${UTILBIN_DIR}/bash:g;"
|
||||
sed_cmd+="s:@MODULECMD@:${PMODULES_HOME}/${UTILBIN_DIR}/modulecmd.bash:g;"
|
||||
sed_cmd+="s:@MODMANAGE@:${PMODULES_HOME}/${UTILBIN_DIR}/modmanage.bash:g;"
|
||||
sed_cmd+="s:@BASH@:${PREFIX}/${UTILBIN_DIR}/bash:g;"
|
||||
sed_cmd+="s:@MODULECMD@:${PREFIX}/${UTILBIN_DIR}/modulecmd.bash:g;"
|
||||
|
||||
sed "${sed_cmd}" "${SRC_DIR}/profile.bash.in" \
|
||||
> "${INSTALL_ROOT}/${CONFIG_DIR}/profile.bash-${VERSION}"
|
||||
sed "${sed_cmd}" "${SRC_DIR}/profile.csh.in" \
|
||||
> "${INSTALL_ROOT}/${CONFIG_DIR}/profile.csh-${VERSION}"
|
||||
sed "${sed_cmd}" "${SRC_DIR}/profile.zsh.in" \
|
||||
> "${INSTALL_ROOT}/${CONFIG_DIR}/profile.zsh-${VERSION}"
|
||||
chmod 0644 "${INSTALL_ROOT}/${CONFIG_DIR}"/*-${VERSION}
|
||||
|
||||
test -e "${INSTALL_ROOT}/${CONFIG_DIR}/profile.bash" || \
|
||||
install -m 0644 "$_-${VERSION}" "$_"
|
||||
|
||||
test -e "${INSTALL_ROOT}/${CONFIG_DIR}/profile.csh" || \
|
||||
install -m 0644 "$_-${VERSION}" "$_"
|
||||
|
||||
test -e "${INSTALL_ROOT}/${CONFIG_DIR}/profile.zsh" || \
|
||||
install -m 0644 "$_-${VERSION}" "$_"
|
||||
|
||||
sed "${sed_cmd}" "${SRC_DIR}/modulecmd.in" \
|
||||
> "${PREFIX}/bin/modulecmd"
|
||||
chmod 0755 "${PREFIX}/bin/modulecmd"
|
||||
sed "${sed_cmd}" "${SRC_DIR}/modulecmd.bash.in" \
|
||||
> "${PREFIX}/libexec/modulecmd.bash"
|
||||
chmod 0755 "${PREFIX}/libexec/modulecmd.bash"
|
||||
sed "${sed_cmd}" "${SRC_DIR}/modulecmd.tcl.in" \
|
||||
> "${PREFIX}/libexec/modulecmd.tcl"
|
||||
chmod 0755 "${PREFIX}/libexec/modulecmd.tcl"
|
||||
|
||||
sed "${sed_cmd}" "${SRC_DIR}/libpmodules.bash.in" \
|
||||
> "${PREFIX}/lib/libpmodules.bash"
|
||||
chmod 0755 "${PREFIX}/lib/libpmodules.bash"
|
||||
|
||||
sed "${sed_cmd}" "${SRC_DIR}/modbuild.in" \
|
||||
> "${PREFIX}/bin/modbuild"
|
||||
chmod 0755 "${PREFIX}/bin/modbuild"
|
||||
|
||||
sed "${sed_cmd}" "${SRC_DIR}/modmanage.in" \
|
||||
> "${PREFIX}/bin/modmanage"
|
||||
chmod 0755 "${PREFIX}/bin/modmanage"
|
||||
sed "${sed_cmd}" "${SRC_DIR}/modmanage.bash.in" \
|
||||
> "${PREFIX}/libexec/modmanage.bash"
|
||||
chmod 0755 "${PREFIX}/libexec/modmanage.bash"
|
||||
|
||||
test -e "${INSTALL_ROOT}/${CONFIG_FILE}" || \
|
||||
install -m 0644 "$_" "${INSTALL_ROOT}/${CONFIG_DIR}"
|
||||
|
||||
sed "${sed_cmd}" "${SRC_DIR}/profile.bash.in" > "${PMODULES_ROOT}/${CONFIG_DIR}/profile.bash-${PMODULES_VERSION}"
|
||||
sed "${sed_cmd}" "${SRC_DIR}/profile.csh.in" > "${PMODULES_ROOT}/${CONFIG_DIR}/profile.csh-${PMODULES_VERSION}"
|
||||
sed "${sed_cmd}" "${SRC_DIR}/profile.zsh.in" > "${PMODULES_ROOT}/${CONFIG_DIR}/profile.zsh-${PMODULES_VERSION}"
|
||||
chmod 0644 "${PMODULES_ROOT}/${CONFIG_DIR}"/*-${PMODULES_VERSION}
|
||||
install -m 0755 "${SRC_DIR}/yq.$(uname -m)_$(uname -s)" "${PREFIX}/libexec/yq"
|
||||
install -m 0644 "${SRC_DIR}/bash" "${PREFIX}/init"
|
||||
install -m 0644 "${SRC_DIR}/bash_completion" "${PREFIX}/init"
|
||||
install -m 0644 "${SRC_DIR}/csh" "${PREFIX}/init"
|
||||
install -m 0644 "${SRC_DIR}/zsh" "${PREFIX}/init"
|
||||
|
||||
test -e "${PMODULES_ROOT}/${CONFIG_DIR}/profile.bash" || \
|
||||
install -m 0644 "$_-${PMODULES_VERSION}" "$_"
|
||||
|
||||
test -e "${PMODULES_ROOT}/${CONFIG_DIR}/profile.csh" || \
|
||||
install -m 0644 "$_-${PMODULES_VERSION}" "$_"
|
||||
|
||||
test -e "${PMODULES_ROOT}/${CONFIG_DIR}/profile.zsh" || \
|
||||
install -m 0644 "$_-${PMODULES_VERSION}" "$_"
|
||||
|
||||
sed "${sed_cmd}" "${SRC_DIR}/modulecmd.in" > "${PMODULES_HOME}/bin/modulecmd"
|
||||
chmod 0755 "${PMODULES_HOME}/bin/modulecmd"
|
||||
sed "${sed_cmd}" "${SRC_DIR}/modulecmd.bash.in" > "${PMODULES_HOME}/libexec/modulecmd.bash"
|
||||
chmod 0755 "${PMODULES_HOME}/libexec/modulecmd.bash"
|
||||
sed "${sed_cmd}" "${SRC_DIR}/modulecmd.tcl.in" > "${PMODULES_HOME}/libexec/modulecmd.tcl"
|
||||
chmod 0755 "${PMODULES_HOME}/libexec/modulecmd.tcl"
|
||||
|
||||
sed "${sed_cmd}" "${SRC_DIR}/libpmodules.bash.in" > "${SRC_DIR}/libpmodules.bash"
|
||||
chmod 0755 "${SRC_DIR}/libpmodules.bash"
|
||||
|
||||
sed "${sed_cmd}" "${SRC_DIR}/libpmodules.bash.in" > "${PMODULES_HOME}/lib/libpmodules.bash"
|
||||
chmod 0755 "${PMODULES_HOME}/lib/libpmodules.bash"
|
||||
|
||||
sed "${sed_cmd}" "${SRC_DIR}/modbuild.in" > "${PMODULES_HOME}/bin/modbuild"
|
||||
chmod 0755 "${PMODULES_HOME}/bin/modbuild"
|
||||
|
||||
sed "${sed_cmd}" "${SRC_DIR}/modmanage.in" > "${PMODULES_HOME}/bin/modmanage"
|
||||
chmod 0755 "${PMODULES_HOME}/bin/modmanage"
|
||||
sed "${sed_cmd}" "${SRC_DIR}/modmanage.bash.in" > "${PMODULES_HOME}/libexec/modmanage.bash"
|
||||
chmod 0755 "${PMODULES_HOME}/libexec/modmanage.bash"
|
||||
|
||||
test -e "${PMODULES_ROOT}/${CONFIG_DIR}/Pmodules.yaml" || \
|
||||
install -m 0644 "$_" "${PMODULES_ROOT}/${CONFIG_DIR}"
|
||||
|
||||
install -m 0755 "${SRC_DIR}/yq.$(uname -m)_$(uname -s)" "${PMODULES_HOME}/libexec/yq"
|
||||
install -m 0644 "${SRC_DIR}/bash" "${PMODULES_HOME}/init"
|
||||
install -m 0644 "${SRC_DIR}/bash_completion" "${PMODULES_HOME}/init"
|
||||
install -m 0644 "${SRC_DIR}/csh" "${PMODULES_HOME}/init"
|
||||
install -m 0644 "${SRC_DIR}/zsh" "${PMODULES_HOME}/init"
|
||||
|
||||
install -m 0644 "${SRC_DIR}/libpbuild.bash" "${PMODULES_HOME}/lib"
|
||||
install -m 0644 "${SRC_DIR}/libpbuild_dyn.bash" "${PMODULES_HOME}/lib"
|
||||
install -m 0644 "${SRC_DIR}/libstd.bash" "${PMODULES_HOME}/lib"
|
||||
install -m 0755 -d "${PMODULES_HOME}/lib/Pmodules"
|
||||
install -m 0644 "${SRC_DIR}/libmodules.tcl" "${PMODULES_HOME}/lib/Pmodules"
|
||||
install -m 0644 "${SRC_DIR}/libpbuild.bash" "${PREFIX}/lib"
|
||||
install -m 0644 "${SRC_DIR}/libstd.bash" "${PREFIX}/lib"
|
||||
install -m 0755 -d "${PREFIX}/lib/Pmodules"
|
||||
install -m 0644 "${SRC_DIR}/libmodules.tcl" "${PREFIX}/lib/Pmodules"
|
||||
|
||||
{
|
||||
PATH="${PMODULES_HOME}/${UTILBIN_DIR}:${PATH}"
|
||||
cd "${PMODULES_HOME}/lib/Pmodules"
|
||||
PATH="${PREFIX}/${UTILBIN_DIR}:${PATH}"
|
||||
cd "${PREFIX}/lib/Pmodules"
|
||||
"${BOOTSTRAP_DIR}/mkindex.tcl"
|
||||
}
|
||||
|
||||
install -m 0644 "${SRC_DIR}/modulefile" "${PMODULES_ROOT}/Tools/modulefiles/Pmodules/${PMODULES_VERSION}"
|
||||
install -m 0644 \
|
||||
"${SRC_DIR}/modulefile" \
|
||||
"${INSTALL_ROOT}/Tools/modulefiles/Pmodules/${VERSION}"
|
||||
|
||||
echo "Done..."
|
||||
}
|
||||
|
||||
#=============================================================================
|
||||
#
|
||||
|
||||
declare -a build_opts=()
|
||||
build_opts+=( '--bootstrap' )
|
||||
|
||||
declare subcmd=''
|
||||
declare -a subcmd_args=()
|
||||
|
||||
@@ -550,7 +534,7 @@ done
|
||||
|
||||
[[ -n "${subcmd}" ]] || std::die 1 "Missing sub-command.\n\nUse 'build --help' to get help..."
|
||||
|
||||
pmodules::${subcmd} "${subcmd_args[@]}"
|
||||
build::${subcmd} "${subcmd_args[@]}"
|
||||
|
||||
# Local Variables:
|
||||
# mode: sh
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
: ${PMODULES_DISTFILESDIR:=@PMODULES_DISTFILESDIR@}
|
||||
: ${PMODULES_TMPDIR:=@PMODULES_TMPDIR@}
|
||||
export PMODULES_DISTFILESDIR
|
||||
export PMODULES_TMPDIR
|
||||
|
||||
declare -x PMODULES_HOME="@PMODULES_ROOT@/Tools/Pmodules/${PMODULES_VERSION}"
|
||||
|
||||
declare -x DefaultGroups='Tools Programming'
|
||||
declare ReleaseStages=':unstable:stable:deprecated:'
|
||||
declare DefaultReleaseStages='stable'
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
bash 5.1.16
|
||||
findutils 4.9.0
|
||||
getopt 1.1.6
|
||||
modules 3.2.10.1
|
||||
Pmodules 1.1.8
|
||||
Tcl 8.6.12
|
||||
tcllib 1.20
|
||||
@@ -0,0 +1,117 @@
|
||||
= Overlays
|
||||
:TOC:
|
||||
:sectnums:
|
||||
|
||||
Please note: This document is work in progress!
|
||||
|
||||
== What are Overlays and for what can they be used?
|
||||
|
||||
== Overlay configuration
|
||||
|
||||
=== System wide
|
||||
|
||||
==== Example
|
||||
.A system wide configuration file `/opt/psi/config/Pmodules.yaml`
|
||||
====
|
||||
....
|
||||
DefaultGroups: Tools:Programming
|
||||
DefaultReleaseStages: stable
|
||||
ReleaseStages: unstable:stable:deprecated
|
||||
TmpDir: /opt/psi/var/tmp/${USER}
|
||||
DistfilesDir: /opt/psi/var/distfiles
|
||||
|
||||
Overlays:
|
||||
base:
|
||||
install_root: /opt/psi
|
||||
modulefiles_root: /opt/psi
|
||||
devel:
|
||||
install_root: /opt/psi
|
||||
modulefiles_root: ${HOME}/modulefiles
|
||||
....
|
||||
====
|
||||
==== YAML Format
|
||||
.Format
|
||||
====
|
||||
....
|
||||
Overlays:
|
||||
<name>:
|
||||
install_root: <installation-root>
|
||||
modulefiles_root: <modulefiles-root>
|
||||
type: <type of overlay>
|
||||
...
|
||||
....
|
||||
====
|
||||
`<name>`:: Name of overlay. Note: whitespace in the name is not supported.
|
||||
`<name>.install_root`:: The root of the software installation. This key is mandatory.
|
||||
`<name>.modulefiles_root`:: The root of the modulefile hierarchy. This key is optional and defaults to `<name>.install_root>
|
||||
`<name>.type`:: The type of the overlay, see below. This key is optional and the default value is `n`.
|
||||
|
||||
==== Overlay types
|
||||
`n`:: Normal overlay.
|
||||
`h`:: Hiding overlay.
|
||||
`r`:: Replacing overlay.
|
||||
|
||||
=== User defined overlays
|
||||
|
||||
Each user can define his own overlays in `$HOME/.Pmodules/Pmodules.yaml`.
|
||||
|
||||
== Working with overlays
|
||||
|
||||
== Building modules
|
||||
|
||||
The old format of the variants file is simple but very limited and almost impossible to extend for new features. To overcome the limitations a new format using YAML for variants files has been introduced. For the time being both format are supported. But it is highly recommended to use the YAML format for new modules and to migrate existing variants files in the old format to the new.
|
||||
|
||||
=== With a YAML variants file
|
||||
|
||||
==== Example of a variants file in YAML format
|
||||
.A YAML variants file
|
||||
====
|
||||
....
|
||||
overlay: base
|
||||
|
||||
hdf5_serial/1.12.2:
|
||||
- with: gcc/{5.5.0,6.5.0,7.5.0,10.2.0,10.3.0}
|
||||
relstage: stable
|
||||
- with: gcc/{8.5.0,9.5.0,11.3.0,12.1.0}
|
||||
relstage: unstable
|
||||
overlay: devel
|
||||
....
|
||||
====
|
||||
|
||||
==== Format specification
|
||||
.YAML format
|
||||
....
|
||||
relstage: <default-release-stage>
|
||||
overlay: <default-overlay>
|
||||
systems: <default-systems>
|
||||
|
||||
<name>/<version>:
|
||||
- with: <hierarchical-build-dependencies>
|
||||
dependencies: <other-build-dependencies>
|
||||
relstate: <release-stage>
|
||||
overlay: <overlay>
|
||||
systems: <systems>
|
||||
...
|
||||
...
|
||||
....
|
||||
==== Defaults
|
||||
Default values can be overriden per version/variant.
|
||||
|
||||
`overlay`:: The default overlay the module will be installed in. This value can be overriden for dedicated versions/variants.
|
||||
`systems`:: The default for supported systems.
|
||||
|
||||
==== Versions and Variants
|
||||
|
||||
`<name>/<version>`:: An array with variants for this version.
|
||||
|
||||
`<name>/<version>.[i].with`:: Hierarchical dependencies for variant `i`.
|
||||
|
||||
`<name>/<version>.[i].dependencies`:: Build/run-time dependencies for variant `i`.
|
||||
|
||||
`<name>/<version>.[i].relstage`:: Relase stage of variant `i`.
|
||||
|
||||
`<name>/<version>.[i].overlay`:: Overlay of variant `i`.
|
||||
|
||||
`<name>/<version>.[i].systems`:: Supported systems.
|
||||
|
||||
=== Legacy format
|
||||
Executable
+42
@@ -0,0 +1,42 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# https://www.gnu.org/software/bash/
|
||||
#
|
||||
P=bash
|
||||
V=${BASH5_VERSION:-5.1.16}
|
||||
FNAME="$P-$V.tar.gz"
|
||||
DOWNLOAD_URL="https://ftp.gnu.org/gnu/$P/${FNAME}"
|
||||
|
||||
source "$(dirname "$0")/librecipes.bash"
|
||||
|
||||
#---
|
||||
# configure
|
||||
mkdir -p "${BUILD_DIR}" && cd "$_" || exit ${PB_ERR_SYSTEM}
|
||||
loadablesdir="${PREFIX}/${UTILBIN_DIR}/builtins" \
|
||||
"${SRC_DIR}/configure" \
|
||||
--prefix="${PREFIX}" \
|
||||
--bindir="${PREFIX}/${UTILBIN_DIR}" \
|
||||
|| exit ${PB_ERR_CONFIGURE}
|
||||
|
||||
#---
|
||||
# compile
|
||||
make -j ${NJOBS} || exit ${PB_ERR_MAKE}
|
||||
make -C examples/loadables -j ${NJOBS} || exit ${PB_ERR_MAKE}
|
||||
|
||||
#---
|
||||
# install
|
||||
make install || exit ${PB_ERR_INSTALL}
|
||||
|
||||
#---
|
||||
# post-install
|
||||
rm -rf "${PREFIX}/include/bash"
|
||||
rm -rf "${PREFIX}/share/locale"
|
||||
rm -rf "${PREFIX}/share/doc"
|
||||
rm -rf "${PREFIX}/share/info"
|
||||
rm -rf "${PREFIX}/share/man/man1/bash"*
|
||||
|
||||
#---
|
||||
# Local Variables:
|
||||
# mode: shell-script-mode
|
||||
# sh-basic-offset: 8
|
||||
# End:
|
||||
Executable
+60
@@ -0,0 +1,60 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# https://www.tcl.tk
|
||||
#
|
||||
P=tcl
|
||||
V=${TCL_VERSION:-8.6.12}
|
||||
FNAME="$P$V-src.tar.gz"
|
||||
DOWNLOAD_URL="https://prdownloads.sourceforge.net/tcl/${FNAME}"
|
||||
|
||||
source "$(dirname "$0")/librecipes.bash"
|
||||
|
||||
#---
|
||||
# download
|
||||
test -r "${SRC_FILE}" || curl -L --output "$_" "${DOWNLOAD_URL}" || exit ${PB_ERR_DOWNLOAD}
|
||||
|
||||
#---
|
||||
# unpack
|
||||
mkdir -p "${SRC_DIR}" && cd "$_" || exit ${PB_ERR_SYSTEM}
|
||||
tar --directory "${SRC_DIR}" --strip-components 1 -xv -f "${SRC_FILE}" || exit ${PB_ERR_UNTAR}
|
||||
|
||||
#---
|
||||
# configure
|
||||
mkdir -p "${BUILD_DIR}" && cd "$_" || exit ${PB_ERR_SYSTEM}
|
||||
case $(uname -s) in
|
||||
Linux )
|
||||
srcdir="${SRC_DIR}/unix"
|
||||
;;
|
||||
Darwin )
|
||||
srcdir="${SRC_DIR}/macosx"
|
||||
;;
|
||||
* )
|
||||
echo "Oops: unsupported OS!" 1>&2
|
||||
exit ${PB_ERR_SYSTEM}
|
||||
;;
|
||||
esac
|
||||
"${srcdir}"/configure \
|
||||
--prefix="${PREFIX}" \
|
||||
--bindir="${PREFIX}/${UTILBIN_DIR}" \
|
||||
--mandir="${PREFIX}/share/man" \
|
||||
--enable-shared=no \
|
||||
|| exit ${PB_ERR_CONFIGURE}
|
||||
|
||||
#---
|
||||
# compile & install
|
||||
make -j ${NJOBS} || exit ${PB_ERR_MAKE}
|
||||
make install || exit ${PB_ERR_INSTALL}
|
||||
|
||||
#---
|
||||
# post-install
|
||||
{ cd "${PREFIX}/${UTILBIN_DIR}" && rm -f tclsh && ln -fs tclsh${V%.*} tclsh; };
|
||||
|
||||
rm -rf "${PREFIX}/share/man/man1/tclsh.1"
|
||||
rm -rf "${PREFIX}/share/man/man3"
|
||||
rm -rf "${PREFIX}/share/man/mann"
|
||||
|
||||
#---
|
||||
# Local Variables:
|
||||
# mode: shell-script-mode
|
||||
# sh-basic-offset: 8
|
||||
# End:
|
||||
Executable
+48
@@ -0,0 +1,48 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# https://core.tcl-lang.org
|
||||
#
|
||||
P=tcllib
|
||||
V=${TCLLIB_VERSION:-1.21}
|
||||
FNAME="$P-$V.tar.gz"
|
||||
DOWNLOAD_URL="https://core.tcl-lang.org/tcllib/uv/${FNAME}"
|
||||
|
||||
source "$(dirname "$0")/librecipes.bash"
|
||||
|
||||
#---
|
||||
# download
|
||||
test -r "${SRC_FILE}" || curl -L --output "$_" "${DOWNLOAD_URL}" || exit ${PB_ERR_DOWNLOAD}
|
||||
|
||||
#---
|
||||
# unpack
|
||||
mkdir -p "${SRC_DIR}" && cd "$_" || exit ${PB_ERR_SYSTEM}
|
||||
tar --directory "${SRC_DIR}" --strip-components 1 -xv -f "${SRC_FILE}" || exit ${PB_ERR_UNTAR}
|
||||
# configure
|
||||
mkdir -p "${BUILD_DIR}" && cd "$_" || exit ${PB_ERR_SYSTEM}
|
||||
"${SRC_DIR}"/configure \
|
||||
--prefix="${PREFIX}" \
|
||||
--mandir="${PREFIX}/share/man" \
|
||||
|| exit ${PB_ERR_CONFIGURE}
|
||||
|
||||
#---
|
||||
# compile & install
|
||||
make -j ${NJOBS} || exit ${PB_ERR_MAKE}
|
||||
make install || exit ${PB_ERR_INSTALL}
|
||||
|
||||
#---
|
||||
# post-install
|
||||
rm -rf "${PREFIX}/share/man/mann"
|
||||
rm -f "${PREFIX}/bin/dtplite"
|
||||
rm -f "${PREFIX}/bin/mkdoc"
|
||||
rm -f "${PREFIX}/bin/nns"
|
||||
rm -f "${PREFIX}/bin/nnsd"
|
||||
rm -f "${PREFIX}/bin/nnslog"
|
||||
rm -f "${PREFIX}/bin/page"
|
||||
rm -f "${PREFIX}/bin/pt"
|
||||
rm -f "${PREFIX}/bin/tcldocstrip"
|
||||
|
||||
#---
|
||||
# Local Variables:
|
||||
# mode: shell-script-mode
|
||||
# sh-basic-offset: 8
|
||||
# End:
|
||||
Executable
+59
@@ -0,0 +1,59 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# https://core.tcl-lang.org
|
||||
#
|
||||
P=modules
|
||||
V=${MODULES_VERSION:-3.2.10.1}
|
||||
FNAME="$P-$V.tar.gz"
|
||||
DOWNLOAD_URL="https://amas.web.psi.ch/Downloads/$P/$P-$V.tar.bz2"
|
||||
|
||||
source "$(dirname "$0")/librecipes.bash"
|
||||
|
||||
#---
|
||||
# configure
|
||||
mkdir -p "${BUILD_DIR}" && cd "$_" || exit ${PB_ERR_SYSTEM}
|
||||
case $(uname -s) in
|
||||
Linux )
|
||||
declare -x LIBS="-lz -lpthread"
|
||||
;;
|
||||
Darwin )
|
||||
declare -x LIBS="-lz -framework CoreFoundation"
|
||||
;;
|
||||
* )
|
||||
echo "Oops: unsupported OS!" 1>&2
|
||||
exit ${PB_ERR_SYSTEM}
|
||||
;;
|
||||
esac
|
||||
CPPFLAGS="-DUSE_INTERP_ERRORLINE" \
|
||||
"${SRC_DIR}"/configure \
|
||||
--prefix="${PREFIX}" \
|
||||
--exec-prefix="${PREFIX}" \
|
||||
--with-module-path="${PREFIX%%/Tools*}/Tools/${PMODULES_MODULEFILES_DIR}" \
|
||||
--with-tcl="${PREFIX}/lib" \
|
||||
--without-x \
|
||||
--disable-versioning \
|
||||
|| exit ${PB_ERR_CONFIGURE}
|
||||
|
||||
#---
|
||||
# compile & install
|
||||
make -j ${NJOBS} || exit ${PB_ERR_MAKE}
|
||||
make install || exit ${PB_ERR_INSTALL}
|
||||
|
||||
#---
|
||||
# post-install
|
||||
mkdir -p "${PREFIX}/share/man/man1"
|
||||
mkdir -p "${PREFIX}/share/man/man4"
|
||||
mv -v "${PREFIX}/Modules/share/man/man1/module.1" "${PREFIX}/share/man/man1"
|
||||
mv -v "${PREFIX}/Modules/share/man/man4/modulefile.4" "${PREFIX}/share/man/man4"
|
||||
mkdir -p "${PREFIX}/libexec"
|
||||
cp -v "${BUILD_DIR}/modulecmd" "${PREFIX}/libexec/modulecmd.bin" || exit 1
|
||||
|
||||
rm -rf "${PREFIX}/Modules"
|
||||
rm -f "${PREIX}"/init/{ksh,perl.pm,python.py,ruby.rb,cmake,.modulespath}
|
||||
|
||||
#---
|
||||
# Local Variables:
|
||||
# mode: sh
|
||||
# sh-basic-offset: 8
|
||||
# tab-width: 8
|
||||
# End:
|
||||
Executable
+52
@@ -0,0 +1,52 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# https://frodo.looijaard.name/project/getopt
|
||||
#
|
||||
P=getopt
|
||||
V=${GETOPT_VERSION:-1.1.6}
|
||||
FNAME="$P-$V.tar.gz"
|
||||
DOWNLOAD_URL="http://frodo.looijaard.name/system/files/software/$P/$P-$V.tar.gz"
|
||||
|
||||
#---
|
||||
# build on macOS only
|
||||
[[ $(uname -s) == 'Darwin' ]] || exit 0
|
||||
|
||||
#---
|
||||
source "$(dirname "$0")/librecipes.bash"
|
||||
|
||||
#---
|
||||
# configure
|
||||
# nothing to configure but we need gettext from Macports
|
||||
if [[ ! -d '/opt/local/bin' ]] || [[ ! -x '/opt/local/bin/msgfmt' ]]; then
|
||||
echo "gettext port from Macports is required to build 'getopt'!" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#---
|
||||
# compile
|
||||
PATH+=':/opt/local/bin'
|
||||
declare -x C_INCLUDE_PATH="${PREFIX}/include:/opt/local/include"
|
||||
declare -x LDFLAGS="/opt/local/lib/libintl.a /opt/local/lib/libiconv.a -framework CoreFoundation"
|
||||
declare -x LIBRARY_PATH="${PREFIX}/lib"
|
||||
|
||||
make -e all || exit 1
|
||||
|
||||
#---
|
||||
# install
|
||||
declare -x DESTDIR="${PREFIX}"
|
||||
declare -x prefix=''
|
||||
#PATH="${PREFIX}/${UTILBIN_DIR}:${PATH}"
|
||||
make -e install
|
||||
|
||||
#---
|
||||
# post-install
|
||||
mv "${PREFIX}/bin/getopt" "${PREFIX}/${UTILBIN_DIR}"
|
||||
rm -rf "${PREFIX}/man"
|
||||
rm -rf "${PREFIX}/share/locale"
|
||||
|
||||
#---
|
||||
# Local Variables:
|
||||
# mode: sh
|
||||
# sh-basic-offset: 8
|
||||
# tab-width: 8
|
||||
# End:
|
||||
Executable
+43
@@ -0,0 +1,43 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# https://www.gnu.org/software/findutils/
|
||||
#
|
||||
P=findutils
|
||||
V=${FINDUTILS_VERSION:-4.9.0}
|
||||
FNAME="$P-$V.tar.xz"
|
||||
DOWNLOAD_URL="https://ftp.gnu.org/gnu/$P/${FNAME}"
|
||||
|
||||
#---
|
||||
# build on macOS only
|
||||
[[ $(uname -s) == 'Darwin' ]] || exit 0
|
||||
|
||||
#---
|
||||
source "$(dirname "$0")/librecipes.bash"
|
||||
|
||||
#---
|
||||
# configure
|
||||
mkdir -p "${BUILD_DIR}" && cd "$_" || exit ${PB_ERR_SYSTEM}
|
||||
loadablesdir="${PREFIX}/${UTILBIN_DIR}/builtins" \
|
||||
"${SRC_DIR}/configure" \
|
||||
--prefix="${PREFIX}" \
|
||||
--bindir="${PREFIX}/${UTILBIN_DIR}" \
|
||||
|| exit ${PB_ERR_CONFIGURE}
|
||||
|
||||
#---
|
||||
# compile & install
|
||||
make -j ${NJOBS} || exit ${PB_ERR_MAKE}
|
||||
make install || exit ${PB_ERR_INSTALL}
|
||||
|
||||
#---
|
||||
# post-install
|
||||
rm -vf "${PREFIX}/share/man/man5/locatedb.5"
|
||||
rm -vf "${PREFIX}/share/man/man1/updatedb.1"
|
||||
rm -vf "${PREFIX}/share/man/man1/xargs.1"
|
||||
rm -vf "${PREFIX}/share/man/man1/locate.1"
|
||||
rm -vf "${PREFIX}/share/man/man1/find.1"
|
||||
|
||||
#---
|
||||
# Local Variables:
|
||||
# mode: shell-script-mode
|
||||
# sh-basic-offset: 8
|
||||
# End:
|
||||
@@ -0,0 +1,91 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -x
|
||||
set -o errexit
|
||||
set -o pipefail
|
||||
shopt -s nullglob
|
||||
|
||||
if (( $# == 0 )); then
|
||||
echo "Usage: $0 <dest-dir>" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
PREFIX="$1"
|
||||
if [[ ! -d ${PREFIX} ]]; then
|
||||
echo "Destinstion directory '${PREFIX}' does not exist! Aborting..." 1>&2
|
||||
exit 2
|
||||
fi
|
||||
TMP_DIR="${PMODULES_TMPDIR:-/var/tmp/${USER}}"
|
||||
DOWNLOADS_DIR="${PMODULES_DISTFILESDIR:-${TMP_DIR}/Downloads}"
|
||||
SRC_DIR="${TMP_DIR}/$P-$V/src"
|
||||
BUILD_DIR="${TMP_DIR}/$P-$V/build"
|
||||
SRC_FILE="${DOWNLOADS_DIR}/${FNAME}"
|
||||
|
||||
|
||||
declare -ix PB_ERR_ARG=1
|
||||
declare -ix PB_ERR_SETUP=2
|
||||
declare -ix PB_ERR_SYSTEM=3
|
||||
declare -ix PB_ERR_DOWNLOAD=4
|
||||
declare -ix PB_ERR_UNTAR=5
|
||||
declare -ix PB_ERR_CONFIGURE=6
|
||||
declare -ix PB_ERR_MAKE=7
|
||||
declare -ix PB_ERR_PRE_INSTALL=8
|
||||
declare -ix PB_ERR_INSTALL=9
|
||||
declare -ix PB_ERR_POST_INSTALL=10
|
||||
declare -ix PB_ERR=255
|
||||
declare -ix NJOBS=4
|
||||
|
||||
pb_exit() {
|
||||
local -i ec=$?
|
||||
if [[ -n "${BASH_VERSION}" ]]; then
|
||||
local -i n=${#BASH_SOURCE[@]}
|
||||
local -r recipe_name="${BASH_SOURCE[n]}"
|
||||
else
|
||||
local -r recipe_name="${ZSH_ARGZERO}"
|
||||
fi
|
||||
echo -n "${recipe_name}: "
|
||||
if (( ec == 0 )); then
|
||||
echo "done!"
|
||||
elif (( ec == PB_ERR_ARG )); then
|
||||
echo "argument error!"
|
||||
elif (( ec == PB_ERR_SETUP )); then
|
||||
echo "error in setting everything up!"
|
||||
elif (( ec == PB_ERR_SYSTEM )); then
|
||||
echo "unexpected system error!"
|
||||
elif (( ec == PB_ERR_DOWNLOAD )); then
|
||||
echo "error in downloading the source file!"
|
||||
elif (( ec == PB_ERR_UNTAR )); then
|
||||
echo "error in un-taring the source file!"
|
||||
elif (( ec == PB_ERR_CONFIGURE )); then
|
||||
echo "error in configuring the software!"
|
||||
elif (( ec == PB_ERR_MAKE )); then
|
||||
echo "error in compiling the software!"
|
||||
elif (( ec == PB_ERR_PRE_INSTALL )); then
|
||||
echo "error in pre-installing the software!"
|
||||
elif (( ec == PB_ERR_INSTALL )); then
|
||||
echo "error in installing the software!"
|
||||
elif (( ec == PB_ERR_POST_INSTALL )); then
|
||||
echo "error in post-installing the software!"
|
||||
else
|
||||
echo "oops, unknown error!!!"
|
||||
fi
|
||||
exit ${ec}
|
||||
}
|
||||
#export -f pb_exit > /dev/null
|
||||
trap "pb_exit" EXIT
|
||||
|
||||
#---
|
||||
# download
|
||||
mkdir -p "${DOWNLOADS_DIR}" || exit ${PB_ERR_SYSTEM}
|
||||
test -r "${SRC_FILE}" || curl -L --output "$_" "${DOWNLOAD_URL}" || exit ${PB_ERR_DOWNLOAD}
|
||||
|
||||
#---
|
||||
# unpack
|
||||
mkdir -p "${SRC_DIR}" && cd "$_" || exit ${PB_ERR_SYSTEM}
|
||||
tar --directory "${SRC_DIR}" --strip-components 1 -xv -f "${SRC_FILE}" || exit ${PB_ERR_UNTAR}
|
||||
|
||||
#---
|
||||
# Local Variables:
|
||||
# mode: shell-script-mode
|
||||
# sh-basic-offset: 8
|
||||
# End:
|
||||
Reference in New Issue
Block a user