Skip to content

Commit 91871f5

Browse files
authored
Merge pull request #210 from bedroge/combine_cc_targets
Allow building for a list of accelerators in a single build
2 parents 3550881 + 9217084 commit 91871f5

3 files changed

Lines changed: 98 additions & 78 deletions

File tree

bot/build.sh

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -183,16 +183,6 @@ EESSI_SOFTWARE_SUBDIR_OVERRIDE=${EESSI_SOFTWARE_SUBDIR_OVERRIDE:-${CPU_TARGET}}
183183
export EESSI_SOFTWARE_SUBDIR_OVERRIDE
184184
echo "bot/build.sh: EESSI_SOFTWARE_SUBDIR_OVERRIDE='${EESSI_SOFTWARE_SUBDIR_OVERRIDE}'"
185185

186-
# determine accelerator target (if any) from .architecture in ${JOB_CFG_FILE}
187-
ACCEL_OVERRIDE=$(cfg_get_value "architecture" "accelerator")
188-
if [[ -n "$ACCEL_OVERRIDE" ]]; then
189-
# bot job config does not include accel subdirectory
190-
export EESSI_ACCELERATOR_TARGET_OVERRIDE="accel/$ACCEL_OVERRIDE"
191-
else
192-
export EESSI_ACCELERATOR_TARGET_OVERRIDE=""
193-
fi
194-
echo "bot/build.sh: EESSI_ACCELERATOR_TARGET_OVERRIDE='${EESSI_ACCELERATOR_TARGET_OVERRIDE}'"
195-
196186
# Log the full lscpu, ulimits, and os-release info:
197187
lscpu > _bot_job${SLURM_JOB_ID}.lscpu
198188
ulimit -a > _bot_job${SLURM_JOB_ID}.ulimits
@@ -295,11 +285,29 @@ fi
295285
# create tmp file for output of build step
296286
build_outerr=$(mktemp build.outerr.XXXX)
297287

298-
echo "Executing command to build software:"
299-
echo "$software_layer_dir/eessi_container.sh ${COMMON_ARGS[@]} ${BUILD_STEP_ARGS[@]}"
300-
echo " -- $software_layer_dir/install_software_layer.sh \"${INSTALL_SCRIPT_ARGS[@]}\" \"$@\" 2>&1 | tee -a ${build_outerr}"
301-
$software_layer_dir/eessi_container.sh "${COMMON_ARGS[@]}" "${BUILD_STEP_ARGS[@]}" \
302-
-- $software_layer_dir/install_software_layer.sh "${INSTALL_SCRIPT_ARGS[@]}" "$@" 2>&1 | tee -a ${build_outerr}
288+
# determine accelerator target (if any) from .architecture in ${JOB_CFG_FILE}
289+
ACCEL_OVERRIDES=$(cfg_get_value "architecture" "accelerator")
290+
if [[ -z ${ACCEL_OVERRIDES} ]]; then
291+
EESSI_ACCELERATOR_TARGET_OVERRIDES=("")
292+
else
293+
IFS='+' read -ra ACCEL_OVERRIDES_ARRAY <<< "$ACCEL_OVERRIDES"
294+
# prepend accel/ to all array elements
295+
EESSI_ACCELERATOR_TARGET_OVERRIDES=("${ACCEL_OVERRIDES_ARRAY[@]/#/accel/}")
296+
fi
297+
for ACCEL_OVERRIDE in "${EESSI_ACCELERATOR_TARGET_OVERRIDES[@]}"; do
298+
export EESSI_ACCELERATOR_TARGET_OVERRIDE="${ACCEL_OVERRIDE}"
299+
echo "bot/build.sh: EESSI_ACCELERATOR_TARGET_OVERRIDE='${ACCEL_OVERRIDE}'"
300+
echo "Executing command to build software:"
301+
echo "$software_layer_dir/eessi_container.sh ${COMMON_ARGS[@]} ${BUILD_STEP_ARGS[@]}"
302+
echo " -- $software_layer_dir/install_software_layer.sh \"${INSTALL_SCRIPT_ARGS[@]}\" \"$@\" 2>&1 | tee -a ${build_outerr}"
303+
$software_layer_dir/eessi_container.sh "${COMMON_ARGS[@]}" "${BUILD_STEP_ARGS[@]}" \
304+
-- $software_layer_dir/install_software_layer.sh "${INSTALL_SCRIPT_ARGS[@]}" "$@" 2>&1 | tee -a ${build_outerr}
305+
306+
# determine temporary directory to resume from for the next accelerator,
307+
# as we want to combine all accelerator builds into a single tarball in the end
308+
BUILD_TMPDIR=$(grep ' as tmp directory ' ${build_outerr} | cut -d ' ' -f 2)
309+
BUILD_STEP_ARGS+=("--resume" "${BUILD_TMPDIR}")
310+
done
303311

304312
# prepare directory to store tarball of tmp for tarball step
305313
TARBALL_TMP_TARBALL_STEP_DIR=${PREVIOUS_TMP_DIR}/tarball_step
@@ -327,14 +335,16 @@ else
327335
fi
328336
# to set EESSI_VERSION we need to source init/eessi_defaults now
329337
source $software_layer_dir/init/eessi_defaults
330-
# Note: if ${EESSI_DEV_PROJECT} is defined (building for dev.eessi.io), then we
338+
# Note: if ${EESSI_DEV_PROJECT} is defined (building for dev.eessi.io), then we
331339
# append the project (subdirectory) name to the end tarball name. This is information
332340
# then used at the ingestion stage. If ${EESSI_DEV_PROJECT} is not defined, nothing is
333341
# appended
334-
if [[ -z ${EESSI_ACCELERATOR_TARGET_OVERRIDE} ]]; then
342+
if [[ -z ${ACCEL_OVERRIDES} ]]; then
335343
export TARBALL=$(printf "eessi-%s-software-%s-%s-%b%d.${tarball_extension}" ${EESSI_VERSION} ${EESSI_OS_TYPE} ${EESSI_SOFTWARE_SUBDIR_OVERRIDE//\//-} ${EESSI_DEV_PROJECT:+$EESSI_DEV_PROJECT-} ${timestamp})
336344
else
337-
export TARBALL=$(printf "eessi-%s-software-%s-%s-%s-%b%d.${tarball_extension}" ${EESSI_VERSION} ${EESSI_OS_TYPE} ${EESSI_SOFTWARE_SUBDIR_OVERRIDE//\//-} ${EESSI_ACCELERATOR_TARGET_OVERRIDE//\//-} ${EESSI_DEV_PROJECT:+$EESSI_DEV_PROJECT-} ${timestamp})
345+
# replace slashes in accelerator names by a hyphen, and concatenate them into a hypen-separated string
346+
filename_accelerators=$(IFS=-; echo "${EESSI_ACCELERATOR_TARGET_OVERRIDES[*]//\//-}")
347+
export TARBALL=$(printf "eessi-%s-software-%s-%s-%s-%b%d.${tarball_extension}" ${EESSI_VERSION} ${EESSI_OS_TYPE} ${EESSI_SOFTWARE_SUBDIR_OVERRIDE//\//-} ${filename_accelerators} ${EESSI_DEV_PROJECT:+$EESSI_DEV_PROJECT-} ${timestamp})
338348
fi
339349

340350
# Export EESSI_DEV_PROJECT to use it (if needed) when making tarball
@@ -346,10 +356,11 @@ export EESSI_DEV_PROJECT=${EESSI_DEV_PROJECT}
346356
# TODO should we make this a configurable parameter of eessi_container.sh using
347357
# /tmp as default?
348358
TMP_IN_CONTAINER=/tmp
359+
tarball_accelerators=$(IFS=+; echo "${EESSI_ACCELERATOR_TARGET_OVERRIDES[*]}")
349360
echo "Executing command to create tarball:"
350361
echo "$software_layer_dir/eessi_container.sh ${COMMON_ARGS[@]} ${TARBALL_STEP_ARGS[@]}"
351-
echo " -- $software_layer_dir/create_tarball.sh ${TMP_IN_CONTAINER} ${EESSI_VERSION}${EESSI_SOFTWARE_LAYER_VERSION_SUFFIX} ${EESSI_SOFTWARE_SUBDIR_OVERRIDE} \"${EESSI_ACCELERATOR_TARGET_OVERRIDE}\" /eessi_bot_job/${TARBALL} 2>&1 | tee -a ${tar_outerr}"
362+
echo " -- $software_layer_dir/create_tarball.sh ${TMP_IN_CONTAINER} ${EESSI_VERSION}${EESSI_SOFTWARE_LAYER_VERSION_SUFFIX} ${EESSI_SOFTWARE_SUBDIR_OVERRIDE} \"$tarball_accelerators\" /eessi_bot_job/${TARBALL} 2>&1 | tee -a ${tar_outerr}"
352363
$software_layer_dir/eessi_container.sh "${COMMON_ARGS[@]}" "${TARBALL_STEP_ARGS[@]}" \
353-
-- $software_layer_dir/create_tarball.sh ${TMP_IN_CONTAINER} ${EESSI_VERSION}${EESSI_SOFTWARE_LAYER_VERSION_SUFFIX} ${EESSI_SOFTWARE_SUBDIR_OVERRIDE} "${EESSI_ACCELERATOR_TARGET_OVERRIDE}" /eessi_bot_job/${TARBALL} 2>&1 | tee -a ${tar_outerr}
364+
-- $software_layer_dir/create_tarball.sh ${TMP_IN_CONTAINER} ${EESSI_VERSION}${EESSI_SOFTWARE_LAYER_VERSION_SUFFIX} ${EESSI_SOFTWARE_SUBDIR_OVERRIDE} "$tarball_accelerators" /eessi_bot_job/${TARBALL} 2>&1 | tee -a ${tar_outerr}
354365

355366
exit 0

bot/check-build.sh

Lines changed: 60 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -500,68 +500,74 @@ if [[ $USE_CHECK_BUILD_ARTEFACTS_SCRIPT -eq 0 ]]; then
500500
repo_version=$(cfg_get_value "repository" "repo_version")
501501
os_type=$(cfg_get_value "architecture" "os_type")
502502
software_subdir=$(cfg_get_value "architecture" "software_subdir")
503-
accelerator=$(cfg_get_value "architecture" "accelerator")
504-
prefix="${repo_version}/software/${os_type}/${software_subdir}"
503+
accelerators=$(cfg_get_value "architecture" "accelerator")
504+
cpu_prefix="${repo_version}/software/${os_type}/${software_subdir}"
505+
prefixes=("${cpu_prefix}")
505506

506507
# if we build for an accelerator, the prefix is different
507-
if [[ ! -z ${accelerator} ]]; then
508-
prefix="${prefix}/accel/${accelerator}"
508+
if [[ ! -z ${accelerators} ]]; then
509+
IFS='+' read -ra accelerators <<< "$accelerators"
510+
# prepend the cpu prefix and "accel" to the accelerator names
511+
prefixes=("${accelerators[@]/#/${cpu_prefix}/accel/}")
509512
fi
510513

511-
# extract directories/entries from tarball content
512-
modules_entries=$(grep "${prefix}/modules" ${tmpfile})
513-
software_entries=$(grep "${prefix}/software" ${tmpfile})
514-
reprod_entries=$(grep "${prefix}/reprod" ${tmpfile})
515-
reprod_shortened=$(echo "${reprod_entries}" | sed -e "s@${prefix}/reprod/@@" | awk -F/ '{if (NF >= 4) {print $1 "/" $2 "/" $3}}' | sort -u)
516-
other_entries=$(cat ${tmpfile} | grep -v "${prefix}/modules" | grep -v "${prefix}/software" | grep -v "${prefix}/reprod")
517-
other_shortened=$(echo "${other_entries}" | sed -e "s@^.*${prefix}/@@" | sort -u)
518-
modules=$(echo "${modules_entries}" | grep "/all/.*/.*lua$" | sed -e 's@^.*/\([^/]*/[^/]*.lua\)$@\1@' | sort -u)
519-
software_pkgs=$(echo "${software_entries}" | sed -e "s@${prefix}/software/@@" | awk -F/ '{if (NR >= 2) {print $1 "/" $2}}' | sort -u)
520-
521514
artefact_summary="<summary>$(print_code_item '__ITEM__' ${TARBALL})</summary>"
522515
comment_artifacts_list=""
523516
comment_artifacts_list="${comment_artifacts_list}$(print_br_item2 'size: __ITEM__ MiB (__ITEM2__ bytes)' ${size_mib} ${size})"
524517
comment_artifacts_list="${comment_artifacts_list}$(print_br_item 'entries: __ITEM__' ${entries})"
525-
comment_artifacts_list="${comment_artifacts_list}$(print_br_item 'modules under ___ITEM___' ${prefix}/modules/all)"
526-
comment_artifacts_list="${comment_artifacts_list}<pre>"
527-
if [[ ! -z ${modules} ]]; then
528-
while IFS= read -r mod ; do
529-
comment_artifacts_list="${comment_artifacts_list}$(print_br_item '<code>__ITEM__</code>' ${mod})"
530-
done <<< "${modules}"
531-
else
532-
comment_artifacts_list="${comment_artifacts_list}$(print_br_item '__ITEM__' 'no module files in tarball')"
533-
fi
534-
comment_artifacts_list="${comment_artifacts_list}</pre>"
535-
comment_artifacts_list="${comment_artifacts_list}$(print_br_item 'software under ___ITEM___' ${prefix}/software)"
536-
comment_artifacts_list="${comment_artifacts_list}<pre>"
537-
if [[ ! -z ${software_pkgs} ]]; then
538-
while IFS= read -r sw_pkg ; do
539-
comment_artifacts_list="${comment_artifacts_list}$(print_br_item '<code>__ITEM__</code>' ${sw_pkg})"
540-
done <<< "${software_pkgs}"
541-
else
542-
comment_artifacts_list="${comment_artifacts_list}$(print_br_item '__ITEM__' 'no software packages in tarball')"
543-
fi
544-
comment_artifacts_list="${comment_artifacts_list}</pre>"
545-
comment_artifacts_list="${comment_artifacts_list}$(print_br_item 'reprod directories under ___ITEM___' ${prefix}/reprod)"
546-
comment_artifacts_list="${comment_artifacts_list}<pre>"
547-
if [[ ! -z ${reprod_shortened} ]]; then
548-
while IFS= read -r reprod ; do
549-
comment_artifacts_list="${comment_artifacts_list}$(print_br_item '<code>__ITEM__</code>' ${reprod})"
550-
done <<< "${reprod_shortened}"
551-
else
552-
comment_artifacts_list="${comment_artifacts_list}$(print_br_item '__ITEM__' 'no reprod directories in tarball')"
553-
fi
554-
comment_artifacts_list="${comment_artifacts_list}</pre>"
555-
comment_artifacts_list="${comment_artifacts_list}$(print_br_item 'other under ___ITEM___' ${prefix})"
556-
comment_artifacts_list="${comment_artifacts_list}<pre>"
557-
if [[ ! -z ${other_shortened} ]]; then
558-
while IFS= read -r other ; do
559-
comment_artifacts_list="${comment_artifacts_list}$(print_br_item '<code>__ITEM__</code>' ${other})"
560-
done <<< "${other_shortened}"
561-
else
562-
comment_artifacts_list="${comment_artifacts_list}$(print_br_item '__ITEM__' 'no other files in tarball')"
563-
fi
564-
comment_artifacts_list="${comment_artifacts_list}</pre>"
518+
519+
for prefix in "${prefixes[@]}"; do
520+
# extract directories/entries from tarball content
521+
modules_entries=$(grep "${prefix}/modules" ${tmpfile})
522+
software_entries=$(grep "${prefix}/software" ${tmpfile})
523+
reprod_entries=$(grep "${prefix}/reprod" ${tmpfile})
524+
reprod_shortened=$(echo "${reprod_entries}" | sed -e "s@${prefix}/reprod/@@" | awk -F/ '{if (NF >= 4) {print $1 "/" $2 "/" $3}}' | sort -u)
525+
other_entries=$(cat ${tmpfile} | grep "${prefix}" | grep -v "${prefix}/modules" | grep -v "${prefix}/software" | grep -v "${prefix}/reprod")
526+
other_shortened=$(echo "${other_entries}" | sed -e "s@^.*${prefix}/@@" | sort -u)
527+
modules=$(echo "${modules_entries}" | grep "/all/.*/.*lua$" | sed -e 's@^.*/\([^/]*/[^/]*.lua\)$@\1@' | sort -u)
528+
software_pkgs=$(echo "${software_entries}" | sed -e "s@${prefix}/software/@@" | awk -F/ '{if (NR >= 2) {print $1 "/" $2}}' | sort -u)
529+
530+
comment_artifacts_list="${comment_artifacts_list}$(print_br_item 'modules under ___ITEM___' ${prefix}/modules/all)"
531+
comment_artifacts_list="${comment_artifacts_list}<pre>"
532+
if [[ ! -z ${modules} ]]; then
533+
while IFS= read -r mod ; do
534+
comment_artifacts_list="${comment_artifacts_list}$(print_br_item '<code>__ITEM__</code>' ${mod})"
535+
done <<< "${modules}"
536+
else
537+
comment_artifacts_list="${comment_artifacts_list}$(print_br_item '__ITEM__' 'no module files in tarball')"
538+
fi
539+
comment_artifacts_list="${comment_artifacts_list}</pre>"
540+
comment_artifacts_list="${comment_artifacts_list}$(print_br_item 'software under ___ITEM___' ${prefix}/software)"
541+
comment_artifacts_list="${comment_artifacts_list}<pre>"
542+
if [[ ! -z ${software_pkgs} ]]; then
543+
while IFS= read -r sw_pkg ; do
544+
comment_artifacts_list="${comment_artifacts_list}$(print_br_item '<code>__ITEM__</code>' ${sw_pkg})"
545+
done <<< "${software_pkgs}"
546+
else
547+
comment_artifacts_list="${comment_artifacts_list}$(print_br_item '__ITEM__' 'no software packages in tarball')"
548+
fi
549+
comment_artifacts_list="${comment_artifacts_list}</pre>"
550+
comment_artifacts_list="${comment_artifacts_list}$(print_br_item 'reprod directories under ___ITEM___' ${prefix}/reprod)"
551+
comment_artifacts_list="${comment_artifacts_list}<pre>"
552+
if [[ ! -z ${reprod_shortened} ]]; then
553+
while IFS= read -r reprod ; do
554+
comment_artifacts_list="${comment_artifacts_list}$(print_br_item '<code>__ITEM__</code>' ${reprod})"
555+
done <<< "${reprod_shortened}"
556+
else
557+
comment_artifacts_list="${comment_artifacts_list}$(print_br_item '__ITEM__' 'no reprod directories in tarball')"
558+
fi
559+
comment_artifacts_list="${comment_artifacts_list}</pre>"
560+
comment_artifacts_list="${comment_artifacts_list}$(print_br_item 'other under ___ITEM___' ${prefix})"
561+
comment_artifacts_list="${comment_artifacts_list}<pre>"
562+
if [[ ! -z ${other_shortened} ]]; then
563+
while IFS= read -r other ; do
564+
comment_artifacts_list="${comment_artifacts_list}$(print_br_item '<code>__ITEM__</code>' ${other})"
565+
done <<< "${other_shortened}"
566+
else
567+
comment_artifacts_list="${comment_artifacts_list}$(print_br_item '__ITEM__' 'no other files in tarball')"
568+
fi
569+
comment_artifacts_list="${comment_artifacts_list}</pre>"
570+
done
565571
else
566572
comment_artifacts_list="${comment_artifacts_list}$(print_dd_item 'No artefacts were created or found.' '')"
567573
fi

create_tarball.sh

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ fi
1111
eessi_tmpdir=$1
1212
eessi_version=$2
1313
cpu_arch_subdir=$3
14-
accel_subdir=$4
14+
accel_subdirs="$4"
1515
target_tarball=$5
1616

1717
tmpdir=`mktemp -d`
@@ -64,11 +64,14 @@ fi
6464

6565
# consider both CPU-only and accelerator subdirectories (if an accelerator was configured)
6666
sw_subdirs=${cpu_arch_subdir}
67-
if [ -n "${accel_subdir}" ]; then
68-
sw_subdirs="${sw_subdirs} ${cpu_arch_subdir}/${accel_subdir}"
67+
if [ -n "${accel_subdirs}" ]; then
68+
# convert accel_subdirs into an array...
69+
IFS='+' read -ra accel_subdirs <<< "${accel_subdirs}"
70+
# and prepend the cpu_arch_subdir to all elements
71+
accel_subdirs="${accel_subdirs[@]/#/${cpu_arch_subdir}/}"
72+
sw_subdirs="${sw_subdirs} ${accel_subdirs[@]}"
6973
fi
7074
for subdir in ${sw_subdirs}; do
71-
7275
if [ -d ${eessi_version}/software/${os}/${subdir}/modules ]; then
7376
# module files
7477
find ${eessi_version}/software/${os}/${subdir}/modules -type f \! -name '.wh.*' >> ${files_list}

0 commit comments

Comments
 (0)