Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 37 additions & 24 deletions EESSI-install-software.sh
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ if [[ "${EESSI_INTERACTIVE_BUILD}" == "onfail" ]]; then
fi

# honor $TMPDIR if it is already defined, use /tmp otherwise
if [ -z $TMPDIR ]; then
if [[ -z $TMPDIR ]]; then
export WORKDIR=/tmp/$USER
else
export WORKDIR=$TMPDIR/$USER
Expand All @@ -155,7 +155,7 @@ if [[ "$EASYBUILD_OPTARCH" == "GENERIC" ]]; then
fi

echo ">> Determining software subdirectory to use for current build host..."
if [ -z $EESSI_SOFTWARE_SUBDIR_OVERRIDE ]; then
if [[ -z $EESSI_SOFTWARE_SUBDIR_OVERRIDE ]]; then
export EESSI_SOFTWARE_SUBDIR_OVERRIDE=$(python3 $TOPDIR/eessi_software_subdir.py $DETECTION_PARAMETERS)
echo ">> Determined \$EESSI_SOFTWARE_SUBDIR_OVERRIDE via 'eessi_software_subdir.py $DETECTION_PARAMETERS' script"
else
Expand All @@ -173,18 +173,30 @@ else

# make sure the the software and modules directory exist
# (since it's expected by init/eessi_environment_variables when using archdetect and by the EESSI module)
mkdir -p -v ${EESSI_PREFIX}/software/${EESSI_OS_TYPE}/${EESSI_SOFTWARE_SUBDIR_OVERRIDE}/{modules,software}
if [[ ! -z "${EESSI_SITE_INSTALL_FORCE}" ]]; then
if [[ ! -z "${EESSI_SITE_SOFTWARE_PREFIX}" ]]; then
mkdir -p -v ${EESSI_SITE_SOFTWARE_PREFIX}/versions/${EESSI_VERSION_OVERRIDE:-${EESSI_VERSION}}/software/${EESSI_OS_TYPE}/${EESSI_SOFTWARE_SUBDIR_OVERRIDE}/{modules,software}
else
fatal_error 'Requested a site installation, but $EESSI_SITE_SOFTWARE_PREFIX is somehow not set?! This should have been set by bot/build.sh.'
fi
else
mkdir -p -v ${EESSI_PREFIX}/software/${EESSI_OS_TYPE}/${EESSI_SOFTWARE_SUBDIR_OVERRIDE}/{modules,software}
fi

# If EESSI_ACCELERATOR_TARGET_OVERRIDE is defined, we are building for an accelerator target
# In that case, make sure the modulepath for the accelerator subdir exists, otherwise the EESSI module will not
# set EESSI_ACCELERATOR_TARGET and the if-condition later in this script which checks if EESSI_ACCELERATOR_TARGET
# is equal to EESSI_ACCELERATOR_TARGET_OVERRIDE will fail
# See https://github.com/EESSI/software-layer-scripts/pull/59#issuecomment-3173593882
if [ -n $EESSI_ACCELERATOR_TARGET_OVERRIDE ]; then
if [[ -n $EESSI_ACCELERATOR_TARGET_OVERRIDE ]]; then
# Note that ${EESSI_PREFIX}/software/${EESSI_OS_TYPE}/${EESSI_SOFTWARE_SUBDIR_OVERRIDE}/${EESSI_ACCELERATOR_TARGET_OVERRIDE}/modules/all
# is only the correct path if EESSI_ACCEL_SOFTWARE_SUBDIR_OVERRIDE is not set
if [ -z $EESSI_ACCEL_SOFTWARE_SUBDIR_OVERRIDE ]; then
mkdir -p -v ${EESSI_PREFIX}/software/${EESSI_OS_TYPE}/${EESSI_SOFTWARE_SUBDIR_OVERRIDE}/${EESSI_ACCELERATOR_TARGET_OVERRIDE}/modules/all
if [[ -z $EESSI_ACCEL_SOFTWARE_SUBDIR_OVERRIDE ]]; then
if [[ ! -z "${EESSI_SITE_INSTALL_FORCE}" ]]; then
mkdir -p -v ${EESSI_SITE_SOFTWARE_PREFIX}/versions/${EESSI_VERSION_OVERRIDE:-${EESSI_VERSION}}/software/${EESSI_OS_TYPE}/${EESSI_SOFTWARE_SUBDIR_OVERRIDE}/${EESSI_ACCELERATOR_TARGET_OVERRIDE}/modules/all
else
mkdir -p -v ${EESSI_PREFIX}/software/${EESSI_OS_TYPE}/${EESSI_SOFTWARE_SUBDIR_OVERRIDE}/${EESSI_ACCELERATOR_TARGET_OVERRIDE}/modules/all
fi
else
# At runtime, one might want to use a different CPU subdir for a given accelerator. E.g. one could use
# a zen2 CPU subdir on a zen4 node if the required GPU software isn't available in the zen4 tree.
Expand All @@ -203,7 +215,7 @@ fi
echo ">> Setting up environment..."

