diff --git a/config/Pmodules.conf b/config/Pmodules.conf index 15cae9f..956049e 100644 --- a/config/Pmodules.conf +++ b/config/Pmodules.conf @@ -4,14 +4,3 @@ declare -x MODULES_VERSION=3.2.10 declare -a COMPILER_VERSIONS=( 'gcc/4.7.4' 'gcc/4.8.3' 'gcc/4.8.4' 'gcc/4.9.2' ) declare -a MPI_VERSIONS=( 'openmpi/1.6.5' 'openmpi/1.8.2' 'openmpi/1.8.4' ) declare -a HDF5_VERSIONS=( 'hdf5/1.8.12' 'hdf5/1.8.14' ) - -declare COMPILER='gcc' -declare COMPILER_VERSION='4.8.4' -declare GCC_VERSION="${COMPILER_VERSION}" - -declare MPI='openmpi' -declare MPI_VERSION='1.8.4' -declare OPENMPI_VERSION="${MPI_VERSION}" - -declare HDF5='hdf5/1.8.12' -declare HDF5_serial='hdf5_serial/1.8.12' diff --git a/lib/libem.bash b/lib/libem.bash index f63c895..5dcb5cb 100644 --- a/lib/libem.bash +++ b/lib/libem.bash @@ -2,6 +2,9 @@ PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin +# disable auto-echo feature of 'cd' +unset CDPATH + shopt -s expand_aliases @@ -96,85 +99,6 @@ ENV=VALUE exit 1 } - -debug_on='no' -force_rebuild='no' -ENVIRONMENT_ARGS='' -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 ) - JOBS=$2 - shift - ;; - --jobs=[0-9]* ) - JOBS=${1/--jobs=} - ;; - -v | --verbose) - debug_on='yes' - ;; - -f | --force-rebuild ) - force_rebuild='yes' - ;; - -b | --bootstrap ) - bootstrap='yes' - force_rebuild='yes' - ;; - -? | -h | --help ) - usage - ;; - --dry-run ) - dry_run='yes' - ;; - --release=* ) - MODULE_RELEASE=${1/--release=} - ;; - --with=*/* ) - with_modules+=( ${1/--with=} ) - ;; - *=* ) - eval $1 - ENVIRONMENT_ARGS="${ENVIRONMENT_ARGS} $1" - ;; - * ) - V=$1 - ;; - esac - 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 - source "${PSI_PREFIX}/${PSI_CONFIG_DIR}/profile.bash" - MODULECMD="${PMODULES_HOME}/bin/modulecmd" - [[ -x ${MODULECMD} ]] || die 1 "${MODULECMD}: no such executable" - module use unstable - module purge -fi - -P=$(basename $(dirname "${BUILDSCRIPT}")) -_P=$(echo $P | tr [:lower:] [:upper:]) -_P=${_P//-/_} -_V=${_P}_VERSION - -eval "${ENVIRONMENT_ARGS}" - -if [[ -n ${PSI_RELEASES} ]]; then - declare -r releases="${PSI_RELEASES}" -else - # set defaults, if file doesn't exist or isn't readable - declare -r releases=":unstable:stable:deprecated:" -fi - is_release () { [[ ${releases} =~ :$1: ]] } @@ -223,16 +147,6 @@ function module_is_available() { } function _load_build_dependencies() { - # :FIXME: merge this two loops, load only modules which are required - # this merge is not as easy as it looks like at a first glance! - for m in "${with_modules[@]}"; do - if module_is_available "$m"; then - echo "Loading module: ${m}" - module load "${m}" - else - die 44 "$m: module not available!" - fi - done for m in "${MODULE_BUILD_DEPENDENCIES[@]}"; do [[ -z $m ]] && continue if [[ ! $m =~ "*/*" ]]; then @@ -523,58 +437,56 @@ function _setup_env2() { } -if [[ ${bootstrap} == yes ]]; then - # redefine function for bootstrapping - function _setup_env2() { - if [[ -z ${MODULE_FAMILY} ]]; then +# redefine function for bootstrapping +function _setup_env2_bootstrap() { + if [[ -z ${MODULE_FAMILY} ]]; then die 1 "$P: family not set." - fi + fi - if [[ -z $V ]]; then + if [[ -z $V ]]; then V=$(eval echo \$${_P}_VERSION) - fi + fi - # oops, we need a version - if [[ -z $V ]]; then + # 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/${PMODULES_VERSION}" - # set PREFIX of module - PREFIX="${PSI_PREFIX}/${MODULE_FAMILY}/${MODULE_NAME}" - - MODULE_RELEASE='unstable' - info "${MODULE_NAME}: will be released as \"${MODULE_RELEASE}\"" + fi + MODULE_SRCDIR="${BUILD_TMPDIR}/src/${P/_serial}-$V" + MODULE_BUILDDIR="${BUILD_TMPDIR}/build/$P-$V" + MODULE_FAMILY='Tools' + MODULE_NAME="Pmodules/${PMODULES_VERSION}" + # 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" + # 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" + # 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 + PATH+=":${PREFIX}/bin" +} function _prep() { @@ -689,7 +601,11 @@ function em.make_all() { _setup_env1 _load_build_dependencies # setup module specific environment - _setup_env2 + if [[ ${bootstrap} == no ]]; then + _setup_env2 + else + _setup_env2_bootstrap + fi if [[ ! -d "${PREFIX}" ]] || [[ ${force_rebuild} == 'yes' ]]; then echo "Building $P/$V ..." @@ -719,6 +635,94 @@ function em.make_all() { em.cleanup_build } +############################################################################## +# +debug_on='no' +force_rebuild='no' +ENVIRONMENT_ARGS='' +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 ) + JOBS=$2 + shift + ;; + --jobs=[0-9]* ) + JOBS=${1/--jobs=} + ;; + -v | --verbose) + debug_on='yes' + ;; + -f | --force-rebuild ) + force_rebuild='yes' + ;; + -b | --bootstrap ) + bootstrap='yes' + force_rebuild='yes' + ;; + -? | -h | --help ) + usage + ;; + --dry-run ) + dry_run='yes' + ;; + --release=* ) + MODULE_RELEASE=${1/--release=} + ;; + --with=*/* ) + with_modules+=( ${1/--with=} ) + ;; + *=* ) + eval $1 + ENVIRONMENT_ARGS="${ENVIRONMENT_ARGS} $1" + ;; + * ) + V=$1 + ;; + esac + 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 + source "${PSI_PREFIX}/${PSI_CONFIG_DIR}/profile.bash" + MODULECMD="${PMODULES_HOME}/bin/modulecmd" + [[ -x ${MODULECMD} ]] || die 1 "${MODULECMD}: no such executable" + module use unstable + module purge + for m in "${with_modules[@]}"; do + if module_is_available "$m"; then + echo "Loading module: ${m}" + module load "${m}" + else + die 44 "$m: module not available!" + fi + done +fi + +P=$(basename $(dirname "${BUILDSCRIPT}")) +_P=$(echo $P | tr [:lower:] [:upper:]) +_P=${_P//-/_} +_V=${_P}_VERSION + +eval "${ENVIRONMENT_ARGS}" + +if [[ -n ${PSI_RELEASES} ]]; then + declare -r releases="${PSI_RELEASES}" +else + # set defaults, if file doesn't exist or isn't readable + declare -r releases=":unstable:stable:deprecated:" +fi + # Local Variables: # mode: sh # sh-basic-offset: 8 diff --git a/scripts/Bootstrap/Pmodules/bash b/scripts/Bootstrap/Pmodules/bash index e55b9dc..e2276b6 100644 --- a/scripts/Bootstrap/Pmodules/bash +++ b/scripts/Bootstrap/Pmodules/bash @@ -117,24 +117,18 @@ function replace_path () { sed '/^\s*$/d' | tr "\n" ":" | sed -e 's|^:||' -e 's|:$||') } +module purge + ############################################################################# # setup environment # -if [[ -z ${LOADEDMODULES} ]]; then - declare -x LOADEDMODULES='' -fi - -if [[ -z ${MODULEPATH} ]]; then - declare -x MODULEPATH='' - for f in ${PSI_DEFAULT_FAMILIES}; do - append_path MODULEPATH "${PSI_PREFIX}/${PSI_MODULES_ROOT}/$f" - append_path PSI_LOADEDFAMILIES "${f}" - done -fi - -if [[ -z ${PSI_LOADEDFAMILIES} ]]; then - declare -x PSI_LOADEDFAMILIES='' -fi +declare -x LOADEDMODULES='' +declare -x PSI_LOADEDFAMILIES='' +declare -x MODULEPATH='' +for f in ${PSI_DEFAULT_FAMILIES}; do + append_path MODULEPATH "${PSI_PREFIX}/${PSI_MODULES_ROOT}/$f" + append_path PSI_LOADEDFAMILIES "${f}" +done replace_path PATH "${PMODULES_HOME%/*}/.*" replace_path MANPATH "${PMODULES_HOME%/*}/.*" @@ -151,9 +145,6 @@ fi ############################################################################# # legacy... # -#declare -x MODULE_VERSION=${PMODULES_VERSION} -#declare -x MODULE_VERSION_STACK="${PMODULE_VERSION}" -#declare -x MODULESHOME="${PMODULES_HOME}" unset MODULE_VERSION unset MODULE_VERSION_STACK unset MODULESHOME diff --git a/scripts/Bootstrap/Pmodules/modmanage.in b/scripts/Bootstrap/Pmodules/modmanage.in index 361fe3e..abf6a45 100755 --- a/scripts/Bootstrap/Pmodules/modmanage.in +++ b/scripts/Bootstrap/Pmodules/modmanage.in @@ -1,5 +1,7 @@ #!@PMODULES_HOME@/bin/bash +unset CDPATH + shopt -s expand_aliases declare -r bindir=$(cd $(dirname "$0") && pwd) @@ -141,7 +143,7 @@ subcommand_init() { local target_prefixes=() local user='' local opts='' - opts=$(get_options -o h -l src: -l user: -l help -- "$@") + opts=$(get_options -o h -l src: -l user: -l help -l version: -- "$@") if [[ $? != 0 ]]; then subcommand_help_init exit 1 @@ -157,6 +159,10 @@ subcommand_init() { user=$2 shift ;; + --version ) + PMODULES_VERSION=$2 + shift + ;; -- ) : ;; diff --git a/scripts/Bootstrap/Pmodules/modulecmd.in b/scripts/Bootstrap/Pmodules/modulecmd.in index bc47ba7..bb67e02 100755 --- a/scripts/Bootstrap/Pmodules/modulecmd.in +++ b/scripts/Bootstrap/Pmodules/modulecmd.in @@ -1,4 +1,8 @@ #!@PMODULES_HOME@/bin/bash +# + +# we have to unset CDPATH, otherwise 'cd' prints the directoy! +unset CDPATH declare -r PMODULES_DIR=$( cd "$(dirname $0)/.." && pwd ) declare -r version='@PMODULES_VERSION@' @@ -464,6 +468,11 @@ subcommand_generic1plus() { "${modulecmd}" "${shell}" "${subcommand}" "$@" } +# +# load module +# +# $1: module to load +# subcommand_load() { output_load_hints() { local -ra rels=( ${available_releases//:/ } ) @@ -509,7 +518,9 @@ subcommand_load() { } local -r m=$1 - if module_is_available "${m}"; then + if [[ "${m}" == "" ]]; then + echo "No module specified." 1>&2 + elif module_is_available "${m}"; then "${modulecmd}" "${shell}" load "${m}" else if [[ ${userlvl} = 'novice' ]]; then diff --git a/scripts/Bootstrap/Tcl/build b/scripts/Bootstrap/Tcl/build index 402004d..78de767 100755 --- a/scripts/Bootstrap/Tcl/build +++ b/scripts/Bootstrap/Tcl/build @@ -21,7 +21,6 @@ function em.post_install() { { cd "${PREFIX}"/bin && rm -f tclsh && ln -fs tclsh${V%.*} tclsh; }; } -em.add_to_family 'Programming' +em.add_to_family 'Tools' em.set_docfiles 'license.terms' 'README' -em.set_build_dependencies "${COMPILER}" em.make_all diff --git a/scripts/Bootstrap/bash/build b/scripts/Bootstrap/bash/build index 19ef03f..edc9d5b 100755 --- a/scripts/Bootstrap/bash/build +++ b/scripts/Bootstrap/bash/build @@ -8,6 +8,5 @@ function em.configure() { || exit 1 } -em.add_to_family 'System' -em.set_build_dependencies "${COMPILER}" +em.add_to_family 'Tools' em.make_all diff --git a/scripts/Bootstrap/compile_pmodules.sh b/scripts/Bootstrap/compile_pmodules.sh index 5c38325..9d60e93 100755 --- a/scripts/Bootstrap/compile_pmodules.sh +++ b/scripts/Bootstrap/compile_pmodules.sh @@ -8,13 +8,13 @@ source "${BASE_DIR}/config/Pmodules.conf" unset PMODULES_HOME source "/opt/psi/config/environment.bash" -${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 +${BOOTSTRAP_DIR}/gettext/build --bootstrap || { echo "compiling 'gettext' failed!"; exit 1; } +${BOOTSTRAP_DIR}/getopt/build --bootstrap || { echo "compiling 'getopt' failed!"; exit 1; } +${BOOTSTRAP_DIR}/dialog/build --bootstrap || { echo "compiling 'dialog' failed!"; exit 1; } +${BOOTSTRAP_DIR}/bash/build --bootstrap || { echo "compiling 'bash' failed!"; exit 1; } +${BOOTSTRAP_DIR}/Tcl/build --bootstrap || { echo "compiling 'Tcl' failed!"; exit 1; } # we have to remove the init directory - otherwise the next build will fail... rm -rf "${PMODULES_HOME}/init" -${BOOTSTRAP_DIR}/Modules/build --bootstrap +${BOOTSTRAP_DIR}/Modules/build --bootstrap || { echo "compiling 'Modules' failed!"; exit 1; } mv -v "${PMODULES_HOME}/bin/modulecmd" "${PMODULES_HOME}/bin/modulecmd.tcl" diff --git a/scripts/Bootstrap/dialog/build b/scripts/Bootstrap/dialog/build index ae80ddd..edc9d5b 100755 --- a/scripts/Bootstrap/dialog/build +++ b/scripts/Bootstrap/dialog/build @@ -9,5 +9,4 @@ function em.configure() { } em.add_to_family 'Tools' -em.set_build_dependencies "${COMPILER}" em.make_all diff --git a/scripts/Bootstrap/gettext/build b/scripts/Bootstrap/gettext/build index 68d8744..9409c14 100755 --- a/scripts/Bootstrap/gettext/build +++ b/scripts/Bootstrap/gettext/build @@ -20,5 +20,4 @@ function em.configure() { } em.add_to_family 'Tools' -em.set_build_dependencies "${COMPILER}" em.make_all