diff --git a/EESSI-install-software.sh b/EESSI-install-software.sh index a2442e0d..a6f34413 100755 --- a/EESSI-install-software.sh +++ b/EESSI-install-software.sh @@ -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 @@ -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 @@ -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. @@ -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 @@ -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!" @@ -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} @@ -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 \ @@ -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}" @@ -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 @@ -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..." @@ -489,14 +502,14 @@ 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 @@ -504,7 +517,7 @@ else 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) @@ -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" @@ -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 @@ -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"