# If EESSI_VERSION is not set, source the defaults script to set it
if [ -z ${EESSI_VERSION} ]; then
if [[ -z ${EESSI_VERSION} ]]; then
source $TOPDIR/init/eessi_defaults
fi

Expand Down Expand Up @@ -261,13 +273,13 @@ else
fatal_error "Not running in Gentoo Prefix environment, run '${EPREFIX}/startprefix' first!"
fi

if [ -d $EESSI_CVMFS_REPO ]; then
if [[ -d $EESSI_CVMFS_REPO ]]; then
echo_green "$EESSI_CVMFS_REPO available, OK!"
else
fatal_error "$EESSI_CVMFS_REPO is not available!"
fi
if [[ -n "$EESSI_CVMFS_REPO_OVERRIDE" && "$EESSI_CVMFS_REPO" != "$EESSI_CVMFS_REPO_OVERRIDE" ]]; then
if [ -d "$EESSI_CVMFS_REPO_OVERRIDE" ]; then
if [[ -d "$EESSI_CVMFS_REPO_OVERRIDE" ]]; then
echo_green "$EESSI_CVMFS_REPO_OVERRIDE available, OK!"
else
fatal_error "$EESSI_CVMFS_REPO_OVERRIDE is not available!"
Expand All @@ -294,13 +306,14 @@ export PYTHONUNBUFFERED=1
# - .lmod/lmodrc.lua
# - .lmod/SitePackage.lua
if [[ -n "${EESSI_SITE_INSTALL_FORCE}" ]]; then
_eessi_software_path=${EESSI_CVMFS_REPO_OVERRIDE}/versions/${EESSI_VERSION_OVERRIDE:-${EESSI_VERSION}}/software/${EESSI_OS_TYPE}/${EESSI_SOFTWARE_SUBDIR_OVERRIDE}
# note: we need to use EESSI_SITE_SOFTWARE_PREFIX_BACKUP here, as we have temporarily unset EESSI_SITE_SOFTWARE_PREFIX above
_eessi_software_path=${EESSI_SITE_SOFTWARE_PREFIX_BACKUP}/versions/${EESSI_VERSION_OVERRIDE:-${EESSI_VERSION}}/software/${EESSI_OS_TYPE}/${EESSI_SOFTWARE_SUBDIR_OVERRIDE}
else
_eessi_software_path=${EESSI_PREFIX}/software/${EESSI_OS_TYPE}/${EESSI_SOFTWARE_SUBDIR_OVERRIDE}
fi
_lmod_cfg_dir=${_eessi_software_path}/.lmod
_lmod_rc_file=${_lmod_cfg_dir}/lmodrc.lua
if [ ! -f ${_lmod_rc_file} ]; then
if [[ ! -f ${_lmod_rc_file} ]]; then
echo "Lmod file '${_lmod_rc_file}' does not exist yet; creating it..."
command -V python3
python3 ${TOPDIR}/create_lmodrc.py ${_eessi_software_path}
Expand Down Expand Up @@ -371,7 +384,7 @@ temp_install_storage=${TMPDIR}/temp_install_storage
# Make sure that we use the easystack files from the git repository, which has an additional subdirectory ${EESSI_VERSION} at the end
export NVIDIA_EASYSTACKS_DIRECTORY=${TOPDIR}/scripts/gpu_support/nvidia/easystacks/${EESSI_VERSION}
mkdir -p ${temp_install_storage}
if [ -z "${skip_cuda_install}" ] || [ ! "${skip_cuda_install}" ]; then
if [[ -z "${skip_cuda_install}" ]] || [[ ! "${skip_cuda_install}" ]]; then
${TOPDIR}/scripts/gpu_support/nvidia/install_cuda_and_libraries.sh \
-t ${temp_install_storage} \
--accept-cuda-eula \
Expand Down Expand Up @@ -402,16 +415,16 @@ if [[ ! -z "${EESSI_SITE_INSTALL}" && ! -z "${EESSI_SITE_SOFTWARE_PREFIX}" ]]; t
echo "EASYBUILD_INSTALLPATH=${EASYBUILD_INSTALLPATH}"
fi

