Christoph Niethammer
6335b47a65
Cleanup module loading code for decommisioned systems. Further, merge the actual loading of modules into single line as a workaround to prevent an issue with lmod's automatic reloading of module dependencies. This might not fix all reltated issues.
312 lines
8.2 KiB
Bash
Executable file
312 lines
8.2 KiB
Bash
Executable file
#!/bin/bash
|
|
#
|
|
# Install script inspired by the ebuild system of Gentoo Linux
|
|
#
|
|
# Copyright (c) 2011-2022 Christoph Niethammer <niethammer@hlrs.de>
|
|
#
|
|
|
|
set -e
|
|
#set -x
|
|
|
|
#source colors.sh
|
|
#echo -e "${RED}DEBUGME: $MPI_VERSION${ENDCOLOR}"
|
|
|
|
function show_help() {
|
|
echo "Usage: $0 [options] [action] <sit package name>"
|
|
echo "Options:"
|
|
echo " -h,--help"
|
|
echo " -v,--verbose"
|
|
echo " --debug"
|
|
echo
|
|
echo "Valid actions:"
|
|
echo " sitinfo"
|
|
echo " unpack"
|
|
echo " prepare"
|
|
echo " configure"
|
|
echo " build"
|
|
echo " pretest"
|
|
echo " install"
|
|
echo " posttest"
|
|
echo " postinst"
|
|
echo " copy_logs"
|
|
echo " setperms"
|
|
echo " all"
|
|
}
|
|
|
|
declare -i verbose=0
|
|
declare -i debug=0
|
|
sit_classfile="" # sit class file to be installed
|
|
sit_action="all" # sit action to be performed
|
|
|
|
while [ "$1" != "" ] ; do
|
|
case $1 in
|
|
-h|-\?|--help)
|
|
show_help
|
|
exit
|
|
;;
|
|
--debug)
|
|
echo "Debug mode enabled"
|
|
set -x
|
|
debug=1
|
|
;;
|
|
-v|--verbose)
|
|
verbose=$((verbose + 1))
|
|
;;
|
|
|
|
sitinfo| \
|
|
all| \
|
|
unpack| \
|
|
prepare| \
|
|
configure| \
|
|
build| \
|
|
pretest| \
|
|
install| \
|
|
posttest| \
|
|
postinst| \
|
|
copy_logs| \
|
|
setperms)
|
|
sit_action=$1
|
|
;;
|
|
*)
|
|
sit_classfile=$1
|
|
;;
|
|
esac
|
|
|
|
shift
|
|
done
|
|
|
|
SIT_PATH=$(cd $(dirname $PWD/$0); pwd)
|
|
SIT_CONFIG_FILE=$SIT_PATH/etc/sit.conf
|
|
SIT_USER_CONFIG_FILE=$HOME/.sit
|
|
|
|
source "$SIT_PATH/functions.sh"
|
|
|
|
# Reading in user configuration file if it exists
|
|
if [[ -e $SIT_USER_CONFIG_FILE ]] ; then
|
|
source $SIT_USER_CONFIG_FILE
|
|
fi
|
|
# Reading in global configuration file
|
|
if [[ -e $SIT_CONFIG_FILE ]] ; then
|
|
source $SIT_CONFIG_FILE
|
|
fi
|
|
|
|
# identify platform manually if no environment variable was set
|
|
PLATFORM=${PLATFORM:=$SITE_PLATFORM_NAME}
|
|
if [ -z $PLATFORM ]; then
|
|
sit_warn "Unknown platform using default platform '${DEFAULT_PLATFORM}' configuration"
|
|
PLATFORM="${DEFAULT_PLATFORM}"
|
|
fi
|
|
sit_info "Platform: $PLATFORM"
|
|
sit_info "Action(s) to perform: $sit_action"
|
|
sit_info "Sit class file(s): $sit_classfile"
|
|
|
|
# compiler to use
|
|
# (gnu|intel|pgi)
|
|
COMPILER=${COMPILER:=${DEFAULT_COMPILER}}
|
|
sit_info_verbose "Compiler: $COMPILER"
|
|
# use specific compiler version
|
|
COMPILER_VERSION=${COMPILER_VERSION:=}
|
|
sit_info_verbose "Compiler version: $COMPILER_VERSION"
|
|
|
|
|
|
# Compiler specifications
|
|
COMPILER_CONFIG_FILE="$SIT_PATH/etc/platform-configs/${PLATFORM}/compiler/${COMPILER}"
|
|
if [ -e $COMPILER_CONFIG_FILE ] ; then
|
|
source $COMPILER_CONFIG_FILE
|
|
else
|
|
sit_fail "Could not find configuration file for compiler '${COMPILER}' on platform '${PLATFORM}'."
|
|
fi
|
|
|
|
|
|
sit_info_verbose "COMPILER: $COMPILER"
|
|
sit_info_verbose "COMPILER version: $COMPILER_VERSION"
|
|
sit_info_verbose "MPI: $MPI"
|
|
sit_info_verbose "MPI version: $MPI_VERSION"
|
|
|
|
case $PLATFORM in
|
|
hawk|vulcan)
|
|
COMPILER_MODULE=${COMPILER}${COMPILER_VERSION:+"/${COMPILER_VERSION}"}
|
|
MPI_MODULE=${MPI}${MPI_VERSION:+"/${MPI_VERSION}"}
|
|
MPI_VERSION_NUM=${MPI_VERSION%%-*}
|
|
sit_info_verbose "MPI version num: $MPI_VERSION_NUM"
|
|
;;
|
|
system)
|
|
echo "Using system default compiler and MPI"
|
|
COMPILER="" # prevent any compiler specs in the prefix
|
|
MPI=""
|
|
;;
|
|
*)
|
|
sit_fail "Unknown or unsupported system"
|
|
;;
|
|
esac
|
|
echo "Loading modules: ${COMPILER_MODULE} ${MPI_MODULE}"
|
|
|
|
module load "${COMPILER_MODULE}" "${MPI_MODULE}"
|
|
|
|
if [ ! -z "${COMPILER}" ] ; then
|
|
# reevaluate compiler version
|
|
COMPILER_VERSION_FULL=$(eval "$COMPILER_VERSION_CMD")
|
|
fi
|
|
# make the compiler variables CC, CXX, FC and F77 available
|
|
if [ ! -z "$COMPILER_OPTS" ] ; then
|
|
echo "Compiler env: ${COMPILER_OPTS}"
|
|
export ${COMPILER_OPTS}
|
|
fi
|
|
if [ ! -z $COMPILER ] ; then
|
|
echo "Using compiler: $COMPILER version: $COMPILER_VERSION_FULL"
|
|
fi
|
|
|
|
|
|
if [ ! -z "$MPI" ] ; then
|
|
case $COMPILER in
|
|
intel)
|
|
if [[ $MPI == "impi" ]] ; then
|
|
MPICC="mpiicc"
|
|
MPICXX="mpiicpc"
|
|
MPIFC="mpiifort"
|
|
else
|
|
MPICC="mpicc"
|
|
MPICXX="mpicxx"
|
|
MPIFC="mpif90"
|
|
fi
|
|
;;
|
|
*)
|
|
MPICC="mpicc"
|
|
MPICXX="mpicxx"
|
|
MPIFC="mpif90"
|
|
;;
|
|
esac
|
|
sit_info "MPI compiler env: MPICC=$MPICC, MPICXX=$MPICXX, MPIFC=$MPIFC"
|
|
MPI_DIR=${MPI_DIR:=$(dirname $(dirname $(which $MPICC)))}
|
|
fi
|
|
|
|
|
|
if [ -f $SCLASS_DIR/$sit_classfile ] ; then
|
|
source $SCLASS_DIR/$sit_classfile
|
|
else
|
|
sit_fail "Could not find file $SCLASS_DIR/$sit_classfile"
|
|
fi
|
|
|
|
PACKAGENAME=${PACKAGENAME:=$PACKAGE}
|
|
|
|
# construct the final installation directory path
|
|
if [ -z $PREFIX ] ; then
|
|
PREFIX="${PREFIX_BASE}/${CATEGORY}/${PACKAGE}/${VERSION}"
|
|
PREFIX_SUFFIX=${MPI:+"-$MPI"}${MPI_VERSION_NUM:+"-$MPI_VERSION_NUM"}
|
|
PREFIX_SUFFIX=$PREFIX_SUFFIX${COMPILER:+"-$COMPILER"}${COMPILER_VERSION:+"-$COMPILER_VERSION"}
|
|
PREFIX_SUFFIX=$PREFIX_SUFFIX${PACKAGE_DESCRIPTOR:+-$PACKAGE_DESCRIPTOR}
|
|
PREFIX=$PREFIX${PREFIX_SUFFIX:+"$PREFIX_SUFFIX"}
|
|
fi
|
|
|
|
# final working directory path
|
|
WORKDIR=${WORKDIR_BASE}/${CATEGORY}/${PACKAGE}/${VERSION}$PREFIX_SUFFIX
|
|
|
|
# path to the source code directory
|
|
SRCDIR=${WORKDIR}/${P}
|
|
|
|
# build directory (should be different from source directory):
|
|
BUILDDIR=${WORKDIR}/build
|
|
|
|
# logfile directory
|
|
LOGDIR=${WORKDIR}
|
|
|
|
|
|
# source the package class file a second time, so we can modify variables
|
|
# using their default values. (Defaults depend on other vairables in
|
|
# the class file like CATEGORY or PACKAGE)
|
|
source $SCLASS_DIR/$sit_classfile
|
|
|
|
sit_info "Package name: $PACKAGENAME"
|
|
sit_info "Installation PREFIX: $PREFIX"
|
|
sit_info "Working dir: $WORKDIR"
|
|
sit_info "Source dir: $SRCDIR"
|
|
sit_info "Build dir: $BUILDDIR"
|
|
sit_info "Logfile dir: $LOGDIR"
|
|
|
|
sit_countdown 3
|
|
|
|
# if working dir already exists and execution option is Default then remove
|
|
# previous working directory and create new
|
|
if [[ -d ${WORKDIR} && $sit_action == "all" ]] ; then
|
|
sit_info "Removing existing working directory ${WORKDIR}"
|
|
sit_countdown 5
|
|
rm -rf ${WORKDIR}
|
|
fi
|
|
|
|
if [ ! -d ${WORKDIR} ] ; then
|
|
mkdir -p ${WORKDIR}
|
|
mkdir -p ${BUILDDIR}
|
|
fi
|
|
|
|
if [ ! -z ${LOGDIR} ] ; then
|
|
mkdir -p ${LOGDIR}
|
|
else
|
|
# TODO: this is dangerous as we compress and copy all *.log files inside LOGDIR!
|
|
LOGDIR="/tmp"
|
|
fi
|
|
|
|
|
|
case $sit_action in
|
|
"sitinfo")
|
|
sit_sitinfo >> "$LOGDIR/sit_cmd.log"
|
|
;;
|
|
"unpack")
|
|
sit_unpack 2>&1 | tee "$LOGDIR/unpack.log"; ( exit ${PIPESTATUS[0]} )
|
|
;;
|
|
"prepare")
|
|
sit_prepare 2>&1 | tee "$LOGDIR/prepare.log"; ( exit ${PIPESTATUS[0]} )
|
|
;;
|
|
"configure")
|
|
sit_configure 2>&1 | tee "$LOGDIR/configure.log"; ( exit ${PIPESTATUS[0]} )
|
|
;;
|
|
"build")
|
|
sit_build 2>&1 | tee "$LOGDIR/make.log"; ( exit ${PIPESTATUS[0]} )
|
|
;;
|
|
"pretest")
|
|
sit_pretest 2>&1 | tee "$LOGDIR/pretest.log"; ( exit ${PIPESTATUS[0]} )
|
|
;;
|
|
"install")
|
|
sit_install 2>&1 | tee "$LOGDIR/make_install.log"; ( exit ${PIPESTATUS[0]} )
|
|
;;
|
|
"posttest")
|
|
sit_posttest 2>&1 | tee "$LOGDIR/posttest.log"; ( exit ${PIPESTATUS[0]} )
|
|
;;
|
|
"postinst")
|
|
sit_postinst 2>&1 | tee "$LOGDIR/postinst.log"; ( exit ${PIPESTATUS[0]} )
|
|
;;
|
|
"copy_logs")
|
|
sit_copy_logs
|
|
;;
|
|
"setperms")
|
|
sit_setperms
|
|
;;
|
|
"all")
|
|
sit_sitinfo >> "$LOGDIR/sit_cmd.log"
|
|
sit_unpack 2>&1 | tee "$LOGDIR/unpack.log"; ( exit ${PIPESTATUS[0]} )
|
|
sit_prepare 2>&1 | tee "$LOGDIR/prepare.log"; ( exit ${PIPESTATUS[0]} )
|
|
sit_configure 2>&1 | tee "$LOGDIR/configure.log"; ( exit ${PIPESTATUS[0]} )
|
|
sit_build 2>&1 | tee "$LOGDIR/make.log"; ( exit ${PIPESTATUS[0]} )
|
|
sit_pretest 2>&1 | tee "$LOGDIR/pretest.log"; ( exit ${PIPESTATUS[0]} )
|
|
sit_install 2>&1 | tee "$LOGDIR/make_install.log"; ( exit ${PIPESTATUS[0]} )
|
|
sit_posttest 2>&1 | tee "$LOGDIR/posttest.log"; ( exit ${PIPESTATUS[0]} )
|
|
sit_postinst 2>&1 | tee "$LOGDIR/postinst.log"; ( exit ${PIPESTATUS[0]} )
|
|
sit_copy_logs
|
|
sit_setperms
|
|
;;
|
|
*)
|
|
echo "Unknown action $sit_action"
|
|
usage
|
|
esac
|
|
|
|
|
|
|
|
cat <<EOF
|
|
##############################################################################
|
|
# IMPORTANT!
|
|
##############################################################################
|
|
# Do not forget to provide a module file!
|
|
##############################################################################
|
|
EOF
|
|
|
|
exit 0
|
|
|