sit/sit

279 lines
7.8 KiB
Bash
Executable file

#!/bin/bash -l
#
# Install script inspired by the ebuild system of Gentoo Linux
#
# Copyright (c) 2011-2016 Christoph Niethammer <niethammer@hlrs.de>
#
# exit on any error!
set -e
# for debugging:
# set -x
SIT_PATH=$(cd $(dirname $PWD/$0); pwd)
SIT_CONFIG_FILE=$SIT_PATH/etc/sit.conf
SIT_USER_CONFIG_FILE=$HOME/.sit
# sit action to be performed
sit_action=$2
if [[ -n $sit_action ]] ; then
echo "Performing action: $sit_action"
else
sit_action="all"
fi
# 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
source "$SIT_PATH/functions.sh"
sit_countdown 1
# identify platform manually if no environment variable was set
PLATFORM=${PLATFORM:=$SITE_PLATFORM_NAME}
if [ -z $PLATFORM ]; then
sit_info "Unknown platform using default platform '${DEFAULT_PLATFORM}' configuration"
PLATFORM="${DEFAULT_PLATFORM}"
fi
sit_info "Platform: $PLATFORM"
# compiler to use
# (gnu|intel|pgi)
COMPILER=${COMPILER:=${DEFAULT_COMPILER}}
# use specific compiler version
COMPILER_VERSION=${COMPILER_VERSION:=}
# add a descriptor at the end of the installation path e.g. for special config options etc.
PACKAGE_DESCRIPTOR=${PACKAGE_DESCRIPTOR:+-$PACKAGE_DESCRIPTOR}
# 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|*)
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"
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
echo "MPI compiler env: MPICC=$MPICC, MPICXX=$MPICXX, MPIFC=$MPIFC"
MPI_DIR=${MPI_DIR:=$(dirname $(dirname $(which $MPICC)))}
fi
SCLASSFILE=$1
ACTION=$2
if [ -f $SCLASS_DIR/$SCLASSFILE ] ; then
source $SCLASS_DIR/$SCLASSFILE
else
sit_fail "Could not find file $SCLASS_DIR/$SCLASSFILE"
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}
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/$SCLASSFILE
echo "Package name: $PACKAGENAME"
echo "Installation PREFIX: $PREFIX"
echo "Working dir: $WORKDIR"
echo "Source dir: $SRCDIR"
echo "Build dir: $BUILDDIR"
echo "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} && -z $sit_action ]] ; 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"
esac
cat <<EOF
##############################################################################
# IMPORTANT!
##############################################################################
# Do not forget to provide a module file!
##############################################################################
EOF
exit 0