if [ ! -z "${shared_fs_path}" ]; then
if [[ ! -z "${shared_fs_path}" ]]; then
shared_eb_sourcepath=${shared_fs_path}/easybuild/sources
echo ">> Using ${shared_eb_sourcepath} as shared EasyBuild source path"
export EASYBUILD_SOURCEPATH=${shared_eb_sourcepath}:${EASYBUILD_SOURCEPATH}
fi

# if an accelerator target is specified, we need to make sure that the CPU-only modules are also still available
if [ ! -z ${EESSI_ACCELERATOR_TARGET} ]; then
if [[ ! -z ${EESSI_ACCELERATOR_TARGET} ]]; then
CPU_ONLY_MODULES_PATH=$(echo $EASYBUILD_INSTALLPATH | sed "s@/${EESSI_ACCELERATOR_TARGET}@@g")/modules/all
if [ -d ${CPU_ONLY_MODULES_PATH} ]; then
if [[ -d ${CPU_ONLY_MODULES_PATH} ]]; then
module use ${CPU_ONLY_MODULES_PATH}
else
fatal_error "Derived path to CPU-only modules does not exist: ${CPU_ONLY_MODULES_PATH}"
Expand All @@ -433,7 +446,7 @@ fi
# Note that we exclude the scripts/gpu_support/ dir, since those are not meant to be built in the
# software-layer, but they are helper easystacks for installing e.g. CUDA in host_injections
changed_easystacks=$(cat ${pr_diff} | grep '^+++' | cut -f2 -d' ' | sed 's@^[a-z]/@@g' | grep 'easystacks/.*yml$' | egrep -v 'known-issues|missing' | (grep -v "scripts/gpu_support/" || true))
if [ -z "${changed_easystacks}" ]; then
if [[ -z "${changed_easystacks}" ]]; then
echo "No missing installations, party time!" # Ensure the bot report success, as there was nothing to be build here
else

Expand All @@ -453,10 +466,10 @@ else
# make sure that easystack file being picked up is for EESSI version that we're building for...
# Preferentially check EESSI_CVMFS_REPO_OVERRIDE (since that is set for site builds), otherwise default to EESSI_CVMFS_REPO
echo "${easystack_file}" | grep -q "^easystacks/$(basename ${EESSI_CVMFS_REPO_OVERRIDE:-${EESSI_CVMFS_REPO}})/${EESSI_VERSION}${EESSI_SOFTWARE_LAYER_VERSION_SUFFIX}/"
if [ $? -ne 0 ]; then
if [[ $? -ne 0 ]]; then
# Check if this was even an easystack file for the right repository
echo "${easystack_file}" | grep -q "^easystacks/$(basename ${EESSI_CVMFS_REPO_OVERRIDE:-${EESSI_CVMFS_REPO}})"
if [ $? -ne 0 ]; then
if [[ $? -ne 0 ]]; then
echo_yellow "Easystack file ${easystack_file} is not intended for the repository ${EESSI_CVMFS_REPO_OVERRIDE:-${EESSI_CVMFS_REPO}}, skipping it..."
else
echo_yellow "Easystack file ${easystack_file} is not intended for EESSI version ${EESSI_VERSION}${EESSI_SOFTWARE_LAYER_VERSION_SUFFIX}, skipping it..."
Expand Down Expand Up @@ -489,22 +502,22 @@ else
debug_shell "environment is ready to run: ${eb_cmd}"
fi

