@@ -147,6 +147,12 @@ else
147147 # Make sure EESSI_PREFIX and EESSI_OS_TYPE are set
148148 source $TOPDIR /init/minimal_eessi_env
149149
150+ # We've found that creation of new files and directories by unionfs (or any overlay fs) can fail if it
151+ # runs on top of CVMFS because the lower-dir provided by CVMFS is not fully initialized. It seems
152+ # these issues can be avoided simply by running an ls, to at least trigger the mount
153+ echo " >> Trigger automounting of the repo ($EESSI_CVMFS_REPO ) before creating new files, to avoid overlay issues"
154+ ls -al $EESSI_CVMFS_REPO
155+
150156 # make sure the the software and modules directory exist
151157 # (since it's expected by init/eessi_environment_variables when using archdetect and by the EESSI module)
152158 mkdir -p -v ${EESSI_PREFIX} /software/${EESSI_OS_TYPE} /${EESSI_SOFTWARE_SUBDIR_OVERRIDE} /{modules,software}
210216pr_diff=$( ls [0-9]* .diff | head -n 1)
211217export PR_DIFF=" $PWD /$pr_diff "
212218
213- # Only run install_scripts.sh if not in dev.eessi.io for security
214- if [[ -z ${EESSI_DEV_PROJECT} ]]; then
219+ # Only run install_scripts.sh if not in dev.eessi.io (for security)
220+ # Also skip installing scripts for site-installs
221+ if [[ -z ${EESSI_DEV_PROJECT} && -z " ${EESSI_SITE_INSTALL_FORCE} " ]]; then
215222 ${TOPDIR} /install_scripts.sh --prefix ${EESSI_CVMFS_REPO} /versions/${EESSI_VERSION} --eessi-version ${EESSI_VERSION}
216223fi
217224
@@ -221,6 +228,10 @@ module --force purge
221228module unuse $MODULEPATH
222229
223230# Initialize the EESSI environment
231+ # Unset EESSI_SITE_SOFTWARE_PREFIX initially (& back it up for later restore), so that things like the CUDA
232+ # drivers and libraries are installed in /cvmfs/software.eessi.io, and not in the EESSI_SITE_SOFTWARE_PREFIX
233+ EESSI_SITE_SOFTWARE_PREFIX_BACKUP=${EESSI_SITE_SOFTWARE_PREFIX}
234+ unset EESSI_SITE_SOFTWARE_PREFIX
224235module use $TOPDIR /init/modules
225236module load EESSI/$EESSI_VERSION
226237
@@ -237,6 +248,13 @@ if [ -d $EESSI_CVMFS_REPO ]; then
237248else
238249 fatal_error " $EESSI_CVMFS_REPO is not available!"
239250fi
251+ if [[ -n " $EESSI_CVMFS_REPO_OVERRIDE " && " $EESSI_CVMFS_REPO " != " $EESSI_CVMFS_REPO_OVERRIDE " ]]; then
252+ if [ -d " $EESSI_CVMFS_REPO_OVERRIDE " ]; then
253+ echo_green " $EESSI_CVMFS_REPO_OVERRIDE available, OK!"
254+ else
255+ fatal_error " $EESSI_CVMFS_REPO_OVERRIDE is not available!"
256+ fi
257+ fi
240258
241259# Check that EESSI_SOFTWARE_SUBDIR now matches EESSI_SOFTWARE_SUBDIR_OVERRIDE
242260if [[ -z ${EESSI_SOFTWARE_SUBDIR} ]]; then
@@ -257,7 +275,11 @@ export PYTHONUNBUFFERED=1
257275# ${EESSI_PREFIX}/software/${EESSI_OS_TYPE}/${EESSI_SOFTWARE_SUBDIR_OVERRIDE}
258276# - .lmod/lmodrc.lua
259277# - .lmod/SitePackage.lua
260- _eessi_software_path=${EESSI_PREFIX} /software/${EESSI_OS_TYPE} /${EESSI_SOFTWARE_SUBDIR_OVERRIDE}
278+ if [[ -n " ${EESSI_SITE_INSTALL_FORCE} " ]]; then
279+ _eessi_software_path=${EESSI_CVMFS_REPO_OVERRIDE} /versions/${EESSI_VERSION_OVERRIDE:- ${EESSI_VERSION} } /software/${EESSI_OS_TYPE} /${EESSI_SOFTWARE_SUBDIR_OVERRIDE}
280+ else
281+ _eessi_software_path=${EESSI_PREFIX} /software/${EESSI_OS_TYPE} /${EESSI_SOFTWARE_SUBDIR_OVERRIDE}
282+ fi
261283_lmod_cfg_dir=${_eessi_software_path} /.lmod
262284_lmod_rc_file=${_lmod_cfg_dir} /lmodrc.lua
263285if [ ! -f ${_lmod_rc_file} ]; then
@@ -266,7 +288,7 @@ if [ ! -f ${_lmod_rc_file} ]; then
266288 python3 ${TOPDIR} /create_lmodrc.py ${_eessi_software_path}
267289fi
268290_lmod_sitepackage_file=${_lmod_cfg_dir} /SitePackage.lua
269- if [ ! -f ${_lmod_sitepackage_file} ]; then
291+ if [[ ! -f ${_lmod_sitepackage_file} && -z " ${EESSI_SITE_INSTALL_FORCE} " ] ]; then
270292 echo " Lmod file '${_lmod_sitepackage_file} ' does not exist yet; creating it..."
271293 command -V python3
272294 python3 ${TOPDIR} /create_lmodsitepackage.py ${_eessi_software_path}
@@ -279,8 +301,16 @@ echo ">> Configuring EasyBuild..."
279301module unload EESSI-extend
280302unset EESSI_USER_INSTALL
281303unset EESSI_PROJECT_INSTALL
282- unset EESSI_SITE_INSTALL
283- export EESSI_CVMFS_INSTALL=1
304+ if [[ -n " $EESSI_SITE_INSTALL_FORCE " ]]; then
305+ msg=" Forcing a site installation (EESSI_SITE_INSTALL_FORCE=${EESSI_SITE_INSTALL_FORCE} )"
306+ msg=" $msg by setting EESSI_SITE_INSTALL=1 and unsetting EESSI_CVMFS_INSTALL"
307+ echo $msg
308+ export EESSI_SITE_INSTALL=1
309+ unset EESSI_CVMFS_INSTALL
310+ else
311+ unset EESSI_SITE_INSTALL
312+ export EESSI_CVMFS_INSTALL=1
313+ fi
284314
285315# We now run 'source load_eessi_extend_module.sh' to load or install and load the
286316# EESSI-extend module which sets up all build environment settings.
@@ -293,6 +323,7 @@ export EESSI_CVMFS_INSTALL=1
293323# NOTE 3, we have to set a default for EASYBUILD_INSTALLPATH here in cases the
294324# EESSI-extend module itself needs to be installed.
295325export EASYBUILD_INSTALLPATH=${EESSI_PREFIX} /software/${EESSI_OS_TYPE} /${EESSI_SOFTWARE_SUBDIR_OVERRIDE}
326+ echo " EASYBUILD_INSTALLPATH set to $EASYBUILD_INSTALLPATH "
296327
297328# If in dev.eessi.io, allow building on top of software.eessi.io via EESSI-extend
298329if [[ ! -z ${EESSI_DEV_PROJECT} ]]; then
338369# Install NVIDIA drivers in host_injections (if they exist)
339370if nvidia_gpu_available; then
340371 echo " Installing NVIDIA drivers for use in prefix shell..."
341- ${EESSI_PREFIX} /scripts/gpu_support/nvidia/link_nvidia_host_libraries.sh
372+ # Site installs override EESSI_CVMFS_REPO, but link_nvidia_host_libraries should always use the usptream EESSI CVMFS repo
373+ EESSI_CVMFS_REPO=/cvmfs/software.eessi.io ${EESSI_PREFIX} /scripts/gpu_support/nvidia/link_nvidia_host_libraries.sh
342374fi
343375
376+ # Now that we are done with all installs that should go the /cvmfs/software.eessi.io
377+ # Reload the EESSI and EESSI-extend modules if we're doing a site install for which EESSI_SITE_SOFTWARE_PREFIX is set
378+ export EESSI_SITE_SOFTWARE_PREFIX=${EESSI_SITE_SOFTWARE_PREFIX_BACKUP}
379+ if [[ ! -z " ${EESSI_SITE_INSTALL} " && ! -z " ${EESSI_SITE_SOFTWARE_PREFIX} " ]]; then
380+ echo " Doing a site install with EESSI_SITE_SOFTWARE_PREFIX '${EESSI_SITE_SOFTWARE_PREFIX} ', so reloading EESSI and EESSI-extend"
381+ EESSI_VERSION_BACKUP=${EESSI_VERSION}
382+ module purge
383+ echo " Loading EESSI/${EESSI_VERSION_BACKUP} "
384+ module load EESSI/${EESSI_VERSION_BACKUP}
385+ # Use --ignore_cache in case the current build was the one that installed this EESSI-extend module
386+ echo " Loading EESSI-extend/${EESSI_VERSION} "
387+ module load --ignore_cache EESSI-extend/${EESSI_VERSION} -easybuild
388+ echo " EASYBUILD_INSTALLPATH=${EASYBUILD_INSTALLPATH} "
389+ fi
344390
345391if [ ! -z " ${shared_fs_path} " ]; then
346392 shared_eb_sourcepath=${shared_fs_path} /easybuild/sources
@@ -381,12 +427,26 @@ else
381427 # "|| true" is used to make sure that the grep command always returns success
382428 rebuild_easystacks=$( echo " ${changed_easystacks} " | (grep " /rebuilds/" || true))
383429 new_easystacks=$( echo " ${changed_easystacks} " | (grep -v " /rebuilds/" || true))
430+ echo " When processing easystack files:"
431+ echo " EESSI_CVMFS_REPO=${EESSI_CVMFS_REPO} "
432+ echo " EESSI_CVMFS_REPO_OVERRIDE=${EESSI_CVMFS_REPO_OVERRIDE} "
433+ echo " EESSI_VERSION=${EESSI_VERSION} "
434+ echo " EESSI_VERSION_OVERRIDE=${EESSI_VERSION_OVERRIDE} "
435+ echo " EESSI_SOFTWARE_LAYER_VERSION_SUFFIX=${EESSI_SOFTWARE_LAYER_VERSION_SUFFIX} "
384436 for easystack_file in ${rebuild_easystacks} ${new_easystacks} ; do
437+ echo " Checking if easystack file ${easystack_file} is for the current EESSI_CVMFS_REPO and EESSI_VERSION"
385438
386439 # make sure that easystack file being picked up is for EESSI version that we're building for...
387- echo " ${easystack_file} " | grep -q " ^easystacks/$( basename ${EESSI_CVMFS_REPO} ) /${EESSI_VERSION}${EESSI_SOFTWARE_LAYER_VERSION_SUFFIX} /"
440+ # Preferentially check EESSI_CVMFS_REPO_OVERRIDE (since that is set for site builds), otherwise default to EESSI_CVMFS_REPO
441+ echo " ${easystack_file} " | grep -q " ^easystacks/$( basename ${EESSI_CVMFS_REPO_OVERRIDE:- ${EESSI_CVMFS_REPO} } ) /${EESSI_VERSION}${EESSI_SOFTWARE_LAYER_VERSION_SUFFIX} /"
388442 if [ $? -ne 0 ]; then
389- echo_yellow " Easystack file ${easystack_file} is not intended for EESSI version ${EESSI_VERSION}${EESSI_SOFTWARE_LAYER_VERSION_SUFFIX} , skipping it..."
443+ # Check if this was even an easystack file for the right repository
444+ echo " ${easystack_file} " | grep -q " ^easystacks/$( basename ${EESSI_CVMFS_REPO_OVERRIDE:- ${EESSI_CVMFS_REPO} } ) "
445+ if [ $? -ne 0 ]; then
446+ echo_yellow " Easystack file ${easystack_file} is not intended for the repository ${EESSI_CVMFS_REPO_OVERRIDE:- ${EESSI_CVMFS_REPO} } , skipping it..."
447+ else
448+ echo_yellow " Easystack file ${easystack_file} is not intended for EESSI version ${EESSI_VERSION}${EESSI_SOFTWARE_LAYER_VERSION_SUFFIX} , skipping it..."
449+ fi
390450 else
391451 echo -e " Processing easystack file ${easystack_file} ...\n\n"
392452
@@ -443,31 +503,49 @@ else
443503 export LMOD_PACKAGE_PATH=" ${EASYBUILD_INSTALLPATH} /.lmod"
444504fi
445505
446- lmod_rc_file=" $LMOD_CONFIG_DIR /lmodrc.lua"
447- echo " DEBUG: lmod_rc_file='${lmod_rc_file} '"
448- if [[ ! -z ${EESSI_ACCELERATOR_TARGET} ]]; then
449- # EESSI_ACCELERATOR_TARGET is set, so let's remove the accelerator path from $lmod_rc_file
450- lmod_rc_file=$( echo ${lmod_rc_file} | sed " s@/${EESSI_ACCELERATOR_TARGET} @@" )
451- echo " Path to lmodrc.lua changed to '${lmod_rc_file} '"
452- fi
453- lmodrc_changed=$( cat ${pr_diff} | grep ' ^+++' | cut -f2 -d' ' | sed ' s@^[a-z]/@@g' | grep ' ^create_lmodrc.py$' > /dev/null; echo $? )
454- if [ ! -f $lmod_rc_file ] || [ ${lmodrc_changed} == ' 0' ]; then
455- echo " >> Creating/updating Lmod RC file (${lmod_rc_file} )..."
456- python3 $TOPDIR /create_lmodrc.py ${EASYBUILD_INSTALLPATH}
457- check_exit_code $? " $lmod_rc_file created" " Failed to create $lmod_rc_file "
506+ # If this is a site install, the old method of checking if lmodrc.lua was updated doesn't work
507+ # We simply skip that step for now - it's hardly ever changed anyway
508+ if [[ -z " ${EESSI_SITE_INSTALL} " ]]; then
509+ lmod_rc_file=" $LMOD_CONFIG_DIR /lmodrc.lua"
510+ echo " DEBUG: lmod_rc_file='${lmod_rc_file} '"
511+ if [[ ! -z ${EESSI_ACCELERATOR_TARGET} ]]; then
512+ # EESSI_ACCELERATOR_TARGET is set, so let's remove the accelerator path from $lmod_rc_file
513+ lmod_rc_file=$( echo ${lmod_rc_file} | sed " s@/${EESSI_ACCELERATOR_TARGET} @@" )
514+ echo " Path to lmodrc.lua changed to '${lmod_rc_file} '"
515+ fi
516+ lmodrc_changed=$( cat ${pr_diff} | grep ' ^+++' | cut -f2 -d' ' | sed ' s@^[a-z]/@@g' | grep ' ^create_lmodrc.py$' > /dev/null; echo $? )
517+ if [ ! -f $lmod_rc_file ] || [ ${lmodrc_changed} == ' 0' ]; then
518+ echo " >> Creating/updating Lmod RC file (${lmod_rc_file} )..."
519+ python3 $TOPDIR /create_lmodrc.py ${EASYBUILD_INSTALLPATH}
520+ check_exit_code $? " $lmod_rc_file created" " Failed to create $lmod_rc_file "
521+ fi
522+ else
523+ # For site builds, create_lmodrc.py will _never_ be in the pr_diff, but it _might_ have changed upstream
524+ # The only way to then trigger a redeploy is if we do something like
525+ # python3 $TOPDIR/create_lmodrc.py $TMDPIR
526+ # foo=$(diff $lmod_rc_file $TMPDIR/.lmod/lmodrc.lua)
527+ # if [ -z $foo ]; then
528+ # python3 $TOPDIR/create_lmodrc.py ${EASYBUILD_INSTALLPATH}
529+ # fi
530+ # in order to detect if our deployed lmodrc.lua is different from the one that _would_ be newly generated
531+ # However, we very rarely change these scripts anyway, so we don't implement this right now
532+ echo " WARNING: there is currently no mechanism to detect if the lmodrc.lua should be updated."
458533fi
459534
460- lmod_sitepackage_file=" $LMOD_PACKAGE_PATH /SitePackage.lua"
461- if [[ ! -z ${EESSI_ACCELERATOR_TARGET} ]]; then
462- # EESSI_ACCELERATOR_TARGET is set, so let's remove the accelerator path from $lmod_sitepackage_file
463- lmod_sitepackage_file=$( echo ${lmod_sitepackage_file} | sed " s@/${EESSI_ACCELERATOR_TARGET} @@" )
464- echo " Path to SitePackage.lua changed to '${lmod_sitepackage_file} '"
465- fi
466- sitepackage_changed=$( cat ${pr_diff} | grep ' ^+++' | cut -f2 -d' ' | sed ' s@^[a-z]/@@g' | grep ' ^create_lmodsitepackage.py$' > /dev/null; echo $? )
467- if [ ! -f " $lmod_sitepackage_file " ] || [ " ${sitepackage_changed} " == ' 0' ]; then
468- echo " >> Creating/updating Lmod SitePackage.lua (${lmod_sitepackage_file} )..."
469- python3 $TOPDIR /create_lmodsitepackage.py ${EASYBUILD_INSTALLPATH}
470- check_exit_code $? " $lmod_sitepackage_file created" " Failed to create $lmod_sitepackage_file "
535+ # If this is a site install, don't install SitePackage.lua
536+ if [[ -z " ${EESSI_SITE_INSTALL} " ]]; then
537+ lmod_sitepackage_file=" $LMOD_PACKAGE_PATH /SitePackage.lua"
538+ if [[ ! -z ${EESSI_ACCELERATOR_TARGET} ]]; then
539+ # EESSI_ACCELERATOR_TARGET is set, so let's remove the accelerator path from $lmod_sitepackage_file
540+ lmod_sitepackage_file=$( echo ${lmod_sitepackage_file} | sed " s@/${EESSI_ACCELERATOR_TARGET} @@" )
541+ echo " Path to SitePackage.lua changed to '${lmod_sitepackage_file} '"
542+ fi
543+ sitepackage_changed=$( cat ${pr_diff} | grep ' ^+++' | cut -f2 -d' ' | sed ' s@^[a-z]/@@g' | grep ' ^create_lmodsitepackage.py$' > /dev/null; echo $? )
544+ if [ ! -f " $lmod_sitepackage_file " ] || [ " ${sitepackage_changed} " == ' 0' ]; then
545+ echo " >> Creating/updating Lmod SitePackage.lua (${lmod_sitepackage_file} )..."
546+ python3 $TOPDIR /create_lmodsitepackage.py ${EASYBUILD_INSTALLPATH}
547+ check_exit_code $? " $lmod_sitepackage_file created" " Failed to create $lmod_sitepackage_file "
548+ fi
471549fi
472550
473551echo " >> Cleaning up ${TMPDIR} ..."
0 commit comments