Software Installation Tool (sit) is a package manager inspired by Gentoo's emerge.
Find a file
Muhammad Usman Saleem 8bfffc5fe9 #!/bin/bash -l
#
# Install script inspired by the ebuild system of Gentoo Linux
#
# Christoph Niethammer <niethammer@hlrs.de> (C) 2011-2013
#
 
# exit on any error!
set -e
# for debugging:
# set -x 

# Reading in execution option
SIT_RUN_OPTION=$2
if [[ -n $SIT_RUN_OPTION ]] ; then
	echo "Executing with option: $SIT_RUN_OPTION"
else
	echo "Default execution"
fi

SIT_PATH=$(dirname $PWD/$0)
SIT_CONFIG_FILE=$SIT_PATH/etc/sit.conf
SIT_USER_CONFIG_FILE=$HOME/.sit

# 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
        hermit|hermit1)
            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
            fi
            ;;
        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_RUN_OPTION ]] ; 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_RUN_OPTION 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
;;
"")
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 "Argument $SIT_RUN_OPTION unrecognized."
esac


#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  


cat <<EOF
##############################################################################
# IMPORTANT!
##############################################################################
# Do not forget to provide a module file!
##############################################################################
EOF

exit 0
2024-03-28 02:45:19 +01:00
etc Fixed typo. 2024-03-28 02:45:19 +01:00
packages #!/bin/bash -l 2024-03-28 02:45:19 +01:00
tests Some more automazosm: Run test for every available mpi module. 2024-03-28 02:43:56 +01:00
check_linking.sh Improved check_linking script. 2024-03-28 02:43:56 +01:00
check_modules.sh More secure way to prevent conflicts if multiple user execute script on the same system. 2024-03-28 02:43:58 +01:00
check_mpi.sh Modified check_modules.sh script running the mpi_test_suite for allOpen MPI instalaltions. 2024-03-28 02:45:19 +01:00
check_permissions.sh New parameter to suppress the list of file/directory with wrong permissions. 2024-03-28 02:43:56 +01:00
functions.sh added sit_postinst for final messages etc. after installation is finished 2024-03-28 02:43:58 +01:00
install_toolchain.sh Updated autotool chain install script. 2024-03-28 02:45:19 +01:00
module_stats.py Added option --excluldeusers ignoring users based on a given regular expression. 2024-03-28 02:45:19 +01:00
ompss_install.sh ompss_install.sh: enable debugging info per default; ayudame 2024-03-28 02:43:56 +01:00
python_install.sh Added python install script for Laki. 2024-03-28 02:43:56 +01:00
README Fixed typo in variable name. 2024-03-28 02:45:19 +01:00
sit #!/bin/bash -l 2024-03-28 02:45:19 +01:00
sit-list-installed.py Initial version of the sit script listing all versions of installed modules. 2024-03-28 02:43:56 +01:00
starss_install.sh Update Copyright. 2024-03-28 02:43:55 +01:00
StarSs_testing_install.sh Added environment variable for compileer 2024-03-28 02:43:56 +01:00
vampirtrace_install.sh Update Copyright. 2024-03-28 02:43:55 +01:00

Software Installation Tool (SIT)
--------------------------------

SIT is a simple software installation tool inspired by gentoo's emerge script.
It eases the installation process and helps to prevent errors during the 
installation as well as helps with the documentation as it generates a lot of
log files and installes them together with the softwre package.

In its current version it can only install a package using a package class file
including the necessary information

The package tree resides per default in the directory $SIT_PATH/packages. For
convenience it should look like following
  $SIT_PATH/packages/CATEGORY/PACKAGE/PACKAGE-VERSION


The global configuration file of SIT is $SIT_PATH/etc/sit.conf
It includes a variety of default values:
* PREFIX_BASE
* SRC_POOL     
* SCLASS_DIR

* DEFAULT_PLATFORM
* DEFAULT_COMPILER

A user specific configuration file $HOME/.sit" can be used to overwrite the 
settings in the global configuration file.

The installation process is currently controled with the following environment 
variables:
* COMPILER
* COMPILER_VERSION
* MPI
* MPI_VERSION
* PLATFORM
* HOSTNAME

Sit detects currently the build platform using the SITE_PLATFORM_NAME variable.
If sit cannot determine the PLATFORM it uses the default platform specified
in sit.conf.
For each platform configuration files are stored unter 
  $SIT_PATH/etc/platform-configs/$PLATFORM/*

At the moment only compiler configurations are supported.


To install a package simply call sit with the necessary information provided by 
these variables:
> [VARIABLE_DECLARATIONS] sit PACKAGE

e.g.

> PREFIX_BASE=/opt COMPILER=gnu COMPILER_VERSION=4.5 sit mpi/openmpi-1.5.1



PACKAGE FILES:

Package files should include all the necessary information for the installation
proces. The syntax of the package class files is inspired by gentoo's ebuild files.


A sit package file must contain at least the following variables

A   archive (source tarball)
P   package (name of extracted source folder)
URL
INSTALLER


Optional varialbes to control the build process are

CONFIGURE_OPTS  options which will be passed to configure
CMAKE_OPTS      options which will be passed to cmake
MAKEOPTS        options which will be passed to make (see sit.conf)


During the installation the following directory paths are used
WORKDIR         working directory to which e.g. sources will be unpacked
SRCDIR          source directory
BUILDDIR        directory in which the package will be build ($SRCDIR/build)
LOGDIR          directory storing the temporary logfiles ($WORKDIR)


For fine tuning of the installation process the user can overwrite the following 
functions. If not other mentioned they are executed in $BUILDDIR

src_unpack      extract $SRC_POOL/${A} into $WORKDIR
src_prepare     prepare extracted sources
src_configure   configure
src_build       make
src_pretest     tests to be performed before installation
src_install     make install
src_posttest    tests to be done after installation


The following helper functions can be used 

unpack      recognize and extract a compressed tar file