if [ -f ${easystack_file} ]; then
if [[ -f ${easystack_file} ]]; then
echo_green "Feeding easystack file ${easystack_file} to EasyBuild..."

${eb_cmd}
ec=$?

# copy EasyBuild log file if EasyBuild exited with an error
if [ ${ec} -ne 0 ]; then
if [[ ${ec} -ne 0 ]]; then
# If easybuild had a non-zero exit code, and EESSI_INTERACTIVE_BUILD=onfail, you'll get a debug
# shell so you can debug the failure
if [[ "${EESSI_INTERACTIVE_BUILD}" == "onfail" ]]; then
debug_shell "EasyBuild failed with exit code ${ec} for command: ${eb_cmd}"
fi
eb_last_log=$(eb --last-log | grep ^/.*\.log)
# copy to current working directory if file exhists
if [ -f ${eb_last_log} ]; then
if [[ -f ${eb_last_log} ]]; then
cp -a ${eb_last_log} .
echo "Last EasyBuild log file copied from ${eb_last_log} to ${PWD}"
# copy to build logs dir (with context added)
Expand Down Expand Up @@ -538,7 +551,7 @@ if [[ -z "${EESSI_SITE_INSTALL}" ]]; then
echo "Path to lmodrc.lua changed to '${lmod_rc_file}'"
fi
lmodrc_changed=$(cat ${pr_diff} | grep '^+++' | cut -f2 -d' ' | sed 's@^[a-z]/@@g' | grep '^create_lmodrc.py$' > /dev/null; echo $?)
if [ ! -f $lmod_rc_file ] || [ ${lmodrc_changed} == '0' ]; then
if [[ ! -f $lmod_rc_file ]] || [[ ${lmodrc_changed} == '0' ]]; then
echo ">> Creating/updating Lmod RC file (${lmod_rc_file})..."
python3 $TOPDIR/create_lmodrc.py ${EASYBUILD_INSTALLPATH}
check_exit_code $? "$lmod_rc_file created" "Failed to create $lmod_rc_file"
Expand All @@ -548,7 +561,7 @@ else
# The only way to then trigger a redeploy is if we do something like
# python3 $TOPDIR/create_lmodrc.py $TMDPIR
# foo=$(diff $lmod_rc_file $TMPDIR/.lmod/lmodrc.lua)
# if [ -z $foo ]; then
# if [[ -z $foo ]]; then
# python3 $TOPDIR/create_lmodrc.py ${EASYBUILD_INSTALLPATH}
# fi
# in order to detect if our deployed lmodrc.lua is different from the one that _would_ be newly generated
Expand All @@ -565,7 +578,7 @@ if [[ -z "${EESSI_SITE_INSTALL}" ]]; then
echo "Path to SitePackage.lua changed to '${lmod_sitepackage_file}'"
fi
sitepackage_changed=$(cat ${pr_diff} | grep '^+++' | cut -f2 -d' ' | sed 's@^[a-z]/@@g' | grep '^create_lmodsitepackage.py$' > /dev/null; echo $?)
if [ ! -f "$lmod_sitepackage_file" ] || [ "${sitepackage_changed}" == '0' ]; then
if [[ ! -f "$lmod_sitepackage_file" ]] || [[ "${sitepackage_changed}" == '0' ]]; then
echo ">> Creating/updating Lmod SitePackage.lua (${lmod_sitepackage_file})..."
python3 $TOPDIR/create_lmodsitepackage.py ${EASYBUILD_INSTALLPATH}
check_exit_code $? "$lmod_sitepackage_file created" "Failed to create $lmod_sitepackage_file"
Expand Down
Loading