#!/bin/bash # # Install script inspired by the ebuild system of Gentoo Linux # # Copyright (c) 2011-2018 Christoph Niethammer # set -e function show_help() { echo "Usage: $0 [options] [action] " 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 if [ "$COMPILER" == "system" ] ; then echo "Using system default compiler" COMPILER="" # prevent any compiler specs in the prefix else case $PLATFORM in hazelhen) module swap $(module list -l 2>&1 | awk '/^PrgEnv-/{print $1}') PrgEnv-${COMPILER} if [ ! -z "$COMPILER_VERSION" ] ; then if [ "${COMPILER}" == "gnu" ] ; then module swap gcc gcc/$COMPILER_VERSION else module swap $COMPILER $COMPILER/$COMPILER_VERSION fi # adjust MPICH and libsci versions to match compiler module load cray-mpich-compat/v7 || module load cray-mpich-compat/v6 fi MPI_DIR=$MPICH_DIR ;; laki|vulcan|*) if [ -z "$COMPILER_VERSION" ] ; then COMPILER_MODULE=compiler/${COMPILER} else COMPILER_MODULE=compiler/${COMPILER}/${COMPILER_VERSION} fi echo "Loading compiler module ${COMPILER_MODULE}" module load ${COMPILER_MODULE} ;; esac fi if [ ! -z "${COMPILER}" ] ; then # reevaluate compiler version COMPILER_VERSION=$(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" fi if [ ! -z "$MPI" ] ; then MPI_MODULE="mpi/$MPI" sit_info_verbose "MPI: $MPI" sit_info_verbose "MPI version: $MPI_VERSION" if [ ! -z "$MPI_VERSION" ] ; then MPI_VERSION_NUM=${MPI_VERSION%%-*} case $MPI in impi) MPI_MODULE=${MPI_MODULE}${MPI_VERSION_NUM:+"/${MPI_VERSION_NUM}"} ;; *) MPI_MODULE=${MPI_MODULE}${MPI_VERSION_NUM:+"/${MPI_VERSION_NUM}-$COMPILER-$COMPILER_VERSION"} ;; esac fi echo "Loading MPI module ${MPI_MODULE}" module load $MPI_MODULE case $COMPILER in intel) if [[ $MPI == "impi" ]] ; then MPICC="mpiicc" MPICXX="mpiicpc" MPIFC="mpiifort" else MPICC="mpicc" MPICXX="mpicxx" MPIFC="mpif90" fi ;; gnu|*) 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 <