From 67baf7395438daed5f4db5aa9d1b3d7a74975b5f Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Mon, 5 Oct 2026 14:26:43 +0200 Subject: [PATCH 1/6] Move supported CPU/accelerator targets per EESSI version into a JSON file The list of supported CPU and accelerator targets per EESSI version was embedded as env variables in test-software.eessi.io.yml. Move it to .github/workflows/eessi_targets.json so it can be reused by other workflows and scripts (e.g. a check on the bot's build status), without duplicating it. Co-Authored-By: Claude Sonnet 5.5 --- .github/workflows/eessi_targets.json | 175 +++++++++++++++++++ .github/workflows/test-software.eessi.io.yml | 171 +----------------- 2 files changed, 184 insertions(+), 162 deletions(-) create mode 100644 .github/workflows/eessi_targets.json diff --git a/.github/workflows/eessi_targets.json b/.github/workflows/eessi_targets.json new file mode 100644 index 0000000000..a788dec6b4 --- /dev/null +++ b/.github/workflows/eessi_targets.json @@ -0,0 +1,175 @@ +{ + "cpu_targets": { + "2023.06": { + "x86_64": [ + "x86_64/amd/zen2", + "x86_64/amd/zen3", + "x86_64/amd/zen4", + "x86_64/intel/haswell", + "x86_64/intel/sapphirerapids", + "x86_64/intel/skylake_avx512", + "x86_64/intel/icelake", + "x86_64/intel/cascadelake", + "x86_64/generic" + ], + "aarch64": [ + "aarch64/generic", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", + "aarch64/a64fx" + ] + }, + "2025.06": { + "x86_64": [ + "x86_64/amd/zen2", + "x86_64/amd/zen3", + "x86_64/amd/zen4", + "x86_64/amd/zen5", + "x86_64/intel/haswell", + "x86_64/intel/sapphirerapids", + "x86_64/intel/skylake_avx512", + "x86_64/intel/icelake", + "x86_64/intel/cascadelake", + "x86_64/generic" + ], + "aarch64": [ + "aarch64/generic", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", + "aarch64/a64fx" + ] + }, + "2026.06": { + "x86_64": [ + "x86_64/amd/zen2", + "x86_64/amd/zen3", + "x86_64/amd/zen4", + "x86_64/amd/zen5", + "x86_64/intel/haswell", + "x86_64/intel/sapphirerapids", + "x86_64/intel/graniterapids", + "x86_64/intel/skylake_avx512", + "x86_64/intel/icelake", + "x86_64/intel/cascadelake", + "x86_64/generic" + ], + "aarch64": [ + "aarch64/generic", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", + "aarch64/a64fx", + "aarch64/aws/graviton4" + ] + } + }, + "accelerator_targets": { + "2023.06": { + "default": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "x86_64/amd/zen2": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90" + ], + "aarch64/a64fx": [] + }, + "2025.06": { + "default": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90", + "nvidia/cc100", + "nvidia/cc120", + "amd/gfx908", + "amd/gfx90a", + "amd/gfx942", + "amd/gfx1030", + "amd/gfx1100", + "amd/gfx1101", + "amd/gfx1200", + "amd/gfx1201" + ], + "aarch64/generic": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90", + "nvidia/cc100", + "nvidia/cc120" + ], + "aarch64/neoverse_n1": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90", + "nvidia/cc100", + "nvidia/cc120" + ], + "aarch64/neoverse_v1": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90", + "nvidia/cc100", + "nvidia/cc120" + ], + "aarch64/nvidia/grace": [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90", + "nvidia/cc100", + "nvidia/cc120" + ], + "aarch64/a64fx": [] + }, + "2026.06": { + "default": [ + "nvidia/cc75", + "nvidia/cc80", + "nvidia/cc90", + "nvidia/cc100", + "nvidia/cc120", + "amd/gfx908", + "amd/gfx90a", + "amd/gfx942", + "amd/gfx1030", + "amd/gfx1100", + "amd/gfx1101", + "amd/gfx1200", + "amd/gfx1201" + ], + "aarch64/generic": [ + "nvidia/cc75", + "nvidia/cc80", + "nvidia/cc90", + "nvidia/cc100", + "nvidia/cc120" + ], + "aarch64/neoverse_n1": [ + "nvidia/cc75", + "nvidia/cc80", + "nvidia/cc90", + "nvidia/cc100", + "nvidia/cc120" + ], + "aarch64/neoverse_v1": [ + "nvidia/cc75", + "nvidia/cc80", + "nvidia/cc90", + "nvidia/cc100", + "nvidia/cc120" + ], + "aarch64/nvidia/grace": [ + "nvidia/cc75", + "nvidia/cc80", + "nvidia/cc90", + "nvidia/cc100", + "nvidia/cc120" + ], + "aarch64/a64fx": [] + } + } +} diff --git a/.github/workflows/test-software.eessi.io.yml b/.github/workflows/test-software.eessi.io.yml index 4f0fa8ffa2..7f95f0f12c 100644 --- a/.github/workflows/test-software.eessi.io.yml +++ b/.github/workflows/test-software.eessi.io.yml @@ -9,162 +9,11 @@ on: permissions: contents: read # to fetch code (actions/checkout) env: - # list below should correspond with table @ https://eessi.io/docs/software_layer/cpu_targets/ - EESSI_CPU_TARGETS: | - 2023.06: - x86_64: - - x86_64/amd/zen2 - - x86_64/amd/zen3 - - x86_64/amd/zen4 - - x86_64/intel/haswell - - x86_64/intel/sapphirerapids - - x86_64/intel/skylake_avx512 - - x86_64/intel/icelake - - x86_64/intel/cascadelake - - x86_64/generic - aarch64: - - aarch64/generic - - aarch64/neoverse_n1 - - aarch64/neoverse_v1 - - aarch64/nvidia/grace - - aarch64/a64fx - - 2025.06: - x86_64: - - x86_64/amd/zen2 - - x86_64/amd/zen3 - - x86_64/amd/zen4 - - x86_64/amd/zen5 - - x86_64/intel/haswell - - x86_64/intel/sapphirerapids - - x86_64/intel/skylake_avx512 - - x86_64/intel/icelake - - x86_64/intel/cascadelake - - x86_64/generic - aarch64: - - aarch64/generic - - aarch64/neoverse_n1 - - aarch64/neoverse_v1 - - aarch64/nvidia/grace - - aarch64/a64fx - - 2026.06: - x86_64: - - x86_64/amd/zen2 - - x86_64/amd/zen3 - - x86_64/amd/zen4 - - x86_64/amd/zen5 - - x86_64/intel/haswell - - x86_64/intel/sapphirerapids - - x86_64/intel/graniterapids - - x86_64/intel/skylake_avx512 - - x86_64/intel/icelake - - x86_64/intel/cascadelake - - x86_64/generic - aarch64: - - aarch64/generic - - aarch64/neoverse_n1 - - aarch64/neoverse_v1 - - aarch64/nvidia/grace - - aarch64/a64fx - - aarch64/aws/graviton4 - - # list below should correspond with table @ https://eessi.io/docs/software_layer/gpu_targets/ - EESSI_ACCELERATOR_TARGETS: | - 2023.06: - # Provide a default set of compute capabilities - default: - - nvidia/cc70 - - nvidia/cc80 - - nvidia/cc90 - # and then allow for special cases for specific architectures - x86_64/amd/zen2: - - nvidia/cc70 - - nvidia/cc80 - - nvidia/cc90 - aarch64/a64fx: [] - - 2025.06: - default: - - nvidia/cc70 - - nvidia/cc80 - - nvidia/cc90 - - nvidia/cc100 - - nvidia/cc120 - - amd/gfx908 - - amd/gfx90a - - amd/gfx942 - - amd/gfx1030 - - amd/gfx1100 - - amd/gfx1101 - - amd/gfx1200 - - amd/gfx1201 - aarch64/generic: - - nvidia/cc70 - - nvidia/cc80 - - nvidia/cc90 - - nvidia/cc100 - - nvidia/cc120 - aarch64/neoverse_n1: - - nvidia/cc70 - - nvidia/cc80 - - nvidia/cc90 - - nvidia/cc100 - - nvidia/cc120 - aarch64/neoverse_v1: - - nvidia/cc70 - - nvidia/cc80 - - nvidia/cc90 - - nvidia/cc100 - - nvidia/cc120 - aarch64/nvidia/grace: - - nvidia/cc70 - - nvidia/cc80 - - nvidia/cc90 - - nvidia/cc100 - - nvidia/cc120 - aarch64/a64fx: [] - - 2026.06: - default: - - nvidia/cc75 - - nvidia/cc80 - - nvidia/cc90 - - nvidia/cc100 - - nvidia/cc120 - - amd/gfx908 - - amd/gfx90a - - amd/gfx942 - - amd/gfx1030 - - amd/gfx1100 - - amd/gfx1101 - - amd/gfx1200 - - amd/gfx1201 - aarch64/generic: - - nvidia/cc75 - - nvidia/cc80 - - nvidia/cc90 - - nvidia/cc100 - - nvidia/cc120 - aarch64/neoverse_n1: - - nvidia/cc75 - - nvidia/cc80 - - nvidia/cc90 - - nvidia/cc100 - - nvidia/cc120 - aarch64/neoverse_v1: - - nvidia/cc75 - - nvidia/cc80 - - nvidia/cc90 - - nvidia/cc100 - - nvidia/cc120 - aarch64/nvidia/grace: - - nvidia/cc75 - - nvidia/cc80 - - nvidia/cc90 - - nvidia/cc100 - - nvidia/cc120 - aarch64/a64fx: [] + # Supported CPU and accelerator targets per EESSI version live in a single JSON file, so that + # other workflows/scripts can reuse them. The CPU targets should correspond with the table @ + # https://eessi.io/docs/software_layer/cpu_targets/ and the accelerator targets with the table @ + # https://eessi.io/docs/software_layer/gpu_targets/ + EESSI_TARGETS_FILE: ${{ github.workspace }}/.github/workflows/eessi_targets.json jobs: # Checks whether this PR modifies any easystack files and, if so, # determines which EESSI versions are affected. @@ -298,7 +147,7 @@ jobs: run: | # From this extract the CPUs we need to loop over - cpu_subdirs=$(echo "${EESSI_CPU_TARGETS}" | yq ".\"${EESSI_VERSION}\".\"${EESSI_CPU_FAMILY}\" | .[]") + cpu_subdirs=$(yq ".cpu_targets.\"${EESSI_VERSION}\".\"${EESSI_CPU_FAMILY}\" | .[]" "${EESSI_TARGETS_FILE}") if [[ -z "${cpu_subdirs}" ]]; then echo "ERROR: No CPU subdirs resolved for ${EESSI_VERSION} / ${EESSI_CPU_FAMILY}" exit 1 @@ -363,7 +212,7 @@ jobs: echo echo "now check accelerator builds for ${cpu}" - accelerators=$(echo "${EESSI_ACCELERATOR_TARGETS}" | yq ".\"${{matrix.EESSI_VERSION}}\".\"${cpu}\" // .\"${{matrix.EESSI_VERSION}}\".default | .[]") + accelerators=$(yq ".accelerator_targets.\"${{matrix.EESSI_VERSION}}\".\"${cpu}\" // .accelerator_targets.\"${{matrix.EESSI_VERSION}}\".default | .[]" "${EESSI_TARGETS_FILE}") if [[ -z "${accelerators}" ]]; then echo "no accelerator targets defined for ${cpu}" @@ -458,16 +307,14 @@ jobs: echo "::group::EESSI ${EESSI_VERSION} / ${EESSI_CPU_FAMILY}" # Get all CPU targets belonging to this architecture family. - CPU_TARGETS=$(echo "${EESSI_CPU_TARGETS}" \ - | yq -r ".\"${EESSI_VERSION}\".\"${EESSI_CPU_FAMILY}\"[]") + CPU_TARGETS=$(yq -r ".cpu_targets.\"${EESSI_VERSION}\".\"${EESSI_CPU_FAMILY}\"[]" "${EESSI_TARGETS_FILE}") for COMPARISON_ARCH in ${CPU_TARGETS}; do echo "::group::Compare ${EESSI_VERSION} / ${COMPARISON_ARCH}" # Use architecture-specific accelerator targets where defined, # otherwise fall back to the default set. - ALL_ACCELERATOR_TARGETS=$(echo "${EESSI_ACCELERATOR_TARGETS}" \ - | yq ".\"${{ matrix.EESSI_VERSION }}\".\"${COMPARISON_ARCH}\" // .\"${{ matrix.EESSI_VERSION }}\".default | .[]" \ + ALL_ACCELERATOR_TARGETS=$(yq ".accelerator_targets.\"${{ matrix.EESSI_VERSION }}\".\"${COMPARISON_ARCH}\" // .accelerator_targets.\"${{ matrix.EESSI_VERSION }}\".default | .[]" "${EESSI_TARGETS_FILE}" \ | tr '\n' ' ') echo "COMPARISON_ARCH=${COMPARISON_ARCH}" From fb6d757ec7d85926c440d0538bd15cdd47017ddb Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Mon, 5 Oct 2026 16:06:00 +0200 Subject: [PATCH 2/6] Use jq instead of yq to read eessi_targets.json yq infers its output format from the input file extension, so reading a .json file produced quoted JSON strings (e.g. "x86_64/amd/zen2"), which broke the CPU target detection. jq -r prints raw strings. Co-Authored-By: Claude Sonnet 5.5 --- .github/workflows/test-software.eessi.io.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test-software.eessi.io.yml b/.github/workflows/test-software.eessi.io.yml index 7f95f0f12c..950d10d062 100644 --- a/.github/workflows/test-software.eessi.io.yml +++ b/.github/workflows/test-software.eessi.io.yml @@ -147,7 +147,7 @@ jobs: run: | # From this extract the CPUs we need to loop over - cpu_subdirs=$(yq ".cpu_targets.\"${EESSI_VERSION}\".\"${EESSI_CPU_FAMILY}\" | .[]" "${EESSI_TARGETS_FILE}") + cpu_subdirs=$(jq -r --arg v "${EESSI_VERSION}" --arg f "${EESSI_CPU_FAMILY}" '.cpu_targets[$v][$f][]' "${EESSI_TARGETS_FILE}") if [[ -z "${cpu_subdirs}" ]]; then echo "ERROR: No CPU subdirs resolved for ${EESSI_VERSION} / ${EESSI_CPU_FAMILY}" exit 1 @@ -212,7 +212,7 @@ jobs: echo echo "now check accelerator builds for ${cpu}" - accelerators=$(yq ".accelerator_targets.\"${{matrix.EESSI_VERSION}}\".\"${cpu}\" // .accelerator_targets.\"${{matrix.EESSI_VERSION}}\".default | .[]" "${EESSI_TARGETS_FILE}") + accelerators=$(jq -r --arg v "${{matrix.EESSI_VERSION}}" --arg c "${cpu}" '.accelerator_targets[$v] | (.[$c] // .default) | .[]' "${EESSI_TARGETS_FILE}") if [[ -z "${accelerators}" ]]; then echo "no accelerator targets defined for ${cpu}" @@ -307,14 +307,14 @@ jobs: echo "::group::EESSI ${EESSI_VERSION} / ${EESSI_CPU_FAMILY}" # Get all CPU targets belonging to this architecture family. - CPU_TARGETS=$(yq -r ".cpu_targets.\"${EESSI_VERSION}\".\"${EESSI_CPU_FAMILY}\"[]" "${EESSI_TARGETS_FILE}") + CPU_TARGETS=$(jq -r --arg v "${EESSI_VERSION}" --arg f "${EESSI_CPU_FAMILY}" '.cpu_targets[$v][$f][]' "${EESSI_TARGETS_FILE}") for COMPARISON_ARCH in ${CPU_TARGETS}; do echo "::group::Compare ${EESSI_VERSION} / ${COMPARISON_ARCH}" # Use architecture-specific accelerator targets where defined, # otherwise fall back to the default set. - ALL_ACCELERATOR_TARGETS=$(yq ".accelerator_targets.\"${{ matrix.EESSI_VERSION }}\".\"${COMPARISON_ARCH}\" // .accelerator_targets.\"${{ matrix.EESSI_VERSION }}\".default | .[]" "${EESSI_TARGETS_FILE}" \ + ALL_ACCELERATOR_TARGETS=$(jq -r --arg v "${{ matrix.EESSI_VERSION }}" --arg c "${COMPARISON_ARCH}" '.accelerator_targets[$v] | (.[$c] // .default) | .[]' "${EESSI_TARGETS_FILE}" \ | tr '\n' ' ') echo "COMPARISON_ARCH=${COMPARISON_ARCH}" From 9d1c1ce50397bc89bb1332f063722b556a85413b Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Mon, 5 Oct 2026 16:28:08 +0200 Subject: [PATCH 3/6] Upload per-CPU-target logs of the missing installations check as artifacts Co-Authored-By: Claude Sonnet 5.5 --- .github/workflows/test-software.eessi.io.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/test-software.eessi.io.yml b/.github/workflows/test-software.eessi.io.yml index 950d10d062..06e0f69c9d 100644 --- a/.github/workflows/test-software.eessi.io.yml +++ b/.github/workflows/test-software.eessi.io.yml @@ -274,6 +274,17 @@ jobs: done + # The per-CPU-target logs are only printed to the job output when a target fails (and then only + # the first failing one), so always keep them as an artifact, also for successful runs + - name: Upload per-CPU-target logs + if: always() + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: missing-installations-logs-${{ matrix.EESSI_VERSION }}-${{ matrix.runs_on }} + path: log_*.txt + if-no-files-found: ignore + retention-days: 14 + - name: Test check_missing_installations.sh with missing package (GCC/8.3.0) run: | # This is a general check, doesn't need to be run for every CPU, just the host is fine From ef80c0b8bb927e92a7e0b296ec90a89298100a4a Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Tue, 6 Oct 2026 14:27:30 +0200 Subject: [PATCH 4/6] Use TOML instead of JSON for eessi_targets TOML is parseable from Python's standard library (tomllib, 3.11+) and from the shell with yq, and unlike JSON it allows comments. yq is called with explicit input/output formats (-p toml -o yaml) so the output is raw strings, rather than relying on yq inferring the output format from the file extension. Co-Authored-By: Claude Sonnet 5.5 --- .github/workflows/eessi_targets.json | 175 ------------------ .github/workflows/eessi_targets.toml | 184 +++++++++++++++++++ .github/workflows/test-software.eessi.io.yml | 12 +- 3 files changed, 190 insertions(+), 181 deletions(-) delete mode 100644 .github/workflows/eessi_targets.json create mode 100644 .github/workflows/eessi_targets.toml diff --git a/.github/workflows/eessi_targets.json b/.github/workflows/eessi_targets.json deleted file mode 100644 index a788dec6b4..0000000000 --- a/.github/workflows/eessi_targets.json +++ /dev/null @@ -1,175 +0,0 @@ -{ - "cpu_targets": { - "2023.06": { - "x86_64": [ - "x86_64/amd/zen2", - "x86_64/amd/zen3", - "x86_64/amd/zen4", - "x86_64/intel/haswell", - "x86_64/intel/sapphirerapids", - "x86_64/intel/skylake_avx512", - "x86_64/intel/icelake", - "x86_64/intel/cascadelake", - "x86_64/generic" - ], - "aarch64": [ - "aarch64/generic", - "aarch64/neoverse_n1", - "aarch64/neoverse_v1", - "aarch64/nvidia/grace", - "aarch64/a64fx" - ] - }, - "2025.06": { - "x86_64": [ - "x86_64/amd/zen2", - "x86_64/amd/zen3", - "x86_64/amd/zen4", - "x86_64/amd/zen5", - "x86_64/intel/haswell", - "x86_64/intel/sapphirerapids", - "x86_64/intel/skylake_avx512", - "x86_64/intel/icelake", - "x86_64/intel/cascadelake", - "x86_64/generic" - ], - "aarch64": [ - "aarch64/generic", - "aarch64/neoverse_n1", - "aarch64/neoverse_v1", - "aarch64/nvidia/grace", - "aarch64/a64fx" - ] - }, - "2026.06": { - "x86_64": [ - "x86_64/amd/zen2", - "x86_64/amd/zen3", - "x86_64/amd/zen4", - "x86_64/amd/zen5", - "x86_64/intel/haswell", - "x86_64/intel/sapphirerapids", - "x86_64/intel/graniterapids", - "x86_64/intel/skylake_avx512", - "x86_64/intel/icelake", - "x86_64/intel/cascadelake", - "x86_64/generic" - ], - "aarch64": [ - "aarch64/generic", - "aarch64/neoverse_n1", - "aarch64/neoverse_v1", - "aarch64/nvidia/grace", - "aarch64/a64fx", - "aarch64/aws/graviton4" - ] - } - }, - "accelerator_targets": { - "2023.06": { - "default": [ - "nvidia/cc70", - "nvidia/cc80", - "nvidia/cc90" - ], - "x86_64/amd/zen2": [ - "nvidia/cc70", - "nvidia/cc80", - "nvidia/cc90" - ], - "aarch64/a64fx": [] - }, - "2025.06": { - "default": [ - "nvidia/cc70", - "nvidia/cc80", - "nvidia/cc90", - "nvidia/cc100", - "nvidia/cc120", - "amd/gfx908", - "amd/gfx90a", - "amd/gfx942", - "amd/gfx1030", - "amd/gfx1100", - "amd/gfx1101", - "amd/gfx1200", - "amd/gfx1201" - ], - "aarch64/generic": [ - "nvidia/cc70", - "nvidia/cc80", - "nvidia/cc90", - "nvidia/cc100", - "nvidia/cc120" - ], - "aarch64/neoverse_n1": [ - "nvidia/cc70", - "nvidia/cc80", - "nvidia/cc90", - "nvidia/cc100", - "nvidia/cc120" - ], - "aarch64/neoverse_v1": [ - "nvidia/cc70", - "nvidia/cc80", - "nvidia/cc90", - "nvidia/cc100", - "nvidia/cc120" - ], - "aarch64/nvidia/grace": [ - "nvidia/cc70", - "nvidia/cc80", - "nvidia/cc90", - "nvidia/cc100", - "nvidia/cc120" - ], - "aarch64/a64fx": [] - }, - "2026.06": { - "default": [ - "nvidia/cc75", - "nvidia/cc80", - "nvidia/cc90", - "nvidia/cc100", - "nvidia/cc120", - "amd/gfx908", - "amd/gfx90a", - "amd/gfx942", - "amd/gfx1030", - "amd/gfx1100", - "amd/gfx1101", - "amd/gfx1200", - "amd/gfx1201" - ], - "aarch64/generic": [ - "nvidia/cc75", - "nvidia/cc80", - "nvidia/cc90", - "nvidia/cc100", - "nvidia/cc120" - ], - "aarch64/neoverse_n1": [ - "nvidia/cc75", - "nvidia/cc80", - "nvidia/cc90", - "nvidia/cc100", - "nvidia/cc120" - ], - "aarch64/neoverse_v1": [ - "nvidia/cc75", - "nvidia/cc80", - "nvidia/cc90", - "nvidia/cc100", - "nvidia/cc120" - ], - "aarch64/nvidia/grace": [ - "nvidia/cc75", - "nvidia/cc80", - "nvidia/cc90", - "nvidia/cc100", - "nvidia/cc120" - ], - "aarch64/a64fx": [] - } - } -} diff --git a/.github/workflows/eessi_targets.toml b/.github/workflows/eessi_targets.toml new file mode 100644 index 0000000000..5d5d10b78d --- /dev/null +++ b/.github/workflows/eessi_targets.toml @@ -0,0 +1,184 @@ +# Supported targets per EESSI version, shared by the CI workflows and scripts. +# +# cpu_targets: should correspond with the table @ https://eessi.io/docs/software_layer/cpu_targets/ +# Per EESSI version, the CPU targets for each CPU family. +# accelerator_targets: should correspond with the table @ https://eessi.io/docs/software_layer/gpu_targets/ +# Per EESSI version, the accelerator targets to build for. 'default' applies to every CPU target, +# unless a CPU target has an entry of its own (which may be empty, i.e. no accelerators). + + +[cpu_targets."2023.06"] +x86_64 = [ + "x86_64/amd/zen2", + "x86_64/amd/zen3", + "x86_64/amd/zen4", + "x86_64/intel/haswell", + "x86_64/intel/sapphirerapids", + "x86_64/intel/skylake_avx512", + "x86_64/intel/icelake", + "x86_64/intel/cascadelake", + "x86_64/generic", +] +aarch64 = [ + "aarch64/generic", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", + "aarch64/a64fx", +] + +[cpu_targets."2025.06"] +x86_64 = [ + "x86_64/amd/zen2", + "x86_64/amd/zen3", + "x86_64/amd/zen4", + "x86_64/amd/zen5", + "x86_64/intel/haswell", + "x86_64/intel/sapphirerapids", + "x86_64/intel/skylake_avx512", + "x86_64/intel/icelake", + "x86_64/intel/cascadelake", + "x86_64/generic", +] +aarch64 = [ + "aarch64/generic", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", + "aarch64/a64fx", +] + +[cpu_targets."2026.06"] +x86_64 = [ + "x86_64/amd/zen2", + "x86_64/amd/zen3", + "x86_64/amd/zen4", + "x86_64/amd/zen5", + "x86_64/intel/haswell", + "x86_64/intel/sapphirerapids", + "x86_64/intel/graniterapids", + "x86_64/intel/skylake_avx512", + "x86_64/intel/icelake", + "x86_64/intel/cascadelake", + "x86_64/generic", +] +aarch64 = [ + "aarch64/generic", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", + "aarch64/a64fx", + "aarch64/aws/graviton4", +] + + +[accelerator_targets."2023.06"] +# Provide a default set of compute capabilities +default = [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90", +] +# and then allow for special cases for specific CPU targets +"x86_64/amd/zen2" = [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90", +] +"aarch64/a64fx" = [] + +[accelerator_targets."2025.06"] +# Provide a default set of compute capabilities +default = [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90", + "nvidia/cc100", + "nvidia/cc120", + "amd/gfx908", + "amd/gfx90a", + "amd/gfx942", + "amd/gfx1030", + "amd/gfx1100", + "amd/gfx1101", + "amd/gfx1200", + "amd/gfx1201", +] +# and then allow for special cases for specific CPU targets +"aarch64/generic" = [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90", + "nvidia/cc100", + "nvidia/cc120", +] +"aarch64/neoverse_n1" = [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90", + "nvidia/cc100", + "nvidia/cc120", +] +"aarch64/neoverse_v1" = [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90", + "nvidia/cc100", + "nvidia/cc120", +] +"aarch64/nvidia/grace" = [ + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90", + "nvidia/cc100", + "nvidia/cc120", +] +"aarch64/a64fx" = [] + +[accelerator_targets."2026.06"] +# Provide a default set of compute capabilities +default = [ + "nvidia/cc75", + "nvidia/cc80", + "nvidia/cc90", + "nvidia/cc100", + "nvidia/cc120", + "amd/gfx908", + "amd/gfx90a", + "amd/gfx942", + "amd/gfx1030", + "amd/gfx1100", + "amd/gfx1101", + "amd/gfx1200", + "amd/gfx1201", +] +# and then allow for special cases for specific CPU targets +"aarch64/generic" = [ + "nvidia/cc75", + "nvidia/cc80", + "nvidia/cc90", + "nvidia/cc100", + "nvidia/cc120", +] +"aarch64/neoverse_n1" = [ + "nvidia/cc75", + "nvidia/cc80", + "nvidia/cc90", + "nvidia/cc100", + "nvidia/cc120", +] +"aarch64/neoverse_v1" = [ + "nvidia/cc75", + "nvidia/cc80", + "nvidia/cc90", + "nvidia/cc100", + "nvidia/cc120", +] +"aarch64/nvidia/grace" = [ + "nvidia/cc75", + "nvidia/cc80", + "nvidia/cc90", + "nvidia/cc100", + "nvidia/cc120", +] +"aarch64/a64fx" = [] diff --git a/.github/workflows/test-software.eessi.io.yml b/.github/workflows/test-software.eessi.io.yml index 06e0f69c9d..b7b2ba904e 100644 --- a/.github/workflows/test-software.eessi.io.yml +++ b/.github/workflows/test-software.eessi.io.yml @@ -9,11 +9,11 @@ on: permissions: contents: read # to fetch code (actions/checkout) env: - # Supported CPU and accelerator targets per EESSI version live in a single JSON file, so that + # Supported CPU and accelerator targets per EESSI version live in a single TOML file, so that # other workflows/scripts can reuse them. The CPU targets should correspond with the table @ # https://eessi.io/docs/software_layer/cpu_targets/ and the accelerator targets with the table @ # https://eessi.io/docs/software_layer/gpu_targets/ - EESSI_TARGETS_FILE: ${{ github.workspace }}/.github/workflows/eessi_targets.json + EESSI_TARGETS_FILE: ${{ github.workspace }}/.github/workflows/eessi_targets.toml jobs: # Checks whether this PR modifies any easystack files and, if so, # determines which EESSI versions are affected. @@ -147,7 +147,7 @@ jobs: run: | # From this extract the CPUs we need to loop over - cpu_subdirs=$(jq -r --arg v "${EESSI_VERSION}" --arg f "${EESSI_CPU_FAMILY}" '.cpu_targets[$v][$f][]' "${EESSI_TARGETS_FILE}") + cpu_subdirs=$(yq -p toml -o yaml ".cpu_targets.\"${EESSI_VERSION}\".\"${EESSI_CPU_FAMILY}\" | .[]" "${EESSI_TARGETS_FILE}") if [[ -z "${cpu_subdirs}" ]]; then echo "ERROR: No CPU subdirs resolved for ${EESSI_VERSION} / ${EESSI_CPU_FAMILY}" exit 1 @@ -212,7 +212,7 @@ jobs: echo echo "now check accelerator builds for ${cpu}" - accelerators=$(jq -r --arg v "${{matrix.EESSI_VERSION}}" --arg c "${cpu}" '.accelerator_targets[$v] | (.[$c] // .default) | .[]' "${EESSI_TARGETS_FILE}") + accelerators=$(yq -p toml -o yaml ".accelerator_targets.\"${{matrix.EESSI_VERSION}}\".\"${cpu}\" // .accelerator_targets.\"${{matrix.EESSI_VERSION}}\".default | .[]" "${EESSI_TARGETS_FILE}") if [[ -z "${accelerators}" ]]; then echo "no accelerator targets defined for ${cpu}" @@ -318,14 +318,14 @@ jobs: echo "::group::EESSI ${EESSI_VERSION} / ${EESSI_CPU_FAMILY}" # Get all CPU targets belonging to this architecture family. - CPU_TARGETS=$(jq -r --arg v "${EESSI_VERSION}" --arg f "${EESSI_CPU_FAMILY}" '.cpu_targets[$v][$f][]' "${EESSI_TARGETS_FILE}") + CPU_TARGETS=$(yq -p toml -o yaml ".cpu_targets.\"${EESSI_VERSION}\".\"${EESSI_CPU_FAMILY}\" | .[]" "${EESSI_TARGETS_FILE}") for COMPARISON_ARCH in ${CPU_TARGETS}; do echo "::group::Compare ${EESSI_VERSION} / ${COMPARISON_ARCH}" # Use architecture-specific accelerator targets where defined, # otherwise fall back to the default set. - ALL_ACCELERATOR_TARGETS=$(jq -r --arg v "${{ matrix.EESSI_VERSION }}" --arg c "${COMPARISON_ARCH}" '.accelerator_targets[$v] | (.[$c] // .default) | .[]' "${EESSI_TARGETS_FILE}" \ + ALL_ACCELERATOR_TARGETS=$(yq -p toml -o yaml ".accelerator_targets.\"${{ matrix.EESSI_VERSION }}\".\"${COMPARISON_ARCH}\" // .accelerator_targets.\"${{ matrix.EESSI_VERSION }}\".default | .[]" "${EESSI_TARGETS_FILE}" \ | tr '\n' ' ') echo "COMPARISON_ARCH=${COMPARISON_ARCH}" From 5f00aa2d8c84912ed50017d2f8655c535e083f40 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Tue, 6 Oct 2026 14:52:00 +0200 Subject: [PATCH 5/6] Sort targets in eessi_targets.toml alphabetically Co-Authored-By: Claude Sonnet 5.5 --- .github/workflows/eessi_targets.toml | 200 +++++++++++++-------------- 1 file changed, 99 insertions(+), 101 deletions(-) diff --git a/.github/workflows/eessi_targets.toml b/.github/workflows/eessi_targets.toml index 5d5d10b78d..a328646738 100644 --- a/.github/workflows/eessi_targets.toml +++ b/.github/workflows/eessi_targets.toml @@ -6,179 +6,177 @@ # Per EESSI version, the accelerator targets to build for. 'default' applies to every CPU target, # unless a CPU target has an entry of its own (which may be empty, i.e. no accelerators). - [cpu_targets."2023.06"] +aarch64 = [ + "aarch64/a64fx", + "aarch64/generic", + "aarch64/neoverse_n1", + "aarch64/neoverse_v1", + "aarch64/nvidia/grace", +] x86_64 = [ "x86_64/amd/zen2", "x86_64/amd/zen3", "x86_64/amd/zen4", + "x86_64/generic", + "x86_64/intel/cascadelake", "x86_64/intel/haswell", + "x86_64/intel/icelake", "x86_64/intel/sapphirerapids", "x86_64/intel/skylake_avx512", - "x86_64/intel/icelake", - "x86_64/intel/cascadelake", - "x86_64/generic", ] + +[cpu_targets."2025.06"] aarch64 = [ + "aarch64/a64fx", "aarch64/generic", "aarch64/neoverse_n1", "aarch64/neoverse_v1", "aarch64/nvidia/grace", - "aarch64/a64fx", ] - -[cpu_targets."2025.06"] x86_64 = [ "x86_64/amd/zen2", "x86_64/amd/zen3", "x86_64/amd/zen4", "x86_64/amd/zen5", + "x86_64/generic", + "x86_64/intel/cascadelake", "x86_64/intel/haswell", + "x86_64/intel/icelake", "x86_64/intel/sapphirerapids", "x86_64/intel/skylake_avx512", - "x86_64/intel/icelake", - "x86_64/intel/cascadelake", - "x86_64/generic", ] + +[cpu_targets."2026.06"] aarch64 = [ + "aarch64/a64fx", + "aarch64/aws/graviton4", "aarch64/generic", "aarch64/neoverse_n1", "aarch64/neoverse_v1", "aarch64/nvidia/grace", - "aarch64/a64fx", ] - -[cpu_targets."2026.06"] x86_64 = [ "x86_64/amd/zen2", "x86_64/amd/zen3", "x86_64/amd/zen4", "x86_64/amd/zen5", + "x86_64/generic", + "x86_64/intel/cascadelake", + "x86_64/intel/graniterapids", "x86_64/intel/haswell", + "x86_64/intel/icelake", "x86_64/intel/sapphirerapids", - "x86_64/intel/graniterapids", "x86_64/intel/skylake_avx512", - "x86_64/intel/icelake", - "x86_64/intel/cascadelake", - "x86_64/generic", -] -aarch64 = [ - "aarch64/generic", - "aarch64/neoverse_n1", - "aarch64/neoverse_v1", - "aarch64/nvidia/grace", - "aarch64/a64fx", - "aarch64/aws/graviton4", ] - [accelerator_targets."2023.06"] # Provide a default set of compute capabilities default = [ - "nvidia/cc70", - "nvidia/cc80", - "nvidia/cc90", + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90", ] # and then allow for special cases for specific CPU targets +"aarch64/a64fx" = [] "x86_64/amd/zen2" = [ - "nvidia/cc70", - "nvidia/cc80", - "nvidia/cc90", + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90", ] -"aarch64/a64fx" = [] [accelerator_targets."2025.06"] # Provide a default set of compute capabilities default = [ - "nvidia/cc70", - "nvidia/cc80", - "nvidia/cc90", - "nvidia/cc100", - "nvidia/cc120", - "amd/gfx908", - "amd/gfx90a", - "amd/gfx942", - "amd/gfx1030", - "amd/gfx1100", - "amd/gfx1101", - "amd/gfx1200", - "amd/gfx1201", + "amd/gfx1030", + "amd/gfx1100", + "amd/gfx1101", + "amd/gfx1200", + "amd/gfx1201", + "amd/gfx908", + "amd/gfx90a", + "amd/gfx942", + "nvidia/cc100", + "nvidia/cc120", + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90", ] # and then allow for special cases for specific CPU targets +"aarch64/a64fx" = [] "aarch64/generic" = [ - "nvidia/cc70", - "nvidia/cc80", - "nvidia/cc90", - "nvidia/cc100", - "nvidia/cc120", + "nvidia/cc100", + "nvidia/cc120", + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90", ] "aarch64/neoverse_n1" = [ - "nvidia/cc70", - "nvidia/cc80", - "nvidia/cc90", - "nvidia/cc100", - "nvidia/cc120", + "nvidia/cc100", + "nvidia/cc120", + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90", ] "aarch64/neoverse_v1" = [ - "nvidia/cc70", - "nvidia/cc80", - "nvidia/cc90", - "nvidia/cc100", - "nvidia/cc120", + "nvidia/cc100", + "nvidia/cc120", + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90", ] "aarch64/nvidia/grace" = [ - "nvidia/cc70", - "nvidia/cc80", - "nvidia/cc90", - "nvidia/cc100", - "nvidia/cc120", + "nvidia/cc100", + "nvidia/cc120", + "nvidia/cc70", + "nvidia/cc80", + "nvidia/cc90", ] -"aarch64/a64fx" = [] [accelerator_targets."2026.06"] # Provide a default set of compute capabilities default = [ - "nvidia/cc75", - "nvidia/cc80", - "nvidia/cc90", - "nvidia/cc100", - "nvidia/cc120", - "amd/gfx908", - "amd/gfx90a", - "amd/gfx942", - "amd/gfx1030", - "amd/gfx1100", - "amd/gfx1101", - "amd/gfx1200", - "amd/gfx1201", + "amd/gfx1030", + "amd/gfx1100", + "amd/gfx1101", + "amd/gfx1200", + "amd/gfx1201", + "amd/gfx908", + "amd/gfx90a", + "amd/gfx942", + "nvidia/cc100", + "nvidia/cc120", + "nvidia/cc75", + "nvidia/cc80", + "nvidia/cc90", ] # and then allow for special cases for specific CPU targets +"aarch64/a64fx" = [] "aarch64/generic" = [ - "nvidia/cc75", - "nvidia/cc80", - "nvidia/cc90", - "nvidia/cc100", - "nvidia/cc120", + "nvidia/cc100", + "nvidia/cc120", + "nvidia/cc75", + "nvidia/cc80", + "nvidia/cc90", ] "aarch64/neoverse_n1" = [ - "nvidia/cc75", - "nvidia/cc80", - "nvidia/cc90", - "nvidia/cc100", - "nvidia/cc120", + "nvidia/cc100", + "nvidia/cc120", + "nvidia/cc75", + "nvidia/cc80", + "nvidia/cc90", ] "aarch64/neoverse_v1" = [ - "nvidia/cc75", - "nvidia/cc80", - "nvidia/cc90", - "nvidia/cc100", - "nvidia/cc120", + "nvidia/cc100", + "nvidia/cc120", + "nvidia/cc75", + "nvidia/cc80", + "nvidia/cc90", ] "aarch64/nvidia/grace" = [ - "nvidia/cc75", - "nvidia/cc80", - "nvidia/cc90", - "nvidia/cc100", - "nvidia/cc120", + "nvidia/cc100", + "nvidia/cc120", + "nvidia/cc75", + "nvidia/cc80", + "nvidia/cc90", ] -"aarch64/a64fx" = [] From fe4ec280793780bde6cd913f7993f245cab950db Mon Sep 17 00:00:00 2001 From: ocaisa Date: Tue, 6 Oct 2026 18:00:29 +0200 Subject: [PATCH 6/6] Update .github/workflows/test-software.eessi.io.yml --- .github/workflows/test-software.eessi.io.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-software.eessi.io.yml b/.github/workflows/test-software.eessi.io.yml index b7b2ba904e..56832aeb96 100644 --- a/.github/workflows/test-software.eessi.io.yml +++ b/.github/workflows/test-software.eessi.io.yml @@ -283,7 +283,7 @@ jobs: name: missing-installations-logs-${{ matrix.EESSI_VERSION }}-${{ matrix.runs_on }} path: log_*.txt if-no-files-found: ignore - retention-days: 14 + retention-days: 4 - name: Test check_missing_installations.sh with missing package (GCC/8.3.0) run: |