Skip to content
Snippets Groups Projects
install.sh 6.51 KiB
Newer Older
#!/bin/bash

# Absolute path to this script. /home/user/bin/foo.sh

SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
  DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
  SOURCE="$(readlink "$SOURCE")"
  [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path wh
ere the symlink file was located
done
BASE_PATH="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
TOP_PATH=$(dirname $(dirname $BASE_PATH))
PARENT_TOP_PATH=$(dirname $TOP_PATH)
BASE_CONFIG_PATH="${BASE_PATH}/config"
if [ -f ${BASE_CONFIG_PATH}/setup_var.sh ] ; then
  source ${BASE_CONFIG_PATH}/setup_var.sh 
fi

echo "base bath----${BASE_PATH}...."
echo "config path----${BASE_CONFIG_PATH}...."
echo "parent top path ----${PARENT_TOP_PATH}...."
echo "check if spack environment active"
CURRENT_SPACK_VERSION=$(spack --version)
if [ "x${CURRENT_SPACK_VERSION}" == "x" ]; then
echo "spack not loaded, module creation mode"
INSTALL_SPACK_VERSION=0.14
DEFAULT_SPACK_VERSION=0.14.2
BA_SPACK_VERSION=0.14.2
DEFAULT_CLUSTER_NAME=$(readlink /cineca | cut -d/ -f2)
DEFAULT_SPACK_BA_BASE="/cineca/prod/opt/tools/spack"
DEFAULT_SPACK_BA_MODULES="/cineca/prod/opt/modulefiles/global/tools/spack"
DEFAULT_SPACK_BA_SITELOCAL_PREFIX="/cineca/prod/opt/modulefiles/global/sitelocal/tools/spack-"
SPACK_MODULE_VERSION=$DEFAULT_SPACK_VERSION
SPACK_GIT_VERSION=$DEFAULT_SPACK_VERSION
CLUSTER_NAME=$DEFAULT_CLUSTER_NAME
SPACK_BA_BASE=$DEFAULT_SPACK_BA_BASE
SPACK_BA_MODULES=$DEFAULT_SPACK_BA_MODULES
SPACK_BA_SITELOCAL_PREFIX=$DEFAULT_SPACK_BA_SITELOCAL_PREFIX

SPECIFIC_CONFIG_PATH="${BASE_CONFIG_PATH}/specific/${CLUSTER_NAME}"
if [ -f ${SPECIFIC_CONFIG_PATH}/setup_var.sh ] ; then
  source ${SPECIFIC_CONFIG_PATH}/setup_var.sh 
fi
if ! [[ "x$1" == "x" ]]; then
  SPACK_MODULE_VERSION=$1
  if ! [[ "x$2" == "x" ]]; then
    CLUSTER_NAME=$2
    if ! [[ "x$3" == "x" ]]; then
      SPACK_BA_BASE=$3
      if ! [[ "x$4" == "x" ]]; then
        SPACK_BA_MODULES=$4
        if ! [[ "x$5" == "x" ]]; then
          SPACK_BA_SITELOCAL_PREFIX=$5
        fi
      fi
SPACK_ROOT=${SPACK_BA_BASE}/${SPACK_MODULE_VERSION}/none
DEPLOY_DIR=spack-${INSTALL_SPACK_VERSION}
CACHE_DIR=cache-${INSTALL_SPACK_VERSION}
SPACK_UPSTREAM_DEPLOY_DIR="${PARENT_TOP_PATH}/${DEPLOY_DIR}"
SPACK_UPSTREAM_CACHE_DIR="${PARENT_TOP_PATH}/${CACHE_DIR}"

###  deploying spack source
if [ -d ${SPACK_ROOT}/.git ] ; then
  echo "Skipping spack git download, folder: ${SPACK_ROOT} is already under git"
else 
  rmdir ${SPACK_ROOT}
  GIT_DEPLOYER_TOOL="${TOP_PATH}/spack_deploy/bin/spack-deploy --workdir $BASE_PATH  gitmanager deploy"
  SPACK_GIT_BRANCH=$SPACK_GIT_VERSION
  if  [[ $SPACK_GIT_VERSION =~ $re ]] ; then
      SPACK_GIT_BRANCH="v$SPACK_GIT_VERSION"
      SPACK_GIT_BRANCH="$SPACK_GIT_VERSION"
  fi
  GIT_DEPLOYER_COMMAND="${GIT_DEPLOYER_TOOL} --origin_master ${SPACK_GIT_BRANCH} --integration_branch devel/${SPACK_GIT_BRANCH} --git_dest ${SPACK_ROOT}"
  echo "Deploying spack git:"
  echo "-->${GIT_DEPLOYER_COMMAND}<--"
  ${GIT_DEPLOYER_COMMAND} 
#config file handling ( currently link
SPACK_CONFIG_DIR=$SPACK_ROOT/etc/spack
link_files="$(ls ${BASE_CONFIG_PATH}/common/*.yaml) $(ls ${BASE_CONFIG_PATH}/specific/${CLUSTER_NAME}/*.yaml)"

for link_file in $link_files; do
  echo "processing $link_file"
  filename=$(basename $link_file)
  if [ -f ${SPACK_CONFIG_DIR}/$filename ]
  then
    echo "skipping link, file ${SPACK_CONFIG_DIR}/$filename already exists"
  else
    echo "linking $filename into $SPACK_CONFIG_DIR" 
    ln -s $link_file $SPACK_CONFIG_DIR
  fi
done

#create spack config repos from the corresponding .ini template
CUSTOM_REPO_DIR=${BASE_PATH}/repos
cat ${BASE_CONFIG_PATH}/common/repos.yaml.ini | sed -e "
   s@__CUSTOM_REPO_DIR__@${CUSTOM_REPO_DIR}@" >  ${SPACK_CONFIG_DIR}/repos.yaml


#module construction
#check if exists BA related sitelocal module file

MODULE_TEMPLATE_FILE_COMMON="${BASE_CONFIG_PATH}/common/BA/spack_module"
MODULE_TEMPLATE_FILE_SPECIFIC="${BASE_CONFIG_PATH}/specific/${CLUSTER_NAME}/BA/spack_module"
MODULE_TEMPLATE_FILE="${BASE_CONFIG_PATH}/common/BA/spack_module"

if [ -f ${MODULE_TEMPLATE_FILE_SPECIFIC} ]; then
  MODULE_TEMPLATE_FILE="${MODULE_TEMPLATE_FILE_SPECIFIC}"
else
  MODULE_TEMPLATE_FILE="${MODULE_TEMPLATE_FILE_COMMON}"
fi 
BA_SITELOCAL_FILE=${SPACK_BA_SITELOCAL_PREFIX}${SPACK_MODULE_VERSION}
if ! [ -f ${BA_SITELOCAL_FILE} ]; then
  echo "WARNING!! building module without BA"
  BA_SITELOCAL_PREVIOUS_FILE=${SPACK_BA_SITELOCAL_PREFIX}${BA_SPACK_VERSION}
  if [ -f ${BA_SITELOCAL_PREVIOUS_FILE} ]; then
   cat ${BA_SITELOCAL_PREVIOUS_FILE} | sed s/${BA_SPACK_VERSION}/${SPACK_MODULE_VERSION}/ > ${BA_SITELOCAL_FILE}
  else
    echo "ERROR!! missing prefious sitelocal file -->${BA_SITELOCAL_PREVIOUS_FILE}"
  fi
fi
cat ${MODULE_TEMPLATE_FILE} | sed -e "
   s/__SPACK_MODULE_VERSION__/${SPACK_MODULE_VERSION}/
   s/__INSTALL_SPACK_VERSION__/${INSTALL_SPACK_VERSION}/
   s@__BA_HOME__@${BA_HOME}@
   s/__SPACK_MODULE_VERSION__/spack-${SPACK_VERSION}/
   s@__SPACK_UPSTREAM_DEPLOY_DIR__@${SPACK_UPSTREAM_DEPLOY_DIR}@ 
   s@__SPACK_UPSTREAM_CACHE_DIR__@${SPACK_UPSTREAM_CACHE_DIR}@ 
   s@__DEPLOY_ROOT__@${BASE_CONFIG_PATH}@ 
   s@__DEFAULT_SPACK_BA_BASE__@${DEFAULT_SPACK_BA_BASE}@ 
   s/__CLUSTER_NAME__/${CLUSTER_NAME}/" > ${SPACK_BA_MODULES}/${SPACK_MODULE_VERSION}
#activate the spack just installed 
source ${SPACK_ROOT}/share/spack/setup-env.sh
#add system compiler   
spack --no-env compiler add --scope site 
else
  echo "found active spack ${CURRENT_SPACK_VERSION}"
  if [ "x" == "x${SPACK_DEPLOY_CLUSTER_NAME}" ]; then
    echo "error missing env variable SPACK_DEPLOY_CLUSTER_NAME, spack has not been loaded through module. use-->  module load spack"
  else
    echo "Available envs to be installed"
    ENVIRONMENTS_PATH="${BASE_PATH}/envs"
    install_dirs="$(python ${BASE_PATH}/sort_folders.py ${ENVIRONMENTS_PATH}/common  ${ENVIRONMENTS_PATH}/specific/${SPACK_DEPLOY_CLUSTER_NAME})"

    for dir in $install_dirs; do
      if [ -d $dir ]
      then
#        echo "##processing dir  $dir"
        if [ -f ${dir}/install.sh ]
        then
#          echo "#executing ${dir}/install.sh "
          echo "${dir}/install.sh "
        else
          if [ -f ${dir}/spack.yaml ]
          then
#            echo "#executing spack install inside env $dir"
            echo "cd ${dir}; spack install"
          fi
        fi
      fi

    done

    echo "please configure current spack install and modules as upstream for unprivileged users by:"
    echo "${BASE_CONFIG_PATH}/build_config.sh"