Merge branch 'master' of gitorious.psi.ch:scicomp/psi-modules-buildenvironment
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
||||
tmp
|
||||
*~
|
||||
|
||||
2
config/pmodules_version.conf
Normal file
2
config/pmodules_version.conf
Normal file
@@ -0,0 +1,2 @@
|
||||
PMODULES_VERSION=0.99.0
|
||||
MODULES_VERSION=3.2.10
|
||||
@@ -1,11 +1,14 @@
|
||||
autoconf 2.69
|
||||
automake 1.14
|
||||
bash 4.3.30
|
||||
boost 1.55.0
|
||||
BoxLib 2014-02-28
|
||||
cmake 2.8.12.2
|
||||
dialog 1.2.1
|
||||
emacs 24.3
|
||||
filebench 1.4.9.1
|
||||
getopt 1.1.6
|
||||
gettext 0.19.4
|
||||
giflib 5.0.6
|
||||
gmp 5.1.1
|
||||
gnuplot 4.6.3
|
||||
@@ -36,6 +39,7 @@ Python 3.4.0
|
||||
root 5.34.19
|
||||
SuperLU 4.3
|
||||
SuperLU_DIST 3.3
|
||||
Tcl 8.6.3
|
||||
tiff 4.0.3
|
||||
trilinos 11.10.2
|
||||
UMFPACK 5.6.2
|
||||
|
||||
278
lib/libem.bash
278
lib/libem.bash
@@ -5,25 +5,17 @@ PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin
|
||||
shopt -s expand_aliases
|
||||
|
||||
source "${PSI_PREFIX}/${PSI_CONFIG_DIR}/profile.bash"
|
||||
module use unstable
|
||||
|
||||
declare -r MODULECMD="${PSI_PREFIX}/${PSI_CONFIG_DIR}/modulecmd.bash"
|
||||
|
||||
declare -r BUILDSCRIPT=$( cd $(dirname "$0") && pwd )/$(basename "$0")
|
||||
declare -rx ARGS="$@"
|
||||
declare -rx SHLIBDIR=$( cd $(dirname "$BASH_SOURCE") && pwd )
|
||||
declare -r OS=$(uname -s)
|
||||
declare -r BUILDSCRIPT=$( cd $(dirname "$0") && pwd )/$(basename "$0")
|
||||
declare -rx ARGS="$@"
|
||||
declare -rx SHLIBDIR=$( cd $(dirname "$BASH_SOURCE") && pwd )
|
||||
declare -r OS=$(uname -s)
|
||||
|
||||
# number of parallel make jobs
|
||||
declare -i JOBS=3
|
||||
declare -i JOBS=3
|
||||
|
||||
source "${SHLIBDIR}/lib.bash"
|
||||
|
||||
# while bootstraping the module command is not yet available
|
||||
if typeset -f module > /dev/null 2>&1 ; then
|
||||
module purge
|
||||
fi
|
||||
|
||||
declare -rx BUILD_BASEDIR=$(abspath $SHLIBDIR/..)
|
||||
|
||||
source "$(readlink ${BUILD_BASEDIR}/config/environment.bash)"
|
||||
@@ -37,6 +29,7 @@ declare -xr BUILD_VERSIONSFILE="${BUILD_CONFIGDIR}/versions.conf"
|
||||
if [[ -z "${BUILD_CONFIGDIR}/families.d/"*.conf ]]; then
|
||||
die 1 "Default family configuration not set in ${BUILD_CONFIGDIR}/families.d"
|
||||
fi
|
||||
|
||||
for f in "${BUILD_CONFIGDIR}/families.d/"*.conf; do
|
||||
source "${f}"
|
||||
done
|
||||
@@ -47,7 +40,6 @@ declare -x MODULE_FAMILY=''
|
||||
declare -x MODULE_RELEASE=''
|
||||
declare cur_module_release=''
|
||||
|
||||
|
||||
declare DEPEND_RELEASE=''
|
||||
declare -x MODULE_NAME=''
|
||||
|
||||
@@ -58,16 +50,13 @@ declare -x MODULE_BUILDDIR=''
|
||||
declare -x MODULE_BUILD_DEPENDENCIES
|
||||
declare -x MODULE_DEPENDENCIES
|
||||
|
||||
declare -x C_INCLUDE_PATH
|
||||
declare -x CPLUS_INCLUDE_PATH
|
||||
declare -x CPP_INCLUDE_PATH
|
||||
declare -x LIBRARY_PATH
|
||||
declare -x LD_LIBRARY_PATH
|
||||
declare -x DYLD_LIBRARY_PATH
|
||||
declare -x C_INCLUDE_PATH
|
||||
declare -x CPLUS_INCLUDE_PATH
|
||||
declare -x CPP_INCLUDE_PATH
|
||||
declare -x LIBRARY_PATH
|
||||
declare -x LD_LIBRARY_PATH
|
||||
declare -x DYLD_LIBRARY_PATH
|
||||
|
||||
if [[ $DEBUG_ON ]]; then
|
||||
trap 'echo "$BASH_COMMAND"' DEBUG
|
||||
fi
|
||||
|
||||
function usage() {
|
||||
error "
|
||||
@@ -92,6 +81,9 @@ ENV=VALUE
|
||||
-f | --force-rebuild
|
||||
Force rebuild of module.
|
||||
|
||||
-b | --bootstrap
|
||||
Bootstrap Pmodules
|
||||
|
||||
--with=P/V
|
||||
Preload module P with version V. To preload multiple modules,
|
||||
use this option per module. Nete that order may matter.
|
||||
@@ -103,18 +95,15 @@ ENV=VALUE
|
||||
}
|
||||
|
||||
|
||||
P=$(basename $0)
|
||||
P=${P%.*}
|
||||
_P=$(echo $P | tr [:lower:] [:upper:])
|
||||
_P=${_P//-/_}
|
||||
_V=${_P}_VERSION
|
||||
|
||||
DEBUG_ON=''
|
||||
FORCE_REBUILD=''
|
||||
debug_on='no'
|
||||
force_rebuild='no'
|
||||
ENVIRONMENT_ARGS=''
|
||||
WITH_ARGS=''
|
||||
DRY_RUN=''
|
||||
dry_run='no'
|
||||
bootstrap='no'
|
||||
|
||||
# array collecting all modules specified on the command line via '--with=module'
|
||||
with_modules=()
|
||||
|
||||
while (( $# > 0 )); do
|
||||
case $1 in
|
||||
-j )
|
||||
@@ -125,16 +114,20 @@ while (( $# > 0 )); do
|
||||
JOBS=${1/--jobs=}
|
||||
;;
|
||||
-v | --verbose)
|
||||
DEBUG_ON=':'
|
||||
debug_on='yes'
|
||||
;;
|
||||
-f | --force-rebuild )
|
||||
FORCE_REBUILD=':'
|
||||
force_rebuild='yes'
|
||||
;;
|
||||
-b | --bootstrap )
|
||||
bootstrap='yes'
|
||||
force_rebuild='yes'
|
||||
;;
|
||||
-? | -h | --help )
|
||||
usage
|
||||
;;
|
||||
--dry-run )
|
||||
DRY_RUN='dry-run'
|
||||
dry_run='yes'
|
||||
;;
|
||||
--release=* )
|
||||
MODULE_RELEASE=${1/--release=}
|
||||
@@ -153,6 +146,22 @@ while (( $# > 0 )); do
|
||||
shift
|
||||
done
|
||||
|
||||
if [[ ${debug_on} == yes ]]; then
|
||||
trap 'echo "$BASH_COMMAND"' DEBUG
|
||||
fi
|
||||
|
||||
# while bootstraping the module command is not yet available
|
||||
if [[ ${bootstrap} == no ]]; then
|
||||
[[ -x ${MODULECMD} ]] || die 1 "${MODULECMD}: no such executable"
|
||||
module use unstable
|
||||
module purge
|
||||
fi
|
||||
|
||||
P=$(basename $0)
|
||||
P=${P%.*}
|
||||
_P=$(echo $P | tr [:lower:] [:upper:])
|
||||
_P=${_P//-/_}
|
||||
_V=${_P}_VERSION
|
||||
|
||||
eval "${ENVIRONMENT_ARGS}"
|
||||
|
||||
@@ -233,7 +242,9 @@ function _load_build_dependencies() {
|
||||
die 1 "${m}: module available with release \"${rel}\", add this release with \"module use ${rel}\" and re-run build script."
|
||||
fi
|
||||
done
|
||||
[[ ${DRY_RUN} ]] && die 1 "${m}: module does not exist, cannot continue with dry run..."
|
||||
[[ ${dry_run} == yes ]] && {
|
||||
die 1 "${m}: module does not exist, cannot continue with dry run..."
|
||||
}
|
||||
|
||||
echo "$m: module does not exist, trying to build it..."
|
||||
local args=( '' )
|
||||
@@ -272,13 +283,13 @@ function _load_build_dependencies() {
|
||||
tmp=${tmp/${modulepath_root}\/}
|
||||
tmp=${tmp%%/*}
|
||||
local _family=( ${tmp//./ } )
|
||||
# set module release to 'deprecated' if a build dependency
|
||||
# is deprecated
|
||||
if [[ ${_family[1]} == deprecated ]]; then
|
||||
# set module release to 'deprecated' if a build dependency
|
||||
# is deprecated
|
||||
DEPEND_RELEASE='deprecated'
|
||||
# set module release to 'unstable' if a build dependency is
|
||||
# unstable and release not yet set
|
||||
elif [[ ${_family[1]} == unstable ]] && [[ -z ${DEPEND_RELEASE} ]]; then
|
||||
# set module release to 'unstable' if a build dependency is
|
||||
# unstable and release not yet set
|
||||
DEPEND_RELEASE='unstable'
|
||||
fi
|
||||
echo "Loading module: ${m}"
|
||||
@@ -286,6 +297,12 @@ function _load_build_dependencies() {
|
||||
done
|
||||
}
|
||||
|
||||
if [[ ${bootstrap} == yes ]]; then
|
||||
function _load_build_dependencies() {
|
||||
:
|
||||
}
|
||||
fi
|
||||
|
||||
function _write_runtime_dependencies() {
|
||||
local -r fname="${PREFIX}/.dependencies"
|
||||
info "Writing run-time dependencies to ${fname}"
|
||||
@@ -325,6 +342,12 @@ function _setup_env1() {
|
||||
LD_LIBRARY_PATH=''
|
||||
DYLD_LIBRARY_PATH=''
|
||||
|
||||
CFLAGS=''
|
||||
CPPFLAGS=''
|
||||
CXXFLAGS=''
|
||||
LIBS=''
|
||||
LDFLAGS=''
|
||||
|
||||
while read _name _version; do
|
||||
[[ -z ${_name} ]] && continue
|
||||
[[ -z ${_version} ]] && continue
|
||||
@@ -344,7 +367,8 @@ function _setup_env2() {
|
||||
# overwrite environment variables with values we got on the cmd line
|
||||
eval "${ENVIRONMENT_ARGS}"
|
||||
|
||||
# this allows us to specify the version as PKGNAME_VERSION=1.2.3 on the cmd-line
|
||||
# this allows us to specify the version as PKGNAME_VERSION=1.2.3 on
|
||||
# the cmd-line
|
||||
if [[ -z $V ]]; then
|
||||
V=$(eval echo \$${_P}_VERSION)
|
||||
fi
|
||||
@@ -354,47 +378,67 @@ function _setup_env2() {
|
||||
die 1 "$P: Missing version."
|
||||
fi
|
||||
MODULE_SRCDIR="${BUILD_TMPDIR}/src/${P/_serial}-$V"
|
||||
MODULE_BUILDDIR="${BUILD_TMPDIR}/build/$P-$V/$COMPILER/$COMPILER_VERSION"
|
||||
MODULE_BUILDDIR="${BUILD_TMPDIR}/build/$P-$V"
|
||||
|
||||
# build module name
|
||||
# :FIXME: the MODULE_PREFIX should be derived from MODULE_NAME
|
||||
# :FIXME: this should be read from a configuration file
|
||||
case ${MODULE_FAMILY} in
|
||||
Tools )
|
||||
MODULE_RPREFIX="${P}/${V}"
|
||||
MODULE_NAME="${P}/${V}"
|
||||
;;
|
||||
Programming )
|
||||
MODULE_RPREFIX="${P}/${V}"
|
||||
MODULE_NAME="${P}/${V}"
|
||||
;;
|
||||
Libraries )
|
||||
MODULE_RPREFIX="${P}/${V}"
|
||||
MODULE_NAME="${P}/${V}"
|
||||
;;
|
||||
System )
|
||||
MODULE_RPREFIX="${P}/${V}"
|
||||
MODULE_NAME="${P}/${V}"
|
||||
;;
|
||||
Compiler )
|
||||
MODULE_RPREFIX="${P}/${V}/${COMPILER}/${COMPILER_VERSION}"
|
||||
MODULE_NAME="${COMPILER}/${COMPILER_VERSION}/${P}/${V}"
|
||||
;;
|
||||
MPI )
|
||||
MODULE_RPREFIX="${P}/${V}/${MPI}/${MPI_VERSION}/${COMPILER}/${COMPILER_VERSION}"
|
||||
MODULE_NAME="${COMPILER}/${COMPILER_VERSION}/${MPI}/${MPI_VERSION}/${P}/${V}"
|
||||
;;
|
||||
HDF5 )
|
||||
MODULE_RPREFIX="${P}/${V}/${HDF5}/${HDF5_VERSION}/${MPI}/${MPI_VERSION}/${COMPILER}/${COMPILER_VERSION}/"
|
||||
MODULE_NAME="${COMPILER}/${COMPILER_VERSION}/${MPI}/${MPI_VERSION}/${HDF5}/${HDF5_VERSION}/${P}/${V}"
|
||||
;;
|
||||
HDF5_serial )
|
||||
MODULE_RPREFIX="${P}/${V}/hdf5_serial/${HDF5_SERIAL_VERSION}/${COMPILER}/${COMPILER_VERSION}"
|
||||
MODULE_NAME="${COMPILER}/${COMPILER_VERSION}/hdf5_serial/${HDF5_VERSION}/${P}/${V}"
|
||||
;;
|
||||
* )
|
||||
die 1 "$P: oops: unknown family: ${MODULE_FAMILY}"
|
||||
;;
|
||||
Tools )
|
||||
MODULE_RPREFIX="${P}/${V}"
|
||||
MODULE_NAME="${P}/${V}"
|
||||
;;
|
||||
Programming )
|
||||
MODULE_RPREFIX="${P}/${V}"
|
||||
MODULE_NAME="${P}/${V}"
|
||||
;;
|
||||
Libraries )
|
||||
MODULE_RPREFIX="${P}/${V}"
|
||||
MODULE_NAME="${P}/${V}"
|
||||
;;
|
||||
System )
|
||||
MODULE_RPREFIX="${P}/${V}"
|
||||
MODULE_NAME="${P}/${V}"
|
||||
;;
|
||||
Compiler )
|
||||
MODULE_RPREFIX="${P}/${V}"
|
||||
MODULE_RPREFIX+="/${COMPILER}/${COMPILER_VERSION}"
|
||||
|
||||
MODULE_NAME="${COMPILER}/${COMPILER_VERSION}/"
|
||||
MODULE_NAME+="${P}/${V}"
|
||||
;;
|
||||
MPI )
|
||||
MODULE_RPREFIX="${P}/${V}/"
|
||||
MODULE_RPREFIX+="${MPI}/${MPI_VERSION}/"
|
||||
MODULE_RPREFIX+="${COMPILER}/${COMPILER_VERSION}"
|
||||
|
||||
MODULE_NAME="${COMPILER}/${COMPILER_VERSION}/"
|
||||
MODULE_NAME+="${MPI}/${MPI_VERSION}/"
|
||||
MODULE_NAME+="${P}/${V}"
|
||||
;;
|
||||
HDF5 )
|
||||
MODULE_RPREFIX="${P}/${V}"
|
||||
MODULE_RPREFIX+="/${HDF5}/${HDF5_VERSION}"
|
||||
MODULE_RPREFIX+="/${MPI}/${MPI_VERSION}"
|
||||
MODULE_RPREFIX+="/${COMPILER}/${COMPILER_VERSION}"
|
||||
|
||||
MODULE_NAME="${COMPILER}/${COMPILER_VERSION}/"
|
||||
MODULE_NAME+="${MPI}/${MPI_VERSION}/"
|
||||
MODULE_NAME+="${HDF5}/${HDF5_VERSION}/"
|
||||
MODULE_NAME+="${P}/${V}"
|
||||
;;
|
||||
HDF5_serial )
|
||||
MODULE_RPREFIX="${P}/${V}"
|
||||
MODULE_RPREFIX+="/hdf5_serial/${HDF5_SERIAL_VERSION}"
|
||||
MODULE_RPREFIX+="/${COMPILER}/${COMPILER_VERSION}"
|
||||
|
||||
MODULE_NAME="${COMPILER}/${COMPILER_VERSION}/"
|
||||
MODULE_NAME+="hdf5_serial/${HDF5_VERSION}/"
|
||||
MODULE_NAME+="${P}/${V}"
|
||||
;;
|
||||
* )
|
||||
die 1 "$P: oops: unknown family: ${MODULE_FAMILY}"
|
||||
;;
|
||||
esac
|
||||
|
||||
# set PREFIX of module
|
||||
@@ -430,7 +474,8 @@ function _setup_env2() {
|
||||
# release is stable
|
||||
# - if all build-dependency are stable or
|
||||
# - the module already exists and is stable
|
||||
# - an unstable release of the module exists and the release is changed to stable on the command line
|
||||
# - an unstable release of the module exists and the release is
|
||||
# changed to stable on the command line
|
||||
elif [[ "${depend_release}" == 'stable' ]] \
|
||||
|| [[ "${cur_module_release}" == 'stable' ]] \
|
||||
|| [[ "${MODULE_RELEASE}" == 'stable' ]]; then
|
||||
@@ -439,7 +484,8 @@ function _setup_env2() {
|
||||
#
|
||||
# release is unstable
|
||||
# - if a build-dependency is unstable or
|
||||
# - if the module does not exists and no other release-type is given on the command line
|
||||
# - if the module does not exists and no other release-type is
|
||||
# given on the command line
|
||||
# - and all the cases I didn't think of
|
||||
else
|
||||
MODULE_RELEASE='unstable'
|
||||
@@ -466,6 +512,59 @@ function _setup_env2() {
|
||||
|
||||
}
|
||||
|
||||
if [[ ${bootstrap} == yes ]]; then
|
||||
# redefine function for bootstrapping
|
||||
function _setup_env2() {
|
||||
if [[ -z ${MODULE_FAMILY} ]]; then
|
||||
die 1 "$P: family not set."
|
||||
fi
|
||||
|
||||
if [[ -z $V ]]; then
|
||||
V=$(eval echo \$${_P}_VERSION)
|
||||
fi
|
||||
|
||||
# oops, we need a version
|
||||
if [[ -z $V ]]; then
|
||||
die 1 "$P: Missing version."
|
||||
fi
|
||||
MODULE_SRCDIR="${BUILD_TMPDIR}/src/${P/_serial}-$V"
|
||||
MODULE_BUILDDIR="${BUILD_TMPDIR}/build/$P-$V"
|
||||
MODULE_FAMILY='Tools'
|
||||
MODULE_NAME="Pmodules/0.99.0"
|
||||
# set PREFIX of module
|
||||
PREFIX="${PSI_PREFIX}/${MODULE_FAMILY}/${MODULE_NAME}"
|
||||
|
||||
MODULE_RELEASE='unstable'
|
||||
info "${MODULE_NAME}: will be released as \"${MODULE_RELEASE}\""
|
||||
|
||||
# directory for README's, license files etc
|
||||
DOCDIR="${PREFIX}/share/doc/$P"
|
||||
|
||||
# set tar-ball and flags for tar
|
||||
TARBALL="${BUILD_DOWNLOADSDIR}/${P/_serial}"
|
||||
if [[ -r "${TARBALL}-${V}.tar.gz" ]]; then
|
||||
TARBALL+="-${V}.tar.gz"
|
||||
elif [[ -r "${TARBALL}-${OS}-${V}.tar.gz" ]]; then
|
||||
TARBALL+="-${OS}-${V}.tar.gz"
|
||||
elif [[ -r "${TARBALL}-${V}.tar.bz2" ]]; then
|
||||
TARBALL+="-${V}.tar.bz2"
|
||||
elif [[ -r "${TARBALL}-${OS}-${V}.tar.bz2" ]]; then
|
||||
TARBALL+="-${OS}-${V}.tar.bz2"
|
||||
else
|
||||
error "tar-ball for $P/$V not found."
|
||||
exit 43
|
||||
fi
|
||||
C_INCLUDE_PATH="${PREFIX}/include"
|
||||
CPLUS_INCLUDE_PATH="${PREFIX}/include"
|
||||
CPP_INCLUDE_PATH="${PREFIX}/include"
|
||||
LIBRARY_PATH="${PREFIX}/lib"
|
||||
LD_LIBRARY_PATH="${PREFIX}/lib"
|
||||
DYLD_LIBRARY_PATH="${PREFIX}/lib"
|
||||
|
||||
PATH+=":${PREFIX}/bin"
|
||||
}
|
||||
fi
|
||||
|
||||
function _prep() {
|
||||
|
||||
# untar sources
|
||||
@@ -526,7 +625,7 @@ function _set_link() {
|
||||
echo "${MODULE_RELEASE}" > "${release_file}"
|
||||
}
|
||||
|
||||
function _cleanup_build() {
|
||||
function em.cleanup_build() {
|
||||
(
|
||||
[[ -d /${MODULE_BUILDDIR} ]] || return 0
|
||||
cd "/${MODULE_BUILDDIR}/..";
|
||||
@@ -581,9 +680,9 @@ function em.make_all() {
|
||||
# setup module specific environment
|
||||
_setup_env2
|
||||
|
||||
if [[ ! -d "${PREFIX}" ]] || [[ ${FORCE_REBUILD} ]]; then
|
||||
if [[ ! -d "${PREFIX}" ]] || [[ ${force_rebuild} == 'yes' ]]; then
|
||||
echo "Building $P/$V ..."
|
||||
[[ "${DRY_RUN}" ]] && die 0 ""
|
||||
[[ ${dry_run} == yes ]] && die 0 ""
|
||||
_check_compiler
|
||||
_prep
|
||||
cd "${MODULE_SRCDIR}"
|
||||
@@ -595,17 +694,20 @@ function em.make_all() {
|
||||
em.post_install
|
||||
em.install_doc
|
||||
_post_install
|
||||
_write_runtime_dependencies
|
||||
_write_build_dependencies
|
||||
if [[ ${bootstrap} == 'no' ]]; then
|
||||
_write_runtime_dependencies
|
||||
_write_build_dependencies
|
||||
fi
|
||||
|
||||
else
|
||||
echo "Not rebuilding $P/$V ..."
|
||||
fi
|
||||
_set_link
|
||||
_cleanup_build
|
||||
if [[ ${bootstrap} == 'no' ]]; then
|
||||
_set_link
|
||||
fi
|
||||
em.cleanup_build
|
||||
}
|
||||
|
||||
|
||||
# Local Variables:
|
||||
# mode: sh
|
||||
# sh-basic-offset: 8
|
||||
|
||||
57
scripts/Bootstrap/Modules.build
Executable file
57
scripts/Bootstrap/Modules.build
Executable file
@@ -0,0 +1,57 @@
|
||||
#!/bin/bash
|
||||
#set -o functrace
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
TCL_DIR="${PSI_PREFIX}/Tools/Pmodules/0.99.0"
|
||||
|
||||
PATH="${TCL_DIR}/bin:${PATH}"
|
||||
|
||||
function em.configure() {
|
||||
case ${OS} in
|
||||
Linux )
|
||||
declare -x LIBS="-lz -lpthread"
|
||||
;;
|
||||
Darwin )
|
||||
declare -x LIBS="-lz -framework CoreFoundation"
|
||||
;;
|
||||
esac
|
||||
CPPFLAGS="-DUSE_INTERP_ERRORLINE" "${MODULE_SRCDIR}"/configure \
|
||||
--prefix="${PREFIX}" \
|
||||
--exec-prefix="${PREFIX}" \
|
||||
--with-module-path="${PSI_PREFIX}/${PSI_MODULES_ROOT}" \
|
||||
--with-tcl="${TCL_DIR}/lib" \
|
||||
--without-x \
|
||||
--disable-versioning \
|
||||
|| exit 1
|
||||
}
|
||||
|
||||
function em.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
|
||||
}
|
||||
|
||||
# fake module command
|
||||
module() {
|
||||
:
|
||||
}
|
||||
|
||||
# use system gcc to compile
|
||||
declare -rx CC=gcc
|
||||
|
||||
em.add_to_family 'Tools'
|
||||
em.make_all
|
||||
|
||||
# Local Variables:
|
||||
# mode: sh
|
||||
# sh-basic-offset: 8
|
||||
# tab-width: 8
|
||||
# End:
|
||||
1
scripts/Bootstrap/Tcl.build
Symbolic link
1
scripts/Bootstrap/Tcl.build
Symbolic link
@@ -0,0 +1 @@
|
||||
../Programming/Tcl.build
|
||||
70
scripts/Bootstrap/bash
Normal file
70
scripts/Bootstrap/bash
Normal file
@@ -0,0 +1,70 @@
|
||||
#!/bin/bash
|
||||
|
||||
if [ ${BASH_VERSINFO:-0} -lt 3 ]; then
|
||||
echo "BASH version ${BASH_VERSION} ist not supported! You need at least version 3..."
|
||||
return
|
||||
fi
|
||||
|
||||
if [ "${LOADEDMODULES:-}" = "" ]; then
|
||||
declare -x LOADEDMODULES=
|
||||
fi
|
||||
|
||||
if [[ -r "${PSI_BASH_COMPLETION}" ]]; then
|
||||
source "${PSI_BASH_COMPLETION}"
|
||||
fi
|
||||
|
||||
module() {
|
||||
local -r modulecmd="${PMODULES_HOME}/bin/modulecmd"
|
||||
|
||||
local -a args=()
|
||||
local -a switches=()
|
||||
local -a sub_switches=()
|
||||
local subcommand=''
|
||||
|
||||
while (( $# > 0 )); do
|
||||
case $1 in
|
||||
-u|--userlvl )
|
||||
switches+=( $1 $2 )
|
||||
shift 2
|
||||
;;
|
||||
-* )
|
||||
switches+=( $1 )
|
||||
shift
|
||||
;;
|
||||
[a-z]* )
|
||||
subcommand=$1
|
||||
shift
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
while (( $# > 0 ));do
|
||||
case $1 in
|
||||
-* )
|
||||
sub_switches+=( $1 )
|
||||
;;
|
||||
[a-zA-Z]* )
|
||||
args+=( $1 )
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
if [[ ${subcommand} == '' ]]; then
|
||||
subcommand='help'
|
||||
fi
|
||||
if (( ${#args} == 0 )); then
|
||||
args+=( '' )
|
||||
fi
|
||||
for arg in "${args[@]}"; do
|
||||
eval $( "${modulecmd}" bash ${switches[@]} "${subcommand}" "${sub_switches[@]}" "${arg}" )
|
||||
done
|
||||
}
|
||||
export -f module
|
||||
|
||||
# Local Variables:
|
||||
# mode: sh
|
||||
# sh-basic-offset: 8
|
||||
# tab-width: 8
|
||||
# End:
|
||||
1
scripts/Bootstrap/bash.build
Symbolic link
1
scripts/Bootstrap/bash.build
Symbolic link
@@ -0,0 +1 @@
|
||||
../System/bash.build
|
||||
76
scripts/Bootstrap/bash_completion
Normal file
76
scripts/Bootstrap/bash_completion
Normal file
@@ -0,0 +1,76 @@
|
||||
#
|
||||
# Bash commandline completion (bash 3.0 and above) for Modules 3.2.10
|
||||
#
|
||||
_module_avail() {
|
||||
"${MODULESHOME}"/bin/modulecmd bash -t avail 2>&1 | sed '
|
||||
/:$/d;
|
||||
/:ERROR:/d;
|
||||
s#^\(.*\)/\(.\+\)(default)#\1\n\1\/\2#;
|
||||
s#/(default)##g;
|
||||
s#/*$##g;'
|
||||
}
|
||||
|
||||
_module_not_yet_loaded() {
|
||||
comm -23 <(_module_avail|sort) <(tr : '\n' <<<${LOADEDMODULES}|sort)
|
||||
}
|
||||
|
||||
_module_long_arg_list() {
|
||||
local cur="$1" i
|
||||
|
||||
if [[ ${COMP_WORDS[COMP_CWORD-2]} == sw* ]]
|
||||
then
|
||||
COMPREPLY=( $(compgen -W "$(_module_not_yet_loaded)" -- "$cur") )
|
||||
return
|
||||
fi
|
||||
for ((i = COMP_CWORD - 1; i > 0; i--))
|
||||
do case ${COMP_WORDS[$i]} in
|
||||
add|load)
|
||||
COMPREPLY=( $(compgen -W "$(_module_not_yet_loaded)" -- "$cur") )
|
||||
break;;
|
||||
rm|remove|unload|switch|swap)
|
||||
COMPREPLY=( $(IFS=: compgen -W "${LOADEDMODULES}" -- "$cur") )
|
||||
break;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
_module() {
|
||||
local cur="$2" prev="$3" cmds opts
|
||||
|
||||
COMPREPLY=()
|
||||
|
||||
cmds="add apropos avail clear dependencies display help\
|
||||
initadd initclear initlist initprepend initrm initswitch\
|
||||
keyword list load purge refresh rm search show swap switch sync\
|
||||
unload unuse update use whatis"
|
||||
|
||||
opts="-c -f -h -i -l -s -t -u -v -H -V\
|
||||
--create --force --help --human --icase\
|
||||
--long --silent --terse --userlvl --verbose --version"
|
||||
|
||||
case "$prev" in
|
||||
add|load) COMPREPLY=( $(compgen -W "$(_module_not_yet_loaded)" -- "$cur") );;
|
||||
rm|remove|unload|switch|swap)
|
||||
COMPREPLY=( $(IFS=: compgen -W "${LOADEDMODULES}" -- "$cur") );;
|
||||
unuse) COMPREPLY=( $(IFS=: compgen -W "${MODULEPATH}" -- "$cur") );;
|
||||
use|*-a*) ;; # let readline handle the completion
|
||||
-u|--userlvl) COMPREPLY=( $(compgen -W "novice expert advanced" -- "$cur") );;
|
||||
display|help|show|whatis)
|
||||
COMPREPLY=( $(compgen -W "$(_module_avail)" -- "$cur") );;
|
||||
*) if test $COMP_CWORD -gt 2
|
||||
then
|
||||
_module_long_arg_list "$cur"
|
||||
else
|
||||
case "$cur" in
|
||||
# The mappings below are optional abbreviations for convenience
|
||||
ls) COMPREPLY="list";; # map ls -> list
|
||||
r*) COMPREPLY="rm";; # also covers 'remove'
|
||||
sw*) COMPREPLY="switch";;
|
||||
|
||||
-*) COMPREPLY=( $(compgen -W "$opts" -- "$cur") );;
|
||||
*) COMPREPLY=( $(compgen -W "$cmds" -- "$cur") );;
|
||||
esac
|
||||
fi;;
|
||||
esac
|
||||
}
|
||||
complete -o default -F _module module
|
||||
7
scripts/Bootstrap/bootstrap.sh
Executable file
7
scripts/Bootstrap/bootstrap.sh
Executable file
@@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
declare -r BASE_DIR=$(cd "$(dirname $0)/../.." && pwd)
|
||||
declare -r BOOTSTRAP_DIR="${BASE_DIR}/scripts/Bootstrap"
|
||||
|
||||
${BOOTSTRAP_DIR}/build_pmodules.sh
|
||||
${BOOTSTRAP_DIR}/install_pmodules.sh
|
||||
|
||||
18
scripts/Bootstrap/build_pmodules.sh
Executable file
18
scripts/Bootstrap/build_pmodules.sh
Executable file
@@ -0,0 +1,18 @@
|
||||
#!/bin/bash
|
||||
|
||||
declare -r BASE_DIR=$(cd "$(dirname $0)/../.." && pwd)
|
||||
declare -r BOOTSTRAP_DIR="${BASE_DIR}/scripts/Bootstrap"
|
||||
|
||||
source "/opt/psi/config/environment.bash"
|
||||
source "${BASE_DIR}/config/pmodules_version.conf"
|
||||
|
||||
${BOOTSTRAP_DIR}/gettext.build --bootstrap
|
||||
${BOOTSTRAP_DIR}/getopt.build --bootstrap
|
||||
${BOOTSTRAP_DIR}/dialog.build --bootstrap
|
||||
${BOOTSTRAP_DIR}/bash.build --bootstrap
|
||||
${BOOTSTRAP_DIR}/Tcl.build --bootstrap
|
||||
|
||||
# we have to remove the init directory - otherwise the next build will fail...
|
||||
rm -rf "${PMODULES_HOME}/init"
|
||||
${BOOTSTRAP_DIR}/Modules.build --bootstrap
|
||||
mv -v "${PMODULES_HOME}/bin/modulecmd" "${PMODULES_HOME}/bin/modulecmd.tcl"
|
||||
346
scripts/Bootstrap/dialog.bash
Executable file
346
scripts/Bootstrap/dialog.bash
Executable file
@@ -0,0 +1,346 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Hardcoded path to dialog software
|
||||
LOCAL_DIALOGHOME=Tools/dialog/1.2.1
|
||||
DIALOG_CMD=$PSI_PREFIX/$LOCAL_DIALOGHOME/bin/dialog
|
||||
|
||||
declare -a modlist # module info
|
||||
declare -A selected # module info indices selected
|
||||
declare -a depcnt # dependency reference counter by module info index
|
||||
declare -A uidmap # unique module id to module info index
|
||||
declare -A modmap # map module names to module info indices for modlist
|
||||
declare -A fdmap # module name to family definition mapping
|
||||
declare -A fmmap # module name to family member mapping
|
||||
declare -a relmap # module info index to release mapping
|
||||
declare tempfile # temporary dialog results
|
||||
|
||||
function set_difference() { # $1 \ $2
|
||||
local -a operand1=($1)
|
||||
local -a operand2=($2)
|
||||
local -A members
|
||||
local -i elem
|
||||
for elem in "${operand1[@]}"; do
|
||||
members[$elem]=1
|
||||
done
|
||||
for elem in "${operand2[@]}"; do
|
||||
unset members[$elem]
|
||||
done
|
||||
echo ${!members[@]}
|
||||
}
|
||||
|
||||
function set_merge() { # $1 U $2 (where $1 and $2 are disjoint)
|
||||
if [[ -z "$1" ]]; then
|
||||
echo "$2"
|
||||
elif [[ -z "$2" ]]; then
|
||||
echo "$1"
|
||||
else
|
||||
echo "$1 $2"
|
||||
fi
|
||||
}
|
||||
|
||||
function set_union() { # $1 U $2 (sorted)
|
||||
local -a operand1=($1)
|
||||
local -a operand2=($2)
|
||||
local -A members
|
||||
local -i elem
|
||||
for elem in ${operand1[@]} ${operand2[@]}; do
|
||||
members[$elem]=1
|
||||
done
|
||||
{ IFS=$'\n'; echo "${!members[*]}"; } | sort -n
|
||||
}
|
||||
|
||||
# unique id for a module
|
||||
function unique_id() { # $1: module info index
|
||||
local -a minfo=( ${modlist[$1]} )
|
||||
if (( ${#minfo[@]} < 4 )); then
|
||||
echo ${minfo[0]}
|
||||
else
|
||||
echo "${minfo[@]:3} ${minfo[0]}"
|
||||
fi
|
||||
}
|
||||
|
||||
function mod_path() { # $1: module info index
|
||||
local -i i
|
||||
local -a m=(${modlist[$1]})
|
||||
local res="$PSI_PREFIX/${fmmap[${m[0]%%/*}]}/${m[0]}"
|
||||
for (( i=${#m[@]}; i>3; i-- )); do
|
||||
res+="/${m[i-1]}"
|
||||
done
|
||||
echo "$res"
|
||||
}
|
||||
|
||||
function calc_deps() { # $1: module info index
|
||||
local dpath="$(mod_path $1)/.dependencies"
|
||||
[[ ! -r "$dpath" ]] && return
|
||||
local -a d=( $(< "$dpath") ) # dependencies as versioned module names
|
||||
local -A p # map family to versioned module name
|
||||
local -A did # map dependency (versioned module name) to unique module id
|
||||
local -a deps # set of module info indices
|
||||
local m n f
|
||||
for m in ${d[@]}; do
|
||||
n=${m%%/*}
|
||||
f=${fdmap[$n]}
|
||||
[[ -n "$f" ]] && { p[$f]=$m; }
|
||||
f=${fmmap[$n]}
|
||||
if [[ -z "$f" ]]; then
|
||||
did[$m]=$m
|
||||
else
|
||||
n=${p[$f]}
|
||||
if [[ -z "$n" ]]; then
|
||||
did[$m]=$m
|
||||
else
|
||||
did[$m]="${did[$n]} $m"
|
||||
fi
|
||||
fi
|
||||
deps+=( ${uidmap["${did[$m]}"]} )
|
||||
done
|
||||
echo "${deps[@]}"
|
||||
}
|
||||
|
||||
function update_deps() { # $1: 1-add dependency, -1-remove dependency $2: set of module info indices
|
||||
[[ -z "$2" ]] && return
|
||||
local -a q=($2) # work queue
|
||||
local deps="" # set of dependencies
|
||||
local -i m
|
||||
while (( ${#q[@]} > 0 )); do
|
||||
m=${q[-1]}
|
||||
unset q[-1]
|
||||
d="$(calc_deps $m)"
|
||||
[[ -z "$d" ]] && continue
|
||||
d="$(set_difference "$d" "$deps")"
|
||||
[[ -z "$d" ]] && continue
|
||||
q+=($d)
|
||||
deps="$(set_merge "$d" "$deps")"
|
||||
done
|
||||
for m in $deps; do
|
||||
let depcnt[m]+=$1
|
||||
done
|
||||
}
|
||||
|
||||
function find_modules() {
|
||||
# construct modlist/modmap/uidmap/depcnt/fmmap/relmap arrays from module search output
|
||||
local -a mc # module info components
|
||||
local -i i=0
|
||||
local current=""
|
||||
local name m
|
||||
while read m; do
|
||||
mc=($m)
|
||||
[[ "${mc[2]}" == "Legacy" ]] && continue # filter out legacy stuff
|
||||
name=${mc[0]%%/*}
|
||||
if [[ "$current" != "$name" ]]; then
|
||||
modmap[$name]="$i"
|
||||
current=$name
|
||||
else
|
||||
modmap[$name]+=" $i"
|
||||
fi
|
||||
modlist[i]=$m
|
||||
uidmap[$(unique_id $i)]=$i
|
||||
depcnt[i]=0
|
||||
[[ -z ${fmmap[$name]} ]] && { fmmap[$name]=${mc[2]}; }
|
||||
relmap[i]=${mc[1]}
|
||||
i+=1
|
||||
done
|
||||
}
|
||||
|
||||
function find_families() {
|
||||
# construct fdmap
|
||||
local -a t # tcl file components
|
||||
local l s n
|
||||
while read l; do
|
||||
s=${l%%:*}
|
||||
s=${s%/*}
|
||||
n=${s##*/}
|
||||
if [[ -z "${fdmap[$n]}" ]]; then
|
||||
t=( ${l##*:} )
|
||||
fdmap[$n]=${t[-1]//\"}
|
||||
fi
|
||||
done < <(grep -R set-family "${PSI_PREFIX}/${PSI_MODULES_ROOT}")
|
||||
}
|
||||
|
||||
function select_uid() { # $1: module uid
|
||||
local -a uidc=($1) # uid components
|
||||
local name=${uidc[-1]%%/*} # module name
|
||||
local midx=${uidmap["$1"]} # module info index
|
||||
[[ -z "$midx" ]] && return
|
||||
selected[$name]="$(set_union "${selected[$name]}" "$midx")"
|
||||
update_deps 1 "$midx"
|
||||
}
|
||||
|
||||
function preselect() { # "$1": prefix for preselected modules
|
||||
# module paths must not contain white space
|
||||
[[ -z "$1" ]] && return
|
||||
local -a mpc # module path components
|
||||
local -i i
|
||||
local uid
|
||||
pushd "$1/$PSI_MODULES_ROOT" > /dev/null || exit 1;
|
||||
trap "popd" EXIT
|
||||
|
||||
for m in $(find . -follow -type f); do
|
||||
uid=""
|
||||
mpc=( ${m//\// } )
|
||||
for ((i=2; i<${#mpc[@]}-2; i+=2)); do
|
||||
uid+="${mpc[i]}/${mpc[i+1]} "
|
||||
done
|
||||
uid+="${mpc[-2]}/${mpc[-1]}"
|
||||
PSI_PREFIX="$1" select_uid "$uid"
|
||||
done
|
||||
|
||||
popd
|
||||
trap - EXIT
|
||||
}
|
||||
|
||||
function is_dependency() { # $1: module name
|
||||
local -a map=(${modmap[$1]})
|
||||
local -i m
|
||||
for ((m=0; m<${#map[@]}; m++)); do
|
||||
(( ${depcnt[${map[m]}]} > 0 )) && return 0
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
function dialog_1() {
|
||||
local -a input
|
||||
local marker
|
||||
local m
|
||||
for m in $(IFS=$'\n'; echo "${!modmap[*]}" | sort); do
|
||||
marker=""
|
||||
[[ -n ${selected[$m]} ]] && { marker+="*"; }
|
||||
is_dependency $m && { marker+="+"; }
|
||||
input+=($m "$marker$m")
|
||||
done
|
||||
|
||||
$DIALOG_CMD --ok-label 'Select' \
|
||||
--extra-button --extra-label 'Exit' \
|
||||
--no-tags \
|
||||
--menu Modules 50 80 50 "${input[@]}" 2>$tempfile
|
||||
return $?
|
||||
}
|
||||
|
||||
function module_id() { # $@: module info components
|
||||
echo "$1 ${@:4}"
|
||||
}
|
||||
|
||||
function module_release() { # $@: module info components
|
||||
echo "$2"
|
||||
}
|
||||
|
||||
function dialog_2() { # $1: module name
|
||||
local -a map=(${modmap[$1]})
|
||||
local -a sel=(${selected[$1]})
|
||||
local -i j # mapping index
|
||||
local -i k=0 # selection index
|
||||
local -a input
|
||||
local marker minfo rel m s
|
||||
for (( j=0; j!=${#map[@]}; j++ )); do
|
||||
minfo=${modlist[${map[j]}]}
|
||||
m="$(module_id $minfo)"
|
||||
rel=" ($(module_release $minfo))"
|
||||
[[ $rel = " (stable)" ]] && { rel=""; }
|
||||
[[ "${map[j]}" = "${sel[k]}" ]] && { s="on"; k+=1; } || { s="off"; }
|
||||
(( ${depcnt[${map[j]}]} > 0 )) && { marker="+"; l+=1; } || { marker=""; }
|
||||
input+=( ${map[j]} "$marker$m$rel" $s )
|
||||
done
|
||||
|
||||
$DIALOG_CMD --extra-button --extra-label 'Clear' --no-tags --checklist Versions 80 90 80 "${input[@]}" 2>$tempfile
|
||||
return $?
|
||||
}
|
||||
|
||||
# final dialog output
|
||||
function module_out() { # $1: module info index
|
||||
local -a args=(${modlist[$1]})
|
||||
echo "${args[@]}"
|
||||
}
|
||||
|
||||
# "$1": prefix for preselected modules
|
||||
function module_picker() {
|
||||
find_families
|
||||
find_modules
|
||||
preselect "$1"
|
||||
|
||||
tempfile=$(mktemp ${TMPDIR:-/tmp}/msyncXXXXXX) || {
|
||||
echo "Unable to create temporary file!"
|
||||
exit 1
|
||||
}
|
||||
trap "rm -f $tempfile" EXIT
|
||||
|
||||
local -i level=1
|
||||
local -i operation=0 # 0: OK, 1: Cancel
|
||||
local oldsel
|
||||
local sel
|
||||
local m
|
||||
while (( level != 0 )); do
|
||||
case $level in
|
||||
1)
|
||||
dialog_1
|
||||
res=$?
|
||||
case $res in
|
||||
0) #OK
|
||||
sel=$(< $tempfile)
|
||||
level=2
|
||||
;;
|
||||
1) #Cancel
|
||||
operation=1
|
||||
level=0
|
||||
;;
|
||||
3|255) #ESC/Exit = Commit
|
||||
for m in ${selected[@]}; do
|
||||
depcnt[m]=1
|
||||
done
|
||||
for ((m=0; m<${#depcnt[@]}; m++)); do
|
||||
(( ${depcnt[m]} > 0 )) && module_out $m >&2
|
||||
done
|
||||
level=0
|
||||
;;
|
||||
*)
|
||||
echo "Unknown return value from dialog_1: $res"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
2)
|
||||
dialog_2 $sel
|
||||
res=$?
|
||||
case $res in
|
||||
0) #OK
|
||||
oldsel=${selected[$sel]} # old selection
|
||||
selected[$sel]=$(< $tempfile) # new selection
|
||||
update_deps -1 "$(set_difference "$oldsel" "${selected[$sel]}")" # remove dependencies
|
||||
update_deps 1 "$(set_difference "${selected[$sel]}" "$oldsel")" # add dependencies
|
||||
level=1
|
||||
;;
|
||||
1|255) #ESC/Cancel
|
||||
level=1
|
||||
;;
|
||||
3) #Clear
|
||||
oldsel=${selected[$sel]} # old selection
|
||||
selected[$sel]="" # new selection
|
||||
update_deps -1 "$oldsel" # remove dependencies
|
||||
level=1
|
||||
;;
|
||||
*)
|
||||
echo "Unknown return value from dialog_2: $res"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
echo "Unknown level: $level"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
rm -f $tempfile
|
||||
trap - EXIT
|
||||
|
||||
return $operation
|
||||
}
|
||||
|
||||
# if DIALOG_LIB is NOT set, call module picker
|
||||
[[ ${DIALOG_LIB:+"is_lib"} == "is_lib" ]] || {
|
||||
if [[ -x ${PSI_PREFIX}/${PSI_CONFIG_DIR}/modulecmd.bash ]]; then
|
||||
module_picker "$1" < <(${PSI_PREFIX}/${PSI_CONFIG_DIR}/modulecmd.bash bash search --no-header -a 2>&1)
|
||||
else
|
||||
echo "ERROR: module environment configuration: ${PSI_PREFIX}/${PSI_CONFIG_DIR}/modulecmd.bash is not an executable!"
|
||||
fi
|
||||
}
|
||||
1
scripts/Bootstrap/dialog.build
Symbolic link
1
scripts/Bootstrap/dialog.build
Symbolic link
@@ -0,0 +1 @@
|
||||
../Tools/dialog.build
|
||||
1
scripts/Bootstrap/getopt.build
Symbolic link
1
scripts/Bootstrap/getopt.build
Symbolic link
@@ -0,0 +1 @@
|
||||
../System/getopt.build
|
||||
1
scripts/Bootstrap/gettext.build
Symbolic link
1
scripts/Bootstrap/gettext.build
Symbolic link
@@ -0,0 +1 @@
|
||||
../Tools/gettext.build
|
||||
153
scripts/Bootstrap/init_local_env.bash
Executable file
153
scripts/Bootstrap/init_local_env.bash
Executable file
@@ -0,0 +1,153 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
|
||||
function usage() {
|
||||
PROG=$(basename $0)
|
||||
echo "Usage: $PROG --dir=<directory> [--user=<user>]"
|
||||
echo " Initializes a local module environment in <directory>"
|
||||
echo " for user <user>. <directory> must not exist yet."
|
||||
echo " The <user> parameter must only be present if"
|
||||
echo " $PROG is executed as root."
|
||||
}
|
||||
|
||||
declare force='no'
|
||||
|
||||
while (($# > 0)); do
|
||||
if [[ "${1#--dir}" != "$1" ]]; then
|
||||
option="${1#--dir}"
|
||||
option="${option#=}"
|
||||
[[ -z "$option" ]] && { shift; option="$1"; }
|
||||
ENV_DIR="$option"
|
||||
elif [[ "${1#--user}" != "$1" ]]; then
|
||||
option="${1#--user}"
|
||||
option="${option#=}"
|
||||
[[ -z "$option" ]] && { shift; option="$1"; }
|
||||
ENV_USER="$option"
|
||||
else
|
||||
echo "Error: Unknown option: $1"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
shift
|
||||
done
|
||||
|
||||
[[ -z "$ENV_DIR" ]] && {
|
||||
echo "Error: --dir parameter is required!"
|
||||
usage
|
||||
exit 1
|
||||
}
|
||||
|
||||
if (( EUID == 0 )); then
|
||||
[[ -z "$ENV_USER" ]] && {
|
||||
echo "Error: --user parameter is required!"
|
||||
usage
|
||||
exit 1
|
||||
}
|
||||
USER_ID=$(id -u "$ENV_USER")
|
||||
(( $? == 0 )) || {
|
||||
echo "Error: Unable to retrieve user id of user '$ENV_USER'"
|
||||
exit 1
|
||||
}
|
||||
else
|
||||
[[ -z "$ENV_USER" ]] || {
|
||||
echo "Error: --user option is only allowed if running as root!"
|
||||
usage
|
||||
exit 1
|
||||
}
|
||||
USER_ID=$EUID
|
||||
fi
|
||||
|
||||
if [[ -d "$ENV_DIR" ]] && [[ ${force} == no ]]; then
|
||||
echo "Warning: $ENV_DIR already exists."
|
||||
read -p "Do you really want to re-run the initialization? (y/N) " ans
|
||||
case ${ans} in
|
||||
y|Y )
|
||||
:
|
||||
;;
|
||||
* )
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
echo "Attempting to create a local module environment from a partial copy of the environment at '$PSI_PREFIX'"
|
||||
|
||||
[[ -d "$PSI_PREFIX" ]] &&
|
||||
[[ -d "$PSI_PREFIX/$PSI_CONFIG_DIR" ]] &&
|
||||
[[ -d "$PSI_PREFIX/$PSI_MODULES_ROOT" ]] &&
|
||||
[[ -d "$MODULESHOME" ]] || {
|
||||
echo "Error: the module environment '$PSI_PREFIX' has not been initialized properly!"
|
||||
echo "Maybe it is not a module environment, not accessible, or the init script at"
|
||||
echo "'$PSI_PREFIX/config/profile.bash' has not been sourced."
|
||||
exit 1
|
||||
}
|
||||
|
||||
echo "Creating directory $ENV_DIR..."
|
||||
mkdir -p "$ENV_DIR" || {
|
||||
echo "Error: cannot create directory $ENV_DIR!"
|
||||
exit 1
|
||||
}
|
||||
pushd "$ENV_DIR" || {
|
||||
echo "Error: Cannot change to directory $ENV_DIR"
|
||||
rmdir "$ENV_DIR"
|
||||
exit
|
||||
}
|
||||
ENV_DIR=$(pwd -P)
|
||||
popd
|
||||
trap "rm -rf $ENV_DIR" EXIT
|
||||
|
||||
(( EUID == 0 )) && {
|
||||
echo "Changing owner of directory $ENV_DIR to $ENV_USER..."
|
||||
chown $USER_ID "$ENV_DIR"
|
||||
su $ENV_USER || {
|
||||
echo "Error: cannot change user to $ENV_USER!"
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
(( EUID == USER_ID )) || {
|
||||
echo "Error: attempt to run as user with id $USER_ID failed!"
|
||||
exit 1
|
||||
}
|
||||
|
||||
cd "$ENV_DIR" || {
|
||||
echo "Error: failed to change working directory to $ENV_DIR!"
|
||||
exit 1
|
||||
}
|
||||
|
||||
echo "Copy configuration..."
|
||||
rsync --recursive --links --perms --delete ${PSI_PREFIX}/${PSI_CONFIG_DIR}/ ${PSI_CONFIG_DIR}/ || {
|
||||
echo "Error: copy operation failed!"
|
||||
exit 1
|
||||
}
|
||||
|
||||
echo "Copy module software..."
|
||||
LOCAL_MODHOME=${MODULESHOME#$PSI_PREFIX/}
|
||||
mkdir -p ${LOCAL_MODHOME} || {
|
||||
echo "Error: creating directory for modules software failed!"
|
||||
exit 1
|
||||
}
|
||||
rsync --recursive --links --perms --delete ${MODULESHOME}/ ${LOCAL_MODHOME}/ || {
|
||||
echo "Error: copying modules software failed!"
|
||||
exit 1
|
||||
}
|
||||
|
||||
echo "Create directory $PSI_MODULES_ROOT..."
|
||||
mkdir -p $PSI_MODULES_ROOT || {
|
||||
echo "Error: cannot create directory $PSI_MODULES_ROOT!"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# echo "Using sudo to set the link $PSI_PREFIX to $ENV_DIR..."
|
||||
# sudo bash -c "rm -f $PSI_PREFIX && ln -s $ENV_DIR $PSI_PREFIX" || {
|
||||
# echo "WARNING: The link $PSI_PREFIX could not be set to $ENV_DIR!"
|
||||
# echo "Please set this link manually as root:"
|
||||
# echo " ln -s $ENV_DIR $PSI_PREFIX"
|
||||
# }
|
||||
|
||||
echo "Local module environment created at $ENV_DIR."
|
||||
echo "To use this environment, execute"
|
||||
echo " ln -s $ENV_DIR /opt/psi as root (delete the /opt/psi link if it already exists)"
|
||||
echo " source $ENV_DIR/$PSI_CONFIG_DIR/profile.bash"
|
||||
|
||||
trap - EXIT
|
||||
26
scripts/Bootstrap/install_pmodules.sh
Executable file
26
scripts/Bootstrap/install_pmodules.sh
Executable file
@@ -0,0 +1,26 @@
|
||||
#!/bin/bash
|
||||
|
||||
declare -r BASE_DIR=$(cd "$(dirname $0)/../.." && pwd)
|
||||
declare -r BOOTSTRAP_DIR="${BASE_DIR}/scripts/Bootstrap"
|
||||
|
||||
source "/opt/psi/config/environment.bash"
|
||||
source "${BASE_DIR}/config/pmodules_version.conf"
|
||||
|
||||
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 "${sed_cmd}" "${BOOTSTRAP_DIR}/modulecmd.bash" > "${BOOTSTRAP_DIR}/modulecmd"
|
||||
|
||||
install -d -m 0755 "${PMODULES_HOME}/etc"
|
||||
|
||||
install -m 0755 "${BOOTSTRAP_DIR}/modulecmd" "${PMODULES_HOME}/bin"
|
||||
install -m 0755 "${BOOTSTRAP_DIR}/init_local_env.bash" "${PMODULES_HOME}/bin"
|
||||
install -m 0755 "${BOOTSTRAP_DIR}/modsync.bash" "${PMODULES_HOME}/bin"
|
||||
install -m 0755 "${BOOTSTRAP_DIR}/dialog.bash" "${PMODULES_HOME}/bin"
|
||||
|
||||
install -m 0644 "${BOOTSTRAP_DIR}/modulerc" "${PMODULES_HOME}/etc"
|
||||
|
||||
install -m 0644 "${BOOTSTRAP_DIR}/bash" "${PMODULES_HOME}/init"
|
||||
install -m 0644 "${BOOTSTRAP_DIR}/bash_completion" "${PMODULES_HOME}/init"
|
||||
|
||||
install -m 0644 "${BOOTSTRAP_DIR}/libmodules.tcl" "${PMODULES_HOME}/lib"
|
||||
329
scripts/Bootstrap/libmodules.tcl
Normal file
329
scripts/Bootstrap/libmodules.tcl
Normal file
@@ -0,0 +1,329 @@
|
||||
#
|
||||
# :TODO:
|
||||
# switch/swap
|
||||
# unload modules if parent removed
|
||||
#
|
||||
|
||||
if {[info exists env(PSI_DEBUG)] && $env(PSI_DEBUG)} {
|
||||
proc debug {msg} {
|
||||
set level [expr [info level] -2]
|
||||
set r [catch {info level ${level}} e]
|
||||
if {$r} {
|
||||
set caller ""
|
||||
} else {
|
||||
set caller [lindex [split [info level [expr [info level] - 3]]] 0]
|
||||
}
|
||||
puts -nonewline stderr "${caller}: "
|
||||
puts stderr ${msg}
|
||||
}
|
||||
} else {
|
||||
proc debug {msg} {}
|
||||
}
|
||||
|
||||
proc set-family { family } {
|
||||
global env
|
||||
global name
|
||||
global version
|
||||
global implementation
|
||||
|
||||
debug $family
|
||||
set Implementation [file join {*}${implementation}]
|
||||
|
||||
set FAMILY [string toupper $family]
|
||||
regsub -- "-" ${FAMILY} "_" FAMILY
|
||||
setenv ${FAMILY} $name
|
||||
setenv ${FAMILY}_VERSION $version
|
||||
|
||||
set ::${family} ${name}
|
||||
set ::${family}_version ${version}
|
||||
|
||||
lassign [split ${::family} .] caller_family caller_release
|
||||
if { "${caller_release}" != "" } {
|
||||
set caller_release ".${caller_release}"
|
||||
}
|
||||
debug "caller family: ${caller_family}, release: ${caller_release}"
|
||||
|
||||
if { [module-info mode load] } {
|
||||
debug "mode is load"
|
||||
append-path MODULEPATH ${::MODULE_ROOT_PATH}/${family}/${Implementation}
|
||||
append-path PSI_LOADEDFAMILIES ${family}
|
||||
debug "mode=load: new MODULEPATH=$env(MODULEPATH)"
|
||||
debug "mode=load: new PSI_LOADEDFAMILIES=$env(PSI_LOADEDFAMILIES)"
|
||||
} elseif { [module-info mode remove] } {
|
||||
# remove orphan modules
|
||||
debug "remove orphan modules"
|
||||
set FAMILY [string toupper $family]
|
||||
if { [info exists env(PSI_ACTIVE_MODULES_${FAMILY})] } {
|
||||
set modules [split $env(PSI_ACTIVE_MODULES_${FAMILY}) ":"]
|
||||
foreach m ${modules} {
|
||||
if { ${m} == "--APPMARKER--" } {
|
||||
continue
|
||||
}
|
||||
debug "unloading module: $m"
|
||||
module unload ${m}
|
||||
}
|
||||
}
|
||||
remove-path MODULEPATH ${::MODULE_ROOT_PATH}/${family}/${Implementation}
|
||||
remove-path PSI_LOADEDFAMILIES ${family}
|
||||
debug "mode=remove: $env(MODULEPATH)"
|
||||
debug "mode=remove: $env(PSI_LOADEDFAMILIES)"
|
||||
}
|
||||
if { [module-info mode switch2] } {
|
||||
debug "mode=switch2"
|
||||
append-path MODULEPATH ${::MODULE_ROOT_PATH}/${family}/[module-info name]
|
||||
append-path PSI_LOADEDFAMILIES ${family}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
proc update_active_modules { family name version } {
|
||||
if { ${family} == "--APPMARKER--" } {
|
||||
return
|
||||
}
|
||||
set FAMILY [string toupper $family]
|
||||
append-path PSI_ACTIVE_MODULES_${FAMILY} "$name/$version"
|
||||
remove-path PSI_ACTIVE_MODULES_${FAMILY} "--APPMARKER--"
|
||||
}
|
||||
|
||||
proc is-avail { m } {
|
||||
debug "${m}"
|
||||
set output [catch { exec "$::env(MODULESHOME)/bin/modulecmd" bash avail "${m}" } msg]
|
||||
if { ${output} != "" } {
|
||||
return yes
|
||||
} else {
|
||||
return no
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
# load dependencies, but do *not* unload dependencies
|
||||
#
|
||||
proc load_dependencies { fname } {
|
||||
if { ! [ file exists ${fname} ] } {
|
||||
return
|
||||
}
|
||||
if { ! [module-info mode load] } {
|
||||
return
|
||||
}
|
||||
debug "load dependencies from: ${fname}"
|
||||
# Slurp up the data file
|
||||
set fp [open ${fname} r]
|
||||
set file_data [read ${fp}]
|
||||
close ${fp}
|
||||
set data [split ${file_data} "\n"]
|
||||
foreach line ${data} {
|
||||
debug "MODULEPATH=$::env(MODULEPATH)"
|
||||
set module_name [string trim $line]
|
||||
if { ${module_name} == "#" || ${module_name} == "" } {
|
||||
continue
|
||||
}
|
||||
if { [is-loaded ${module_name}] } {
|
||||
debug "module already loaded: ${module_name}"
|
||||
continue
|
||||
}
|
||||
debug "module avail: ${module_name}"
|
||||
if { ! [is-avail "${module_name}"] } {
|
||||
debug "module not in current MODULEPATH: ${module_name}"
|
||||
set search_output [exec $::env(PSI_PREFIX)/config/init/extensions/search.bash "${module_name}"]
|
||||
module use $::env(PSI_PREFIX)/modulefiles/[lindex ${search_output} 2]
|
||||
}
|
||||
debug "module load: ${module_name}"
|
||||
module load ${module_name}
|
||||
}
|
||||
}
|
||||
|
||||
proc lreverse_n { list n } {
|
||||
set res {}
|
||||
set i [expr [llength $list] - $n]
|
||||
while {$i >= 0} {
|
||||
lappend res {*}[lrange $list $i [expr $i+$n-1]]
|
||||
incr i -$n
|
||||
}
|
||||
set res
|
||||
}
|
||||
|
||||
|
||||
|
||||
#
|
||||
# set standard environment variables
|
||||
#
|
||||
proc set_std_environment { PREFIX name version } {
|
||||
#
|
||||
# Hack for supporting legacy modules
|
||||
if { "${::family}" == "Legacy" } {
|
||||
debug "this is a legacy module..."
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
set NAME [string toupper $name]
|
||||
regsub -- "-" ${NAME} "_" NAME
|
||||
|
||||
if { ! [info exist ::dont-setenv] } {
|
||||
set ::dont-setenv {}
|
||||
}
|
||||
|
||||
if { ${version} != "" } {
|
||||
if { [lsearch ${::dont-setenv} "${NAME}_VERSION"] == -1 } {
|
||||
setenv ${NAME}_VERSION $version
|
||||
}
|
||||
}
|
||||
|
||||
if { [file isdirectory "$PREFIX"] } {
|
||||
if { [lsearch ${::dont-setenv} "${NAME}_PREFIX"] == -1 } {
|
||||
setenv ${NAME}_PREFIX $PREFIX
|
||||
}
|
||||
if { [lsearch ${::dont-setenv} "${NAME}_DIR"] == -1 } {
|
||||
setenv ${NAME}_DIR $PREFIX
|
||||
}
|
||||
if { [lsearch ${::dont-setenv} "${NAME}_HOME"] == -1 } {
|
||||
setenv ${NAME}_HOME $PREFIX
|
||||
}
|
||||
}
|
||||
|
||||
if { [file isdirectory "$PREFIX/bin"] } {
|
||||
if { [lsearch ${::dont-setenv} "PATH"] == -1 } {
|
||||
prepend-path PATH $PREFIX/bin
|
||||
}
|
||||
}
|
||||
|
||||
if { [file isdirectory "$PREFIX/sbin"] } {
|
||||
if { [lsearch ${::dont-setenv} "PATH"] == -1 } {
|
||||
prepend-path PATH $PREFIX/sbin
|
||||
}
|
||||
}
|
||||
|
||||
if { [file isdirectory "$PREFIX/share/man"] } {
|
||||
if { [lsearch ${::dont-setenv} "MANPATH"] == -1 } {
|
||||
prepend-path MANPATH $PREFIX/share/man
|
||||
}
|
||||
}
|
||||
|
||||
# set various environment variables - as long as they are not blacklisted
|
||||
debug "prepend to include paths"
|
||||
if { [file isdirectory "$PREFIX/include"] } {
|
||||
if { [lsearch ${::dont-setenv} "C_INCLUDE_PATH"] == -1 } {
|
||||
prepend-path C_INCLUDE_PATH $PREFIX/include
|
||||
}
|
||||
if { [lsearch ${::dont-setenv} "CPLUS_INCLUDE_PATH"] == -1 } {
|
||||
prepend-path CPLUS_INCLUDE_PATH $PREFIX/include
|
||||
}
|
||||
if { [lsearch ${::dont-setenv} "${NAME}_INCLUDE_DIR"] == -1 } {
|
||||
setenv ${NAME}_INCLUDE_DIR $PREFIX/include
|
||||
}
|
||||
}
|
||||
|
||||
debug "prepend to library paths"
|
||||
if { [file isdirectory "$PREFIX/lib"] } {
|
||||
if { [lsearch ${::dont-setenv} "LIBRARY_PATH"] == -1 } {
|
||||
prepend-path LIBRARY_PATH $PREFIX/lib
|
||||
}
|
||||
if { [lsearch ${::dont-setenv} "LD_LIBRARY_PATH"] == -1 } {
|
||||
prepend-path LD_LIBRARY_PATH $PREFIX/lib
|
||||
}
|
||||
if { [lsearch ${::dont-setenv} "${NAME}_LIBRARY_DIR"] == -1 } {
|
||||
setenv ${NAME}_LIBRARY_DIR $PREFIX/lib
|
||||
}
|
||||
}
|
||||
|
||||
debug "prepend to library paths (64bit)"
|
||||
if { [file isdirectory "$PREFIX/lib64"] } {
|
||||
if { [lsearch ${::dont-setenv} "LIBRARY_PATH"] == -1 } {
|
||||
prepend-path LIBRARY_PATH $PREFIX/lib64
|
||||
}
|
||||
if { [lsearch ${::dont-setenv} "LD_LIBRARY_PATH"] == -1 } {
|
||||
prepend-path LD_LIBRARY_PATH $PREFIX/lib64
|
||||
}
|
||||
if { [lsearch ${::dont-setenv} "${NAME}_LIBRARY_DIR"] == -1 } {
|
||||
setenv ${NAME}_LIBRARY_DIR $PREFIX/lib64
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#
|
||||
# What's the game plan here?
|
||||
# Determine from path of module to be loaded:
|
||||
# - name,
|
||||
# - version
|
||||
# - installation PREFIX
|
||||
#
|
||||
set current_modulefile [file split $ModulesCurrentModulefile]
|
||||
set psi_prefix [file split $env(PSI_PREFIX)]
|
||||
|
||||
# return, if module is not in $env(PSI_PREFIX)
|
||||
set module_prefix [file join {*}[lrange ${current_modulefile} 0 [llength ${psi_prefix}]-1]]
|
||||
if { $env(PSI_PREFIX) != ${module_prefix} } {
|
||||
debug "stop sourcing: $env(PSI_PREFIX) != ${module_prefix}"
|
||||
return
|
||||
}
|
||||
|
||||
set MODULE_ROOT_PATH $env(PSI_PREFIX)/$env(PSI_MODULES_ROOT)
|
||||
set module_root_path [file split ${MODULE_ROOT_PATH}]
|
||||
set len [llength $module_root_path]
|
||||
|
||||
set name [lindex $current_modulefile end-1]
|
||||
set version [lindex $current_modulefile end]
|
||||
set family [lrange $current_modulefile $len $len]
|
||||
set implementation [lrange $current_modulefile [expr $len + 1] end]
|
||||
|
||||
set prefix "$psi_prefix [regsub "(.unstable|.deprecated)" $family ""] [lreverse_n [lrange $current_modulefile $len end] 2]"
|
||||
set PREFIX [file join {*}$prefix]
|
||||
|
||||
debug "PREFIX=$PREFIX"
|
||||
debug "family of module $name: $family"
|
||||
|
||||
#
|
||||
# we cannot load another module with the same name
|
||||
#
|
||||
conflict $name
|
||||
|
||||
if { [module-info mode load] } {
|
||||
debug "${name}/${version}: loading ... "
|
||||
if { [ string match "*.deprecated" ${family} ] == 1 } {
|
||||
puts stderr "${name}/${version}: this module is deprecated!"
|
||||
}
|
||||
|
||||
for {set i [expr [llength ${prefix}] - 1]} {$i >= ${len}} {incr i -2} {
|
||||
set info_file [lrange ${prefix} 0 $i]
|
||||
lappend info_file ".info"
|
||||
set fname [file join {*}${info_file}]
|
||||
if { [ file exists "${fname}" ] } {
|
||||
set fp [open "${fname}" r]
|
||||
set info_data [read $fp]
|
||||
close $fp
|
||||
puts stderr ${info_data}
|
||||
}
|
||||
}
|
||||
load_dependencies "${PREFIX}/.dependencies"
|
||||
}
|
||||
|
||||
set_std_environment ${PREFIX} ${name} ${version}
|
||||
update_active_modules ${family} ${name} ${version}
|
||||
|
||||
proc ModulesHelp { } {
|
||||
if { [info exists ::whatis] } {
|
||||
puts stderr "${::whatis}"
|
||||
}
|
||||
if { [info exists ::version] } {
|
||||
puts stderr "Version: ${::version}"
|
||||
}
|
||||
if { [info exists ::url] } {
|
||||
puts stderr "Homepage: ${::url}"
|
||||
}
|
||||
if { [info exists ::license] } {
|
||||
puts stderr "License: ${::license}"
|
||||
}
|
||||
if { [info exists ::maintainer] } {
|
||||
puts stderr "Maintainer: ${::maintainer}"
|
||||
}
|
||||
if { [info exists ::help] } {
|
||||
puts stderr "${::help}\n"
|
||||
}
|
||||
}
|
||||
|
||||
if { [info exists ::whatis] } {
|
||||
module-whatis "$whatis"
|
||||
}
|
||||
236
scripts/Bootstrap/modsync.bash
Executable file
236
scripts/Bootstrap/modsync.bash
Executable file
@@ -0,0 +1,236 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
declare -r DEFAULT_SRC="/afs/psi.ch/sys/psi.@sys"
|
||||
declare -r DEFAULT_DST="/opt/psi.local"
|
||||
|
||||
function usage() {
|
||||
echo "
|
||||
$0 [--from=<source>] [--to=<destination>] [--dryrun] [--delete]
|
||||
--from source module installation (default: $DEFAULT_SRC)
|
||||
|
||||
--to destination module installation (default: $DEFAULT_DST)
|
||||
|
||||
--dryrun just tell what would be copied and deleted
|
||||
|
||||
--delete as an additional task, delete modules that are present
|
||||
at the destination but not at the source installation
|
||||
(destination cleanup)" >&2
|
||||
}
|
||||
|
||||
function die() {
|
||||
echo "$1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
# check if directory $1 is a valid prefix
|
||||
function is_module_prefix() {
|
||||
if [[ -d "$1" ]] &&
|
||||
[[ -d "$1/$PSI_CONFIG_DIR" ]] &&
|
||||
[[ -d "$1/$PSI_MODULES_ROOT" ]]
|
||||
then
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
# set the source and destination module installations
|
||||
function get_options() {
|
||||
local src_dir="$DEFAULT_SRC"
|
||||
local dst_dir="$DEFAULT_DST"
|
||||
local dryrun=false
|
||||
local delete=false
|
||||
local option
|
||||
|
||||
while (($# > 0)); do
|
||||
if [[ "${1#--from}" != "$1" ]]; then
|
||||
option="${1#--from}"
|
||||
option="${option#=}"
|
||||
[[ -z "$option" ]] && { shift; option="$1"; }
|
||||
src_dir="$option"
|
||||
elif [[ "${1#--to}" != "$1" ]]; then
|
||||
option="${1#--to}"
|
||||
option="${option#=}"
|
||||
[[ -z "$option" ]] && { shift; option="$1"; }
|
||||
dst_dir="$option"
|
||||
elif [[ -z "${1#--dryrun}" ]]; then
|
||||
dryrun=true
|
||||
elif [[ -z "${1#--delete}" ]]; then
|
||||
delete=true
|
||||
else
|
||||
usage > /dev/fd/2
|
||||
die "Unknown option: $1"
|
||||
fi
|
||||
shift
|
||||
done
|
||||
|
||||
is_module_prefix "$src_dir" || { die "<$src_dir> is not a Pmodules installation"; }
|
||||
is_module_prefix "$dst_dir" || { die "<$dst_dir> is not a Pmodules installation"; }
|
||||
src_dir=$( cd "$src_dir"; pwd -P )
|
||||
dst_dir=$( cd "$dst_dir"; pwd -P )
|
||||
[[ "$src_dir" == "$dst_dir" ]] && { die "same source and destination installations"; }
|
||||
local modbin=$( cd "$PMODULES_HOME"; pwd -P )
|
||||
local prefix=$( cd "$PSI_PREFIX"; pwd -P )
|
||||
modbin=${modbin#"$prefix/"}/bin/modulecmd
|
||||
local -r file_type_src=$( file -b "$src_dir/$modbin" 2>&1 || echo err1 )
|
||||
local -r file_type_dst=$( file -b "$dst_dir/$modbin" 2>&1 || echo err2 )
|
||||
[[ ! "${file_type_src}" == "${file_type_dst}" ]] || {
|
||||
die "The file signatures in the source and destination installation do not match!"
|
||||
}
|
||||
echo "$src_dir" "$dst_dir" "$dryrun" "$delete"
|
||||
}
|
||||
|
||||
# Derive the relative module installation path
|
||||
# from the relative module file path
|
||||
# $1 relative module file path
|
||||
function get_modpath() {
|
||||
local -a comp=( ${1//\// } ) # split rel.path into components
|
||||
local -a path # result path
|
||||
local -i i
|
||||
for ((i=0; i<${#comp[@]}; i++)); do
|
||||
case $i in
|
||||
0) path=( ${comp[0]%.*} );;
|
||||
*) path+=( "${comp[$((-i-1))]}/${comp[$((-i))]}" ); i+=1;;
|
||||
esac
|
||||
done
|
||||
echo "${path[*]}"
|
||||
}
|
||||
|
||||
# Derive the relative module release file path
|
||||
# from the relative module file path
|
||||
# $1 relative module file path
|
||||
function get_release_path() {
|
||||
echo "$(dirname "$1")/.release-$(basename "$1")"
|
||||
}
|
||||
|
||||
# $1 dryrun=(true|false)
|
||||
# $2 relative module file path of destination module to be deleted
|
||||
# $3 destination prefix
|
||||
function delete_module() {
|
||||
if [[ "$1" != "false" ]]; then
|
||||
echo "(dryrun) delete: $2 at $3" 1>&2
|
||||
return 0
|
||||
fi
|
||||
local modpath=$( get_modpath "$2" )
|
||||
[[ -z "$modpath" ]] && {
|
||||
die "Unable to retrieve module file and installation paths";
|
||||
}
|
||||
echo "rm -v \"$3/$PSI_MODULES_ROOT/$2\""
|
||||
echo "rm -v \"$3/$PSI_MODULES_ROOT/$( get_release_path $2 )\""
|
||||
echo "rmdir -vp \"$( dirname "$3/$PSI_MODULES_ROOT/$2" )\""
|
||||
echo "rm -vrf \"$3/$modpath\""
|
||||
echo "rmdir -vp \"$( dirname "$3/$modpath" )\""
|
||||
echo "deleted: $2" 1>&2
|
||||
}
|
||||
|
||||
# $1 dryrun=(true|false)
|
||||
# $2 relative module file path of source module to be copied to the destination
|
||||
# $3 source prefix
|
||||
# $4 destination prefix
|
||||
function copy_module() {
|
||||
if [[ "$1" != "false" ]]; then
|
||||
echo "(dryrun) copy: $2 from $3 to $4" 1>&2
|
||||
return 0
|
||||
fi
|
||||
local modpath=$( get_modpath "$2" )
|
||||
[[ -z "$modpath" ]] && { die "Unable to retrieve module file and installation paths"; }
|
||||
install -d $( dirname "$3/$PSI_MODULES_ROOT/$2" )
|
||||
(
|
||||
cd $3
|
||||
rsync --links --perms --relative --verbose "$PSI_MODULES_ROOT/$2" "$4"
|
||||
rsync --links --perms --relative --verbose "$PSI_MODULES_ROOT/$( get_release_path "$2" )" "$4"
|
||||
rsync --recursive --links --perms --relative --verbose "$modpath" "$4"
|
||||
)
|
||||
echo "copied: $2" 1>&2
|
||||
}
|
||||
|
||||
# syncronize modules from source to
|
||||
# destination module installations
|
||||
# --from=<source> default: /afs/psi.ch/sys/psi.@sys
|
||||
# --to=<destination> default: /opt/psi.local
|
||||
function sync_modules() {
|
||||
local -a options=( $(get_options "$@") )
|
||||
[[ -z "$options" ]] && exit 1
|
||||
local src_dir="${options[0]}"
|
||||
local dst_dir="${options[1]}"
|
||||
local dryrun="${options[2]}"
|
||||
local delete="${options[3]}"
|
||||
unset options
|
||||
|
||||
local profile_script="$src_dir/$PSI_CONFIG_DIR/profile.bash"
|
||||
[[ -r "$profile_script" ]] || {
|
||||
die "Unable to find profile script of installation $profile_script";
|
||||
}
|
||||
local search_script="$src_dir/Tools/Pmodules/${PMODULES_VERSION}/bin/modulecmd"
|
||||
[[ -x "$search_script" ]] || {
|
||||
die "Unable to find search script of installation $search_script";
|
||||
}
|
||||
local dialog_script="$src_dir/Tools/Pmodules/${PMODULES_VERSION}/bin/dialog.bash"
|
||||
[[ -r "$dialog_script" ]] || {
|
||||
die "Unable to find dialog script of installation $dialog_script";
|
||||
}
|
||||
|
||||
. "$profile_script" # set variables for the source installation
|
||||
|
||||
DIALOG_LIB=1 # use dialog script as a library
|
||||
. "$dialog_script" # dialog functions
|
||||
|
||||
local -a selected_modules
|
||||
|
||||
# Redefine module_out to append modules to the selected_modules variable
|
||||
function module_out() {
|
||||
local -a args=(${modlist[$1]})
|
||||
local path=""
|
||||
IFS=/
|
||||
[[ -n "${args[3]}" ]] && path="/${args[*]:3}"
|
||||
unset IFS
|
||||
selected_modules+=( "${args[2]}$path/${args[0]}" )
|
||||
}
|
||||
|
||||
module_picker "$dst_dir" < <("$search_script" bash search --no-header -a 2>&1)
|
||||
|
||||
local -a destination_modules=( $(cd "$dst_dir/$PSI_MODULES_ROOT"; find -L . -type f | while read f; do echo ${f#./}; done) )
|
||||
|
||||
# redefine set difference, the version in dialog.bash only handles integers
|
||||
function set_difference() { # $1 \ $2
|
||||
local -a operand1=($1)
|
||||
local -a operand2=($2)
|
||||
local -A members
|
||||
local elem
|
||||
for elem in "${operand1[@]}"; do
|
||||
members[$elem]=1
|
||||
done
|
||||
for elem in "${operand2[@]}"; do
|
||||
unset members[$elem]
|
||||
done
|
||||
echo ${!members[@]}
|
||||
}
|
||||
|
||||
[[ "$delete" == "true" ]] && {
|
||||
local -a modules_delete=( $(set_difference "${destination_modules[*]}" "${selected_modules[*]}") )
|
||||
for m in "${modules_delete[@]}"; do
|
||||
delete_module "$dryrun" "$m" "$dst_dir"
|
||||
done
|
||||
unset modules_delete
|
||||
}
|
||||
|
||||
|
||||
local -a modules_copy=( $(set_difference "${selected_modules[*]}" "${destination_modules[*]}") )
|
||||
[[ -z $modules_copy ]] || {
|
||||
if [[ "$dryrun" != "false" ]]; then
|
||||
echo "(dryrun) update: $dst_dir/$PSI_CONFIG_DIR from $src_dir/$PSI_CONFIG_DIR" 1>&2
|
||||
else
|
||||
(
|
||||
local -a extraoption="$( [[ "$delete" == "true" ]] && echo --delete )"
|
||||
cd "$src_dir"
|
||||
rsync --recursive --links --perms --relative $extraoption --verbose --exclude .git "$PSI_CONFIG_DIR" "$dst_dir"
|
||||
echo "updated: $PSI_CONFIG_DIR from $src_dir" 1>&2
|
||||
)
|
||||
fi
|
||||
for m in "${modules_copy[@]}"; do
|
||||
copy_module "$dryrun" "$m" "$src_dir" "$dst_dir"
|
||||
done
|
||||
}
|
||||
unset modules_copy
|
||||
}
|
||||
|
||||
sync_modules "$@"
|
||||
1140
scripts/Bootstrap/modulecmd
Normal file
1140
scripts/Bootstrap/modulecmd
Normal file
File diff suppressed because it is too large
Load Diff
1140
scripts/Bootstrap/modulecmd.bash
Executable file
1140
scripts/Bootstrap/modulecmd.bash
Executable file
File diff suppressed because it is too large
Load Diff
8
scripts/Bootstrap/modulerc
Normal file
8
scripts/Bootstrap/modulerc
Normal file
@@ -0,0 +1,8 @@
|
||||
#%Module1.0
|
||||
|
||||
setenv PSI_LIBMODULES "$env(PSI_PREFIX)/$env(PSI_CONFIG_DIR)/libmodules.tcl"
|
||||
|
||||
if { ! [info exists env(PSI_LIBMODULES) ] } {
|
||||
puts stderr "Module cannot be loaded, because the shell environment is not setup correctly."
|
||||
exit 42
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source $(dirname $0)/../lib/libem.bash
|
||||
source $(dirname $0)/../../lib/libem.bash
|
||||
|
||||
function em.pre_configure() {
|
||||
./autogen.sh
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
cat <<EOF > "${MODULE_SRCDIR}/make.inc"
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
cat <<EOF > "${MODULE_SRCDIR}/make.inc"
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
cat <<EOF > "${MODULE_SRCDIR}/make.inc"
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
cat <<EOF > "${MODULE_SRCDIR}/SuiteSparse_config/SuiteSparse_config.mk"
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.pre_configure() {
|
||||
./autogen.sh
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.pre_configure() {
|
||||
:
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
(cd "${MODULE_SRCDIR}" && ./autogen.sh)
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
"${MODULE_SRCDIR}"/configure \
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
"${MODULE_SRCDIR}"/configure \
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
"${MODULE_SRCDIR}"/configure \
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
"${MODULE_SRCDIR}"/configure \
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
"${MODULE_SRCDIR}"/configure \
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
"${MODULE_SRCDIR}"/configure \
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
"${MODULE_SRCDIR}"/configure \
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
case ${OS} in
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
"${MODULE_SRCDIR}"/configure \
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
"${MODULE_SRCDIR}"/configure \
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
"${MODULE_SRCDIR}/bootstrap" --prefix="${PREFIX}"
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
"${MODULE_SRCDIR}"/configure \
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
em.add_to_family 'Programming'
|
||||
em.set_runtime_dependencies ""
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
"${MODULE_SRCDIR}"/configure \
|
||||
@@ -3,7 +3,7 @@
|
||||
# Lua cannot be build in a seperate directory!
|
||||
#
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
cd "${MODULE_SRCDIR}"
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
"${MODULE_SRCDIR}"/configure \
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
:
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
"${MODULE_SRCDIR}"/configure \
|
||||
42
scripts/System/getopt.build
Executable file
42
scripts/System/getopt.build
Executable file
@@ -0,0 +1,42 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
:
|
||||
}
|
||||
|
||||
function em.build() {
|
||||
case ${OS} in
|
||||
Linux )
|
||||
declare -x LDFLAGS="-lintl -liconv"
|
||||
;;
|
||||
Darwin )
|
||||
declare -x LDFLAGS="-lintl -liconv -framework CoreFoundation"
|
||||
;;
|
||||
esac
|
||||
|
||||
cd "${MODULE_SRCDIR}"
|
||||
make -e
|
||||
}
|
||||
|
||||
function em.install() {
|
||||
cd "${MODULE_SRCDIR}"
|
||||
declare -x DESTDIR="${PREFIX}"
|
||||
declare -x prefix=''
|
||||
make -e install
|
||||
}
|
||||
|
||||
function em.cleanup_build() {
|
||||
cd "${MODULE_SRCDIR}"
|
||||
make -e realclean
|
||||
}
|
||||
|
||||
em.add_to_family 'Tools'
|
||||
em.make_all
|
||||
|
||||
# Local Variables:
|
||||
# mode: sh
|
||||
# sh-basic-offset: 8
|
||||
# tab-width: 8
|
||||
# End:
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
TCL_VERSION='8.6.3'
|
||||
TCL_DIR="${PSI_PREFIX}/Programming/Tcl/${TCL_VERSION}"
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
"${MODULE_SRCDIR}"/configure \
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
module use 'Libraries'
|
||||
|
||||
24
scripts/Tools/gettext.build
Executable file
24
scripts/Tools/gettext.build
Executable file
@@ -0,0 +1,24 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
"${MODULE_SRCDIR}"/configure \
|
||||
--prefix="${PREFIX}" \
|
||||
--disable-java \
|
||||
--disable-threads \
|
||||
--disable-shared \
|
||||
--enable-relocatable \
|
||||
--disable-openmp \
|
||||
--disable-acl \
|
||||
--disable-curses \
|
||||
--with-included-gettext \
|
||||
--without-libiconv-prefix \
|
||||
--without-libintl-prefix \
|
||||
--with-included-libxml \
|
||||
|| exit 1
|
||||
}
|
||||
|
||||
em.add_to_family 'Tools'
|
||||
em.set_build_dependencies "${COMPILER}"
|
||||
em.make_all
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
"${MODULE_SRCDIR}"/configure \
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
source "$(dirname $0)/../lib/libem.bash"
|
||||
source "$(dirname $0)/../../lib/libem.bash"
|
||||
|
||||
function em.configure() {
|
||||
"${MODULE_SRCDIR}"/configure \
|
||||
Reference in New Issue
Block a user