blob: e275dfc3127c4b2b793a5702f7f1f7be2478118b [file]
# Base configuration for linux cross-compilation.
# SPDX-FileCopyrightText: The Eigen Authors
# SPDX-License-Identifier: MPL-2.0
.build:linux:cross:
needs: []
extends: [ .common:linux:cross, .artifacts:linux:builddir ]
stage: build
variables:
EIGEN_CI_BUILD_TARGET: buildtests
EIGEN_CI_SKIP_APT: "false"
# "off" disables the ccache compiler launchers (see build.linux.script.sh);
# the jobs that set it explain why. Images without ccache build exactly as
# before regardless of this setting.
EIGEN_CI_CCACHE: "on"
CCACHE_DIR: ${CI_PROJECT_DIR}/.ccache
# A full buildtests job stores ~4-6 GB of compressed objects; at 2G every
# nightly build filled the cache (149 LRU cleanups, 0.4% hits) and evicted
# what the previous run had stored, so nothing was ever reused. 4G is the
# largest safe cap: hosted runners reject cache archives over 5 GB, and
# the archive is about the size of the (already zstd-compressed) ccache
# directory. The raised compression level packs more of the working set
# under that cap; 5 is the ccache manual's recommended ceiling for live
# (compile-time) compression, and captures most of the density gain.
CCACHE_MAXSIZE: 4G
CCACHE_COMPRESSLEVEL: 5
# Hash compile paths relative to the project directory: absolute -I/source
# paths are part of ccache's hash, so without this a checkout-path change
# (runner layout, concurrent build slots) turns every compile into a miss.
CCACHE_BASEDIR: ${CI_PROJECT_DIR}
# The ccache payload is already zstd-compressed, so re-compressing it into
# cache.zip at the default level burns CPU for no size gain: a fully warm
# build spent 87s archiving+uploading a 2 GB cache it compiled in 71s.
# Fastzip at "fastest" effectively stores the archive instead, and also
# speeds up cache extraction on restore.
FF_USE_FASTZIP: "true"
CACHE_COMPRESSION_LEVEL: "fastest"
# ccache pool name, minus the `-ccache` suffix the cache stanza appends:
# the job's own slug by default. A job that compiles a subset of another
# job's targets with the same flags names that job's slug instead (see the
# affected-tests section), so it draws on a pool the full builds fill.
EIGEN_CI_CCACHE_POOL: $CI_JOB_NAME_SLUG
script:
- . ci/scripts/build.linux.script.sh
tags:
- saas-linux-2xlarge-amd64
rules: !reference [.rules:libeigen:all-tests, rules]
# Cache the ccache directory, not ${EIGEN_CI_BUILDDIR}: each job starts from
# a fresh clone whose checkout mtimes are newer than any restored build
# output, so ninja rebuilt every target despite a successfully restored
# cache. ccache keys on file content and compiler, which survives the
# re-clone. No ${CI_COMMIT_REF_SLUG} in the key: pipelines share one cache
# pool per EIGEN_CI_CCACHE_POOL. GitLab still splits each pool by a suffix:
# `-protected` for a pipeline on a protected ref or started by a Maintainer
# or Owner, `-non_protected` otherwise. A Developer-started merge request
# pipeline therefore has a pool the scheduled master builds never fill; a
# maintainer starting that pipeline puts it on the shared one.
cache:
key: "$EIGEN_CI_CCACHE_POOL-ccache"
paths:
- .ccache/
# Push the cache even when the build fails: the retry pipeline after a
# compile error is exactly where cache hits matter most.
when: always
######## x86-64 ################################################################
.build:linux:cross:x86-64:
extends: .build:linux:cross
variables:
EIGEN_CI_TARGET_ARCH: x86_64
EIGEN_CI_CROSS_TARGET_TRIPLE: x86_64-linux-gnu
# GCC-10 (stable recent version)
build:linux:cross:x86-64:gcc-10:default:
extends: .build:linux:cross:x86-64
variables:
EIGEN_CI_C_COMPILER: gcc-10
EIGEN_CI_CXX_COMPILER: g++-10
EIGEN_CI_CROSS_INSTALL: g++-10-x86-64-linux-gnu
EIGEN_CI_CROSS_C_COMPILER: x86_64-linux-gnu-gcc-10
EIGEN_CI_CROSS_CXX_COMPILER: x86_64-linux-gnu-g++-10
# GCC-13 for AVX512-FP16 (_Float16 support).
build:linux:cross:x86-64:gcc-13:default:
extends: .build:linux:cross:x86-64
variables:
EIGEN_CI_C_COMPILER: gcc-13
EIGEN_CI_CXX_COMPILER: g++-13
EIGEN_CI_CROSS_INSTALL: g++-13-x86-64-linux-gnu
EIGEN_CI_CROSS_C_COMPILER: x86_64-linux-gnu-gcc-13
EIGEN_CI_CROSS_CXX_COMPILER: x86_64-linux-gnu-g++-13
build:linux:cross:x86-64:gcc-10:avx:
extends: build:linux:cross:x86-64:gcc-10:default
variables:
EIGEN_CI_ADDITIONAL_ARGS: "-DEIGEN_TEST_AVX=on"
build:linux:cross:x86-64:gcc-10:avx2:
extends: build:linux:cross:x86-64:gcc-10:default
variables:
EIGEN_CI_ADDITIONAL_ARGS: "-DEIGEN_TEST_AVX2=on"
build:linux:cross:x86-64:gcc-10:avx512dq:
extends: build:linux:cross:x86-64:gcc-10:default
variables:
EIGEN_CI_ADDITIONAL_ARGS: "-DEIGEN_TEST_AVX512DQ=on"
# AVX512-FP16 builds are split into official/unsupported because building all
# tests exceeds the 3-hour GitLab SaaS shared-runner timeout.
.build:linux:cross:x86-64:gcc-13:avx512fp16:
extends: build:linux:cross:x86-64:gcc-13:default
variables:
# Force -O2 via EIGEN_TEST_CUSTOM_CXX_FLAGS (appended after the default
# Release -O3 -DNDEBUG; last -O wins). GCC bug at -O3 generates invalid
# masked vmovsh with {z} on memory stores for _Float16 operations
# (zero-masking on memory destinations is architecturally illegal in
# AVX-512).
EIGEN_CI_ADDITIONAL_ARGS: "-DEIGEN_TEST_AVX512FP16=on -DEIGEN_TEST_AVX512DQ=on -DEIGEN_TEST_F16C=on -DEIGEN_TEST_CUSTOM_CXX_FLAGS=-O2"
build:linux:cross:x86-64:gcc-13:avx512fp16:official:
extends: .build:linux:cross:x86-64:gcc-13:avx512fp16
variables:
EIGEN_CI_BUILD_TARGET: BuildOfficial
build:linux:cross:x86-64:gcc-13:avx512fp16:unsupported:
extends: .build:linux:cross:x86-64:gcc-13:avx512fp16
variables:
EIGEN_CI_BUILD_TARGET: BuildUnsupported
# Clang-14 (stable recent version)
build:linux:cross:x86-64:clang-14:default:
extends: .build:linux:cross:x86-64
variables:
EIGEN_CI_INSTALL: clang-14
EIGEN_CI_C_COMPILER: clang-14
EIGEN_CI_CXX_COMPILER: clang++-14
EIGEN_CI_CROSS_INSTALL: g++-10-x86-64-linux-gnu clang-14
build:linux:cross:x86-64:clang-14:avx2:
extends: build:linux:cross:x86-64:clang-14:default
variables:
EIGEN_CI_ADDITIONAL_ARGS: "-DEIGEN_TEST_AVX2=on"
build:linux:cross:x86-64:clang-14:avx512dq:
extends: build:linux:cross:x86-64:clang-14:default
variables:
EIGEN_CI_ADDITIONAL_ARGS: "-DEIGEN_TEST_AVX512DQ=on"
# Generic vector extension backend.
build:linux:cross:x86-64:clang-19:generic:avx512dq:
extends: build:linux:cross:x86-64:clang-14:default
variables:
EIGEN_CI_INSTALL: clang-19
EIGEN_CI_C_COMPILER: clang-19
EIGEN_CI_CXX_COMPILER: clang++-19
EIGEN_CI_CROSS_INSTALL: g++-14-x86-64-linux-gnu clang-19
EIGEN_CI_ADDITIONAL_ARGS: >-
-DEIGEN_TEST_CUSTOM_CXX_FLAGS=-mfma;-mavx512dq;-DEIGEN_VECTORIZE_GENERIC=1
# Nightly and all-tests full test suite in C++20 mode.
build:linux:cross:x86-64:clang-19:cxx20:nightly:
extends: .build:linux:cross:x86-64
variables:
EIGEN_CI_INSTALL: clang-19
EIGEN_CI_C_COMPILER: clang-19
EIGEN_CI_CXX_COMPILER: clang++-19
EIGEN_CI_CROSS_INSTALL: g++-14-x86-64-linux-gnu clang-19
EIGEN_CI_ADDITIONAL_ARGS: >-
-DCMAKE_CXX_STANDARD=20
# Nightly job restricted to the default branch on schedule.
rules:
- if: $CI_PIPELINE_SOURCE == "schedule" && $CI_PROJECT_NAMESPACE == "libeigen" && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- if: $CI_PIPELINE_SOURCE == "web" && $CI_PROJECT_NAMESPACE == "libeigen"
- if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_PROJECT_NAMESPACE == "libeigen" && $CI_MERGE_REQUEST_LABELS =~ "/all-tests/"
build:linux:docs:
extends: .build:linux:cross
variables:
EIGEN_CI_TARGET_ARCH: any
EIGEN_CI_BUILD_TARGET: doc
EIGEN_CI_INSTALL: ca-certificates clang flex python3 bison graphviz
EIGEN_CI_C_COMPILER: clang
EIGEN_CI_CXX_COMPILER: clang++
EIGEN_CI_BEFORE_SCRIPT: ". ci/scripts/build_and_install_doxygen.sh Release_1_13_2"
tags:
- saas-linux-medium-amd64
rules:
- if: $CI_PIPELINE_SOURCE == "schedule" && $CI_PROJECT_NAMESPACE == "libeigen"
- if: $CI_PIPELINE_SOURCE == "web" && $CI_PROJECT_NAMESPACE == "libeigen"
- if: $CI_PIPELINE_SOURCE == "push" && $CI_PROJECT_NAMESPACE == "libeigen" && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_PROJECT_NAMESPACE == "libeigen" && $CI_MERGE_REQUEST_LABELS =~ "/all-tests/"
######## Sanitizers ############################################################
# ASAN/UBSAN builds are split into official/unsupported because the
# instrumented executables are too large to upload as a single artifact.
.build:linux:cross:x86-64:clang-19:default:asan-ubsan:
extends: .build:linux:cross:x86-64
# Disable caching for ASAN builds: instrumented .o files are so large that
# moving them through the cache can take longer than a clean build from
# scratch. Both settings below are needed and do different things:
# cache: [] drops the archive round trip, and without it a pool populated
# before ccache was turned off here would keep being restored under the same
# $CI_JOB_NAME_SLUG-ccache key; EIGEN_CI_CCACHE: "off" drops the compiler
# launchers, so nothing is written to the runner's disk either.
cache: []
timeout: 2h
variables:
EIGEN_CI_CCACHE: "off"
EIGEN_CI_INSTALL: clang-19 libclang-rt-19-dev
EIGEN_CI_C_COMPILER: clang-19
EIGEN_CI_CXX_COMPILER: clang++-19
EIGEN_CI_CROSS_INSTALL: g++-14-x86-64-linux-gnu clang-19 libclang-rt-19-dev
# Statically linked sanitizer runtimes make the test artifacts exceed GitLab's 1 GB upload limit.
EIGEN_CI_ADDITIONAL_ARGS: >-
-DEIGEN_TEST_CUSTOM_CXX_FLAGS=-fsanitize=address,undefined;-fno-omit-frame-pointer;-fno-sanitize-recover=undefined
-DEIGEN_TEST_CUSTOM_LINKER_FLAGS=-fsanitize=address,undefined;-shared-libsan
build:linux:cross:x86-64:clang-19:default:asan-ubsan:official:
extends: .build:linux:cross:x86-64:clang-19:default:asan-ubsan
variables:
EIGEN_CI_BUILD_TARGET: BuildOfficial
build:linux:cross:x86-64:clang-19:default:asan-ubsan:unsupported:
extends: .build:linux:cross:x86-64:clang-19:default:asan-ubsan
variables:
EIGEN_CI_BUILD_TARGET: BuildUnsupported
######## NVHPC #################################################################
# NVHPC (nvc++) uses NVIDIA's HPC SDK container image with the compilers
# pre-installed. We override EIGEN_CI_INSTALL to avoid trying to apt-get
# install the compiler.
# Split into official/unsupported because nvc++ is so slow that the full
# build exceeds the 3-hour GitLab SaaS shared-runner timeout.
.build:linux:x86-64:nvhpc-26.1:
extends: .build:linux:cross:x86-64
image: nvcr.io/nvidia/nvhpc:26.1-devel-cuda13.1-ubuntu24.04
# ccache has no dedicated nvc++ support -- the name falls through its
# compiler-type guess to "other" -- but that is a generic handling path, not a
# refusal: the calls are cacheable and hit. Which matters most here, given the
# frontend cost the section comment above describes.
variables:
EIGEN_CI_C_COMPILER: nvc
EIGEN_CI_CXX_COMPILER: nvc++
EIGEN_CI_INSTALL: ""
EIGEN_CI_CROSS_INSTALL: ""
# NVHPC's compiler frontend is very memory-hungry with template-heavy code.
# The 2xlarge runner has 128 GB, so 16 jobs gives ~8 GB per process.
# The shuffled-batch build strategy spreads memory-hungry targets across
# batches, preventing simultaneous OOM-prone compilations.
EIGEN_CI_BUILD_JOBS: "16"
EIGEN_CI_FALLBACK_JOBS: "4"
# Schedules and web pipelines only, not the `all-tests` label the rest of the
# matrix inherits from .build:linux:cross. That slow frontend makes this the
# single most expensive pair of jobs in the tree -- together about a quarter
# of the project's hosted-runner minutes -- while covering one compiler that
# no merge request is likely to break in isolation. Start a web pipeline on a
# merge request that touches something nvc++ is known to be fussy about
# rather than waiting for the scheduled run to find it.
rules: !reference [.rules:libeigen:scheduled-or-web, rules]
build:linux:x86-64:nvhpc-26.1:default:official:
extends: .build:linux:x86-64:nvhpc-26.1
variables:
EIGEN_CI_BUILD_TARGET: BuildOfficial
build:linux:x86-64:nvhpc-26.1:default:unsupported:
extends: .build:linux:x86-64:nvhpc-26.1
variables:
EIGEN_CI_BUILD_TARGET: BuildUnsupported
######## CUDA ##################################################################
.build:linux:cuda:
extends: .build:linux:cross:x86-64
# ccache and the inherited cache stanza apply here: the .cu compiles that
# dominate these builds now reach the launcher through the wrapper that
# ei_cuda_use_compiler_launcher() puts in front of nvcc. A new image costs
# one cold build rather than serving stale objects, since ccache hashes the
# nvcc it runs and the preprocessed source. nvcc's -M dependency and -dlink
# passes are not cacheable and appear as misses in the statistics.
variables:
# Additional flags passed to the cuda compiler.
EIGEN_CI_CUDA_CXX_FLAGS: ""
# Compute architectures present in the GitLab CI runners.
# SaaS GPU runners have Tesla T4 (sm_75); the paired test jobs have to
# stay on those runners, see .test:linux:cuda.
EIGEN_CI_CUDA_COMPUTE_ARCH: "75"
EIGEN_CI_BUILD_TARGET: buildtests_gpu
EIGEN_CI_TEST_CUDA_CLANG: "off"
EIGEN_CI_TEST_CUDA_NVC: "off"
EIGEN_CI_ADDITIONAL_ARGS:
-DEIGEN_TEST_CUDA=on
-DEIGEN_CUDA_CXX_FLAGS=${EIGEN_CI_CUDA_CXX_FLAGS}
-DEIGEN_CUDA_COMPUTE_ARCH=${EIGEN_CI_CUDA_COMPUTE_ARCH}
-DEIGEN_TEST_CUDA_CLANG=${EIGEN_CI_TEST_CUDA_CLANG}
-DEIGEN_TEST_CUDA_NVC=${EIGEN_CI_TEST_CUDA_NVC}
rules: !reference [.rules:libeigen:gpu, rules]
tags:
# Build on regular linux to limit GPU cost.
- saas-linux-2xlarge-amd64
# ---- CUDA 11.5 + oldest supported compilers ---------------------------------
# clang-14 fully supports up to CUDA 11.5. CUDA 11.5 images are Ubuntu 20.04
# only, which lacks clang-14 and cmake >= 3.17. EIGEN_CI_BEFORE_SCRIPT adds
# the LLVM apt repo (for clang-14) and installs cmake via pip.
build:linux:cuda-11.5:gcc-10:
extends: .build:linux:cuda
image: nvidia/cuda:11.5.2-devel-ubuntu20.04
before_script:
# Ubuntu 20.04 has cmake 3.16; Eigen requires 3.17+. Pull a newer
# cmake from Kitware's official apt repo for focal.
- apt-get update -y > /dev/null
- apt-get install -y --no-install-recommends wget gnupg ca-certificates > /dev/null
- wget -qO - https://apt.kitware.com/keys/kitware-archive-latest.asc
| gpg --dearmor -o /usr/share/keyrings/kitware-archive-keyring.gpg
- echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ focal main'
> /etc/apt/sources.list.d/kitware.list
- apt-get update -y > /dev/null
- . ci/scripts/common.linux.before_script.sh
variables:
EIGEN_CI_INSTALL: gcc-10 g++-10
EIGEN_CI_C_COMPILER: gcc-10
EIGEN_CI_CXX_COMPILER: g++-10
build:linux:cuda-11.5:clang-14:
extends: build:linux:cuda-11.5:gcc-10
before_script:
# Ubuntu 20.04 lacks clang-14 and has cmake 3.16. Add both the LLVM
# apt repo (for clang-14) and Kitware's apt repo (for cmake >= 3.17)
# before running common.linux.before_script.sh, which apt-installs
# cmake + the requested compiler.
- apt-get update -y > /dev/null
- apt-get install -y --no-install-recommends wget gnupg ca-certificates > /dev/null
- wget -qO - https://apt.llvm.org/llvm-snapshot.gpg.key
| gpg --dearmor -o /usr/share/keyrings/llvm-archive-keyring.gpg
- echo 'deb [signed-by=/usr/share/keyrings/llvm-archive-keyring.gpg] http://apt.llvm.org/focal/ llvm-toolchain-focal-14 main'
> /etc/apt/sources.list.d/llvm-14.list
- wget -qO - https://apt.kitware.com/keys/kitware-archive-latest.asc
| gpg --dearmor -o /usr/share/keyrings/kitware-archive-keyring.gpg
- echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ focal main'
> /etc/apt/sources.list.d/kitware.list
- apt-get update -y > /dev/null
- . ci/scripts/common.linux.before_script.sh
variables:
EIGEN_CI_INSTALL: clang-14
EIGEN_CI_C_COMPILER: clang-14
EIGEN_CI_CXX_COMPILER: clang++-14
EIGEN_CI_TEST_CUDA_CLANG: "on"
# ---- New: latest CUDA + newest compilers, sm_89;sm_90 ----------------------
# The CUDA 11.5 jobs cover sm_75 on T4. These jobs run natively on the L4 at
# sm_89 and retain compile coverage for sm_90.
# GCC-13, CUDA-12.6 (nvcc)
# CUDA 12.6 nvcc only supports gcc up to 13.
build:linux:cuda-12.6:gcc-13:
extends: .build:linux:cuda
image: nvidia/cuda:12.6.3-devel-ubuntu24.04
variables:
EIGEN_CI_C_COMPILER: gcc-13
EIGEN_CI_CXX_COMPILER: g++-13
EIGEN_CI_CUDA_COMPUTE_ARCH: "89;90"
# Clang-19, CUDA-12.6 (clang as CUDA compiler)
# Clang CUDA support lags behind nvcc; clang-19 supports up to CUDA 12.x.
build:linux:cuda-12.6:clang-19:
extends: .build:linux:cuda
image: nvidia/cuda:12.6.3-devel-ubuntu24.04
variables:
EIGEN_CI_INSTALL: clang-19
EIGEN_CI_C_COMPILER: clang-19
EIGEN_CI_CXX_COMPILER: clang++-19
EIGEN_CI_TEST_CUDA_CLANG: "on"
EIGEN_CI_CUDA_COMPUTE_ARCH: "89;90"
######### HIP ##################################################################
# Note: these are currently build-only, until we get an AMD-supported runner.
# ROCm HIP
build:linux:rocm-latest:gcc-11:
extends: .build:linux:cross
image: rocm/dev-ubuntu-24.04:6.3.1
variables:
EIGEN_CI_CCACHE: "off"
EIGEN_CI_C_COMPILER: gcc-11
EIGEN_CI_CXX_COMPILER: g++-11
EIGEN_CI_BUILD_TARGET: buildtests_gpu
EIGEN_CI_ADDITIONAL_ARGS: -DEIGEN_TEST_HIP=on
rules: !reference [.rules:libeigen:gpu, rules]
# Disable cache for ROCm, since it fails whenever the image updates. As with
# the ASAN build above, this and EIGEN_CI_CCACHE: "off" are both needed: one
# drops the archive round trip, the other the compiler launchers.
cache: []
######## Arm ###################################################################
.build:linux:cross:arm:
extends: .build:linux:cross
variables:
EIGEN_CI_TARGET_ARCH: arm
EIGEN_CI_CROSS_TARGET_TRIPLE: arm-linux-gnueabihf
EIGEN_CI_ADDITIONAL_ARGS: >-
-DEIGEN_TEST_CUSTOM_CXX_FLAGS=-march=armv7-a;-mfpu=neon-vfpv4
-DCMAKE_SYSTEM_NAME=Linux
-DCMAKE_CROSSCOMPILING_EMULATOR=qemu-arm-static;-L;/usr/arm-linux-gnueabihf
build:linux:cross:arm:gcc-10:default:
extends: .build:linux:cross:arm
variables:
EIGEN_CI_CROSS_INSTALL: g++-10-arm-linux-gnueabihf qemu-user-static
EIGEN_CI_CROSS_C_COMPILER: arm-linux-gnueabihf-gcc-10
EIGEN_CI_CROSS_CXX_COMPILER: arm-linux-gnueabihf-g++-10
build:linux:cross:arm:clang-14:default:
extends: .build:linux:cross:arm
variables:
EIGEN_CI_INSTALL: clang-14
EIGEN_CI_C_COMPILER: clang-14
EIGEN_CI_CXX_COMPILER: clang++-14
EIGEN_CI_CROSS_INSTALL: g++-10-arm-linux-gnueabihf clang-14 qemu-user-static
######## aarch64 ###############################################################
.build:linux:cross:aarch64:
extends: .build:linux:cross
variables:
EIGEN_CI_TARGET_ARCH: aarch64
EIGEN_CI_CROSS_TARGET_TRIPLE: aarch64-linux-gnu
EIGEN_CI_ADDITIONAL_ARGS: -DEIGEN_TEST_CUSTOM_CXX_FLAGS=-march=armv8.2-a+fp16
tags:
- saas-linux-large-arm64
######## SME ###################################################################
# Emulation via QEMU for SME (Streaming Matrix Extension)
.build:linux:cross:sme:
extends: .build:linux:cross
variables:
EIGEN_CI_TARGET_ARCH: aarch64-sme
EIGEN_CI_CROSS_TARGET_TRIPLE: aarch64-linux-gnu
# The emulator baked in here deliberately has no -cpu argument: each test job
# selects its streaming SVL via qemu-user's QEMU_CPU environment variable
# instead (a command-line -cpu would silently override it).
#
# EIGEN_CI_ADDITIONAL_ARGS is expanded *unquoted* into the cmake command
# line (ci/scripts/build.linux.script.sh), so each -D value must be a single
# shell word: multi-token flags use CMake's ';' list separator, with no
# spaces or embedded quotes (cf. the arm / generic-vector jobs).
# +sme-f64f64 (FEAT_SME_F64F64) enables the double-precision GEMM kernel:
# GCC refuses to compile its fp64 FMOPA without it, and qemu's `max` CPU
# implements the extension, so the test jobs below exercise that kernel.
EIGEN_CI_ADDITIONAL_ARGS: >-
-DEIGEN_TEST_SME=ON
-DEIGEN_TEST_CUSTOM_CXX_FLAGS=-march=armv9.2-a+sme2+sme-f64f64
-DCMAKE_CROSSCOMPILING_EMULATOR=qemu-aarch64;-L;/usr/aarch64-linux-gnu
# SME ACLE (arm_sme.h, __arm_streaming, +sme2) requires GCC >= 14.
# The build stage only cross-compiles and never invokes the emulator, so
# no qemu here -- the test stage installs qemu-user.
EIGEN_CI_CROSS_INSTALL: g++-14-aarch64-linux-gnu
# product_symm/product_trsolve/product_trmm/product_syrk/product_mmtr/
# mixingtypes exercise the SME packers through their non-dense-GEMM consumers
# (selfadjoint, triangular-solve, triangular-product, rank-update,
# triangular-result product, mixed-scalar) that product_sme can't reach; each
# has double and complex subtests, so they cover all four SME scalar types.
# product_mmtr additionally covers tribb_kernel's lcm(mr, nr) block, which is
# only larger than mr for complex<float>. Explicit list, not `buildtests`:
# cross-building every test under the SME flags overruns the runner timeout.
EIGEN_CI_BUILD_TARGET: product_sme product_symm product_trsolve product_trmm product_syrk product_mmtr mixingtypes
# Inherit the 2xlarge runner from .build:linux:cross: GitLab's open-source
# program bills small and large runners the same, so don't downsize.
build:linux:cross:sme:gcc-14:default:
extends: .build:linux:cross:sme
variables:
EIGEN_CI_C_COMPILER: gcc-14
EIGEN_CI_CXX_COMPILER: g++-14
EIGEN_CI_CROSS_C_COMPILER: aarch64-linux-gnu-gcc-14
EIGEN_CI_CROSS_CXX_COMPILER: aarch64-linux-gnu-g++-14
# Full nightly SME coverage: compile the *entire* test suite (buildtests, both
# Official and Unsupported) under +sme2, not just the SME-relevant targets. This
# is what treats SME "as any other platform": it catches any compile breakage
# under the streaming-mode flags across the whole codebase -- e.g. the tensor-
# contraction packer path that only surfaces once TensorContraction is built
# with the SME backend active. Runs on the nightly schedule and on all-tests
# MRs via the inherited .rules:libeigen:all-tests; the per-SVL subset build
# above stays as the fast, cheap signal. Cross-building every test under the SME
# flags is slow -- the raised timeout is a starting estimate; tune it once a
# real run establishes the wall-clock (drop to BuildOfficial/BuildUnsupported
# split builds if a single job overruns).
build:linux:cross:sme:gcc-14:full:
extends: .build:linux:cross:sme
variables:
EIGEN_CI_C_COMPILER: gcc-14
EIGEN_CI_CXX_COMPILER: g++-14
EIGEN_CI_CROSS_C_COMPILER: aarch64-linux-gnu-gcc-14
EIGEN_CI_CROSS_CXX_COMPILER: aarch64-linux-gnu-g++-14
EIGEN_CI_BUILD_TARGET: buildtests
timeout: 2h
# FEAT_SME_F64F64 is optional, and every job above builds with it, so nothing
# else compiles the configuration where it is absent: the #else static_asserts
# that keep double and complex<double> off the GEMM driver, and both on the
# generic kernel inside an SME build. GCC hard-errors on the fp64 FMOPA without
# the feature, so this is also what catches an fp64 SME intrinsic escaping the
# EIGEN_VECTORIZE_SME_F64F64 gate. The EIGEN_ARM64_NO_SME_F64F64 opt-out reaches
# the same branch, so one job covers both ways in. product_sme alone: its double
# and complex<double> subtests are written to run in either configuration, and
# one target keeps the job cheap.
build:linux:cross:sme:gcc-14:no-f64f64:
extends: .build:linux:cross:sme
variables:
EIGEN_CI_C_COMPILER: gcc-14
EIGEN_CI_CXX_COMPILER: g++-14
EIGEN_CI_CROSS_C_COMPILER: aarch64-linux-gnu-gcc-14
EIGEN_CI_CROSS_CXX_COMPILER: aarch64-linux-gnu-g++-14
# The anchor's arguments, less +sme-f64f64.
EIGEN_CI_ADDITIONAL_ARGS: >-
-DEIGEN_TEST_SME=ON
-DEIGEN_TEST_CUSTOM_CXX_FLAGS=-march=armv9.2-a+sme2
-DCMAKE_CROSSCOMPILING_EMULATOR=qemu-aarch64;-L;/usr/aarch64-linux-gnu
EIGEN_CI_BUILD_TARGET: product_sme
build:linux:cross:aarch64:gcc-10:default:
extends: .build:linux:cross:aarch64
variables:
EIGEN_CI_C_COMPILER: gcc-10
EIGEN_CI_CXX_COMPILER: g++-10
EIGEN_CI_CROSS_INSTALL: g++-10-aarch64-linux-gnu
EIGEN_CI_CROSS_C_COMPILER: aarch64-linux-gnu-gcc-10
EIGEN_CI_CROSS_CXX_COMPILER: aarch64-linux-gnu-g++-10
build:linux:cross:aarch64:clang-14:default:
extends: .build:linux:cross:aarch64
variables:
EIGEN_CI_INSTALL: clang-14
EIGEN_CI_C_COMPILER: clang-14
EIGEN_CI_CXX_COMPILER: clang++-14
EIGEN_CI_CROSS_INSTALL: g++-10-aarch64-linux-gnu clang-14
######## SVE ###################################################################
# The SVE backend is selected only by -DEIGEN_ARM64_USE_SVE, so none of the
# aarch64 or SME jobs above compile a line of Eigen/src/Core/arch/SVE: the SME
# jobs deliberately take the NEON headers (Eigen/Core). These jobs are the only
# coverage it has.
#
# Eigen needs a compile-time vector length (EIGEN_ARM64_SVE_VL comes from
# __ARM_FEATURE_SVE_BITS, which only -msve-vector-bits sets), so each length is
# a separate build. That is also what makes the sweep worth having: the packet
# code has VL-dependent fold counts and transpose networks that a single length
# cannot exercise.
#
# No compiler here: common.linux.before_script.sh overwrites
# EIGEN_CI_CXX_COMPILER with EIGEN_CI_CROSS_CXX_COMPILER whenever host and
# target differ, so a cross compiler named in this anchor would override the one
# a job sets for itself. Left unset it defaults to the job's own choice
# (.common:linux:cross), which is what the clang job below needs.
.build:linux:cross:sve:
extends: .build:linux:cross
variables:
EIGEN_CI_TARGET_ARCH: aarch64-sve
EIGEN_CI_CROSS_TARGET_TRIPLE: aarch64-linux-gnu
# As for SME, the emulator here carries no -cpu: the test jobs select their
# vector length through qemu-user's QEMU_CPU instead.
#
# EIGEN_CI_ADDITIONAL_ARGS is expanded *unquoted* into the cmake command
# line (ci/scripts/build.linux.script.sh), so each -D value must be a single
# shell word: multi-token flags use CMake's ';' list separator.
#
# EIGEN_TEST_SVE_VL is spelled out per job rather than interpolated from a
# variable: a mis-expansion would silently fall back to the CMake default of
# 128 and every job in the sweep would build the same length while still
# passing.
#
# Keep the -march at armv8.2-a+sve, which is what the backend actually
# needs -- it uses only base SVE intrinsics. Do NOT "upgrade" it to +sve2:
# with SVE2 enabled, GCC 13 through 15 emit `whilewr p0.b, wzr, wzr` for the
# autovectorizer's alias checks, using 32-bit W registers where the
# instruction takes X registers, and the assembler rejects it. It reproduces
# at every vector length from 256 up (unsupported/test/tensor_block_eval.cpp
# is one trigger) and is a GCC bug, not an Eigen one; clang is unaffected.
EIGEN_CI_ADDITIONAL_ARGS: >-
-DEIGEN_TEST_SVE=ON
-DEIGEN_TEST_CUSTOM_CXX_FLAGS=-march=armv8.2-a+sve
-DCMAKE_CROSSCOMPILING_EMULATOR=qemu-aarch64;-L;/usr/aarch64-linux-gnu
# gcc-14 builds 128 bits and nothing wider. At -O3 with -msve-vector-bits=256 or
# above, gcc-14.2 miscompiles: redux_commutative<double> in test/redux.cpp sums
# a 16x16 block of a 17x17 matrix to 660 instead of 1022, deterministically.
# That is a compiler bug and not an Eigen one -- it reproduces with
# EIGEN_ARM64_USE_SVE unset, with GCC autovectorizing to fixed-length SVE while
# Eigen is on NEON -- and not an emulation artifact, since QEMU 8.2 and 10.0
# produce the same wrong value. It goes away at -O2, with
# -fno-tree-slp-vectorize, and at 128 bits.
.build:linux:cross:sve:gcc-14:
extends: .build:linux:cross:sve
variables:
EIGEN_CI_CROSS_INSTALL: g++-14-aarch64-linux-gnu
EIGEN_CI_C_COMPILER: gcc-14
EIGEN_CI_CXX_COMPILER: g++-14
EIGEN_CI_CROSS_C_COMPILER: aarch64-linux-gnu-gcc-14
EIGEN_CI_CROSS_CXX_COMPILER: aarch64-linux-gnu-g++-14
# Every width above 128, for the reason above: gcc-13.3 is clean at 128, 256 and
# 512. SVE ACLE needs only gcc-10, so nothing here depends on 14 the way SME's
# ACLE does. Revisit once the image carries a fixed gcc-14 or a gcc-15 aarch64
# cross.
.build:linux:cross:sve:gcc-13:
extends: .build:linux:cross:sve
variables:
EIGEN_CI_CROSS_INSTALL: g++-13-aarch64-linux-gnu
EIGEN_CI_C_COMPILER: gcc-13
EIGEN_CI_CXX_COMPILER: g++-13
EIGEN_CI_CROSS_C_COMPILER: aarch64-linux-gnu-gcc-13
EIGEN_CI_CROSS_CXX_COMPILER: aarch64-linux-gnu-g++-13
# One build per vector length that SVE hardware actually implements: 128 for
# Neoverse V2 and Grace, 256 for Neoverse V1 and Graviton3, 512 for A64FX. Each
# feeds a test job, so each builds the full suite. Lengths above 512 are
# architecturally legal but unimplemented, and compile-only coverage of them
# bought two latent compile fixes at the cost of running nothing -- if a wider
# part ships, add it here with a test job rather than as a build on its own.
build:linux:cross:sve:gcc-14:vl128:
extends: .build:linux:cross:sve:gcc-14
variables:
EIGEN_CI_ADDITIONAL_ARGS: >-
-DEIGEN_TEST_SVE=ON
-DEIGEN_TEST_SVE_VL=128
-DEIGEN_TEST_CUSTOM_CXX_FLAGS=-march=armv8.2-a+sve
-DCMAKE_CROSSCOMPILING_EMULATOR=qemu-aarch64;-L;/usr/aarch64-linux-gnu
build:linux:cross:sve:gcc-13:vl512:
extends: .build:linux:cross:sve:gcc-13
variables:
EIGEN_CI_ADDITIONAL_ARGS: >-
-DEIGEN_TEST_SVE=ON
-DEIGEN_TEST_SVE_VL=512
-DEIGEN_TEST_CUSTOM_CXX_FLAGS=-march=armv8.2-a+sve
-DCMAKE_CROSSCOMPILING_EMULATOR=qemu-aarch64;-L;/usr/aarch64-linux-gnu
build:linux:cross:sve:gcc-13:vl256:
extends: .build:linux:cross:sve:gcc-13
variables:
EIGEN_CI_ADDITIONAL_ARGS: >-
-DEIGEN_TEST_SVE=ON
-DEIGEN_TEST_SVE_VL=256
-DEIGEN_TEST_CUSTOM_CXX_FLAGS=-march=armv8.2-a+sve
-DCMAKE_CROSSCOMPILING_EMULATOR=qemu-aarch64;-L;/usr/aarch64-linux-gnu
# clang diagnoses different things here than GCC -- MR 2928 shipped three
# -Wsign-compare warnings that no job caught, and clang is stricter about
# fixed-length SVE vector types. It extends the compiler-free anchor so that
# EIGEN_CI_CROSS_CXX_COMPILER defaults to clang++-14 rather than a cross GCC;
# the cross g++ is still installed, for the aarch64 headers and libraries clang
# links against.
build:linux:cross:sve:clang-14:vl128:
extends: .build:linux:cross:sve
variables:
EIGEN_CI_INSTALL: clang-14
EIGEN_CI_C_COMPILER: clang-14
EIGEN_CI_CXX_COMPILER: clang++-14
EIGEN_CI_CROSS_INSTALL: g++-14-aarch64-linux-gnu clang-14
EIGEN_CI_ADDITIONAL_ARGS: >-
-DEIGEN_TEST_SVE=ON
-DEIGEN_TEST_SVE_VL=128
-DEIGEN_TEST_CUSTOM_CXX_FLAGS=-march=armv8.2-a+sve
-DCMAKE_CROSSCOMPILING_EMULATOR=qemu-aarch64;-L;/usr/aarch64-linux-gnu
EIGEN_CI_BUILD_TARGET: sve_vector_length packetmath vectorization_logic
######## ppc64le ###############################################################
.build:linux:cross:ppc64le:
extends: .build:linux:cross
variables:
EIGEN_CI_TARGET_ARCH: ppc64le
EIGEN_CI_CROSS_TARGET_TRIPLE: powerpc64le-linux-gnu
EIGEN_CI_ADDITIONAL_ARGS: >-
-DCMAKE_SYSTEM_NAME=Linux
-DCMAKE_CROSSCOMPILING_EMULATOR=qemu-ppc64le-static;-L;/usr/powerpc64le-linux-gnu
build:linux:cross:ppc64le:gcc-14:default:
extends: .build:linux:cross:ppc64le
variables:
EIGEN_CI_CROSS_INSTALL: g++-14-powerpc64le-linux-gnu qemu-user-static
EIGEN_CI_CROSS_C_COMPILER: powerpc64le-linux-gnu-gcc-14
EIGEN_CI_CROSS_CXX_COMPILER: powerpc64le-linux-gnu-g++-14
build:linux:cross:ppc64le:clang-16:default:
extends: .build:linux:cross:ppc64le
variables:
EIGEN_CI_C_COMPILER: clang-16
EIGEN_CI_CXX_COMPILER: clang++-16
EIGEN_CI_CROSS_INSTALL: g++-14-powerpc64le-linux-gnu clang-16 qemu-user-static
######## loongarch64 #################################################
.build:linux:cross:loongarch64:
extends: .build:linux:cross
variables:
EIGEN_CI_TARGET_ARCH: loongarch64
EIGEN_CI_CROSS_TARGET_TRIPLE: loongarch64-linux-gnu
# GCC-14 (minimum on Ubuntu 24)
build:linux:cross:loongarch64:gcc-14:default:
extends: .build:linux:cross:loongarch64
variables:
EIGEN_CI_CROSS_INSTALL: g++-14-loongarch64-linux-gnu qemu-user-static
EIGEN_CI_CROSS_C_COMPILER: loongarch64-linux-gnu-gcc-14
EIGEN_CI_CROSS_CXX_COMPILER: loongarch64-linux-gnu-g++-14
EIGEN_CI_ADDITIONAL_ARGS: >-
-DCMAKE_SYSTEM_NAME=Linux
-DCMAKE_CROSSCOMPILING_EMULATOR=qemu-loongarch64-static;-L;/usr/loongarch64-linux-gnu
-DEIGEN_TEST_LSX=on
######## riscv64 ###############################################################
# Builds cross-compile on amd64; tests run natively on the riscv runner
# (SpacemiT K3, RVA23, RVV 1.0, VLEN=256). Jobs are allowed to fail while
# the runner is being brought up.
# Eigen's RVV backend requires a compile-time-fixed vector length, so pin it to
# the runner's 256-bit VLEN with zvl256b and -mrvv-vector-bits=zvl (gcc-15 rejects
# a numeric -mrvv-vector-bits=256, accepting only "zvl"/"scalable"; "zvl" takes the
# length from the Zvl*b march extension). Zvfh enables half-precision
# vectorization. Set here so every riscv64 build below -- full builds and smoke
# tests, gcc and clang -- is actually vectorized.
.build:linux:riscv64:
extends: .build:linux:cross
# Cross-compiles to riscv64 on an amd64 runner using the prebuilt image, which
# carries the riscv64 cross toolchain (g++-15-riscv64-linux-gnu / clang-21)
# plus cmake/ninja/git -- so apt is skipped entirely.
image: ${EIGEN_CI_IMAGE_LINUX_RISCV64_SMOKETEST_BUILD}
variables:
EIGEN_CI_TARGET_ARCH: riscv64
EIGEN_CI_SKIP_APT: "true"
EIGEN_CI_CROSS_TARGET_TRIPLE: riscv64-linux-gnu
EIGEN_CI_ADDITIONAL_ARGS: >-
-DEIGEN_TEST_CUSTOM_CXX_FLAGS=-march=rv64gc_v_zvl256b_zfh_zvfh;-mrvv-vector-bits=zvl;-DEIGEN_RISCV64_USE_RVV10
allow_failure: true
build:linux:riscv64:gcc-15:default:
extends: .build:linux:riscv64
variables:
EIGEN_CI_C_COMPILER: gcc-15
EIGEN_CI_CXX_COMPILER: g++-15
EIGEN_CI_CROSS_INSTALL: g++-15-riscv64-linux-gnu
EIGEN_CI_CROSS_C_COMPILER: riscv64-linux-gnu-gcc-15
EIGEN_CI_CROSS_CXX_COMPILER: riscv64-linux-gnu-g++-15
# Zvfbfmin+Zvfbfwma additionally enable the bfloat16 packets
# (PacketMathBF16.h), which are otherwise never compiled by CI. gcc-only:
# clang 21 crashes mangling any function signature containing a
# fixed-length (riscv_rvv_vector_bits) RVV bfloat16 vector type; fixed in
# clang 22.
EIGEN_CI_ADDITIONAL_ARGS: >-
-DEIGEN_TEST_CUSTOM_CXX_FLAGS=-march=rv64gc_v_zvl256b_zfh_zvfh_zvfbfmin_zvfbfwma;-mrvv-vector-bits=zvl;-DEIGEN_RISCV64_USE_RVV10
build:linux:riscv64:clang-21:default:
extends: .build:linux:riscv64
variables:
EIGEN_CI_INSTALL: clang-21
EIGEN_CI_C_COMPILER: clang-21
EIGEN_CI_CXX_COMPILER: clang++-21
EIGEN_CI_CROSS_INSTALL: g++-15-riscv64-linux-gnu clang-21
# Namespace-guarded, unlike the other smoke builds: their consumers are the
# riscv64 smoke tests, which need a self-hosted runner no fork has. See
# test.linux.gitlab-ci.yml.
build:linux:riscv64:gcc-15:default:smoketest:
extends: build:linux:riscv64:gcc-15:default
variables:
EIGEN_CI_BUILD_TARGET: buildsmoketests
rules: !reference [.rules:libeigen:smoketest:upstream-runner, rules]
tags:
- saas-linux-large-amd64
build:linux:riscv64:clang-21:default:smoketest:
extends: build:linux:riscv64:clang-21:default
variables:
EIGEN_CI_BUILD_TARGET: buildsmoketests
rules: !reference [.rules:libeigen:smoketest:upstream-runner, rules]
tags:
- saas-linux-large-amd64
######## MR Smoke Tests ########################################################
# aarch64 targets are cross-compiled via g++-10-aarch64-linux-gnu / clang-14.
# Tests run on their respective native runners (see test.linux.gitlab-ci.yml).
build:linux:cross:x86-64:gcc-10:default:smoketest:
extends: build:linux:cross:x86-64:gcc-10:default
image: ${EIGEN_CI_IMAGE_LINUX_AMD64_SMOKETEST_BUILD}
variables:
EIGEN_CI_SKIP_APT: "true"
EIGEN_CI_BUILD_TARGET: buildsmoketests
rules: !reference [.rules:libeigen:smoketest, rules]
tags:
- saas-linux-large-amd64
build:linux:cross:x86-64:clang-14:default:smoketest:
extends: build:linux:cross:x86-64:clang-14:default
image: ${EIGEN_CI_IMAGE_LINUX_AMD64_SMOKETEST_BUILD}
variables:
EIGEN_CI_SKIP_APT: "true"
EIGEN_CI_BUILD_TARGET: buildsmoketests
rules: !reference [.rules:libeigen:smoketest, rules]
tags:
- saas-linux-large-amd64
build:linux:aarch64:gcc-10:default:smoketest:
extends: build:linux:cross:aarch64:gcc-10:default
image: ${EIGEN_CI_IMAGE_LINUX_AMD64_SMOKETEST_BUILD}
variables:
EIGEN_CI_SKIP_APT: "true"
EIGEN_CI_BUILD_TARGET: buildsmoketests
rules: !reference [.rules:libeigen:smoketest, rules]
tags:
- saas-linux-large-amd64
build:linux:aarch64:clang-14:default:smoketest:
extends: build:linux:cross:aarch64:clang-14:default
image: ${EIGEN_CI_IMAGE_LINUX_AMD64_SMOKETEST_BUILD}
variables:
EIGEN_CI_SKIP_APT: "true"
EIGEN_CI_BUILD_TARGET: buildsmoketests
rules: !reference [.rules:libeigen:smoketest, rules]
tags:
- saas-linux-large-amd64
######## MR Affected Tests #####################################################
# Opt-in via the `affected-tests` label: build every test the merge request diff
# can reach. The target list comes from the select:tests job; see
# scripts/affected_tests.py.
#
# The four jobs below always run under the label; the rest are gated on the
# platform they target. Trigger rules are shared with the paired test jobs; see
# .rules:libeigen:affected-tests:* in ci/common.gitlab-ci.yml, and .agents/ci.md
# for which label selects what and how this tier relates to the smoke matrix it
# suppresses.
#
# Every job here names its parent's ccache pool (EIGEN_CI_CCACHE_POOL): the
# selection is a subset of the parent's targets compiled with the same flags,
# so it hits in, and feeds, the pool the parent's full builds fill. Under the
# default `$CI_JOB_NAME_SLUG` pool it would have an `-affected` pool of its own
# that no full build ever warms.
##### Always, under the label ##################################################
build:linux:cross:x86-64:gcc-10:avx2:affected:
extends: [ build:linux:cross:x86-64:gcc-10:avx2, .affected:build ]
variables:
EIGEN_CI_CCACHE_POOL: build-linux-cross-x86-64-gcc-10-avx2
rules: !reference [.rules:libeigen:affected-tests, rules]
build:linux:cross:x86-64:clang-14:default:affected:
extends: [ build:linux:cross:x86-64:clang-14:default, .affected:build ]
variables:
EIGEN_CI_CCACHE_POOL: build-linux-cross-x86-64-clang-14-default
rules: !reference [.rules:libeigen:affected-tests, rules]
build:linux:cross:aarch64:gcc-10:default:affected:
extends: [ build:linux:cross:aarch64:gcc-10:default, .affected:build ]
variables:
EIGEN_CI_CCACHE_POOL: build-linux-cross-aarch64-gcc-10-default
rules: !reference [.rules:libeigen:affected-tests, rules]
build:linux:cross:aarch64:clang-14:default:affected:
extends: [ build:linux:cross:aarch64:clang-14:default, .affected:build ]
variables:
EIGEN_CI_CCACHE_POOL: build-linux-cross-aarch64-clang-14-default
rules: !reference [.rules:libeigen:affected-tests, rules]
##### Platform-triggered #######################################################
build:linux:cross:x86-64:gcc-10:default:affected:
extends: [ build:linux:cross:x86-64:gcc-10:default, .affected:build ]
variables:
EIGEN_CI_CCACHE_POOL: build-linux-cross-x86-64-gcc-10-default
rules: !reference [.rules:libeigen:affected-tests:sse, rules]
build:linux:cross:x86-64:gcc-10:avx:affected:
extends: [ build:linux:cross:x86-64:gcc-10:avx, .affected:build ]
variables:
EIGEN_CI_CCACHE_POOL: build-linux-cross-x86-64-gcc-10-avx
rules: !reference [.rules:libeigen:affected-tests:avx, rules]
build:linux:cross:x86-64:gcc-10:avx512dq:affected:
extends: [ build:linux:cross:x86-64:gcc-10:avx512dq, .affected:build ]
variables:
EIGEN_CI_CCACHE_POOL: build-linux-cross-x86-64-gcc-10-avx512dq
rules: !reference [.rules:libeigen:affected-tests:avx512, rules]
# The FP16 builds reuse the existing split compile-only jobs; there is no runner
# with AVX512-FP16 hardware for a paired test job.
build:linux:cross:x86-64:gcc-13:avx512fp16:official:affected:
extends: build:linux:cross:x86-64:gcc-13:avx512fp16:official
variables:
EIGEN_CI_CCACHE_POOL: build-linux-cross-x86-64-gcc-13-avx512fp16-official
rules: !reference [.rules:libeigen:affected-tests:avx512fp16, rules]
build:linux:cross:x86-64:gcc-13:avx512fp16:unsupported:affected:
extends: build:linux:cross:x86-64:gcc-13:avx512fp16:unsupported
variables:
EIGEN_CI_CCACHE_POOL: build-linux-cross-x86-64-gcc-13-avx512fp16-unsupported
rules: !reference [.rules:libeigen:affected-tests:avx512fp16, rules]
# 32-bit arm: a distinct NEON code path from the aarch64 job above.
build:linux:cross:arm:gcc-10:default:affected:
extends: [ build:linux:cross:arm:gcc-10:default, .affected:build ]
variables:
EIGEN_CI_CCACHE_POOL: build-linux-cross-arm-gcc-10-default
rules: !reference [.rules:libeigen:affected-tests:neon, rules]
build:linux:cross:ppc64le:gcc-14:default:affected:
extends: [ build:linux:cross:ppc64le:gcc-14:default, .affected:build ]
variables:
EIGEN_CI_CCACHE_POOL: build-linux-cross-ppc64le-gcc-14-default
rules: !reference [.rules:libeigen:affected-tests:altivec, rules]
build:linux:cross:loongarch64:gcc-14:default:affected:
extends: [ build:linux:cross:loongarch64:gcc-14:default, .affected:build ]
variables:
EIGEN_CI_CCACHE_POOL: build-linux-cross-loongarch64-gcc-14-default
rules: !reference [.rules:libeigen:affected-tests:lsx, rules]
build:linux:riscv64:gcc-15:default:affected:
extends: [ build:linux:riscv64:gcc-15:default, .affected:build ]
variables:
EIGEN_CI_CCACHE_POOL: build-linux-riscv64-gcc-15-default
rules: !reference [.rules:libeigen:affected-tests:rvv10, rules]
# SME gets compile coverage of the whole suite under the streaming-mode flags
# rather than a selection: the per-SVL test jobs run a curated target subset
# through EIGEN_CI_CTEST_REGEX, which a selection would conflict with.
build:linux:cross:sme:gcc-14:full:affected:
extends: build:linux:cross:sme:gcc-14:full
variables:
EIGEN_CI_CCACHE_POOL: build-linux-cross-sme-gcc-14-full
rules: !reference [.rules:libeigen:affected-tests:sme, rules]
# One product_sme build, so a change to the gate is caught by the affected tier
# rather than only by the nightly run.
build:linux:cross:sme:gcc-14:no-f64f64:affected:
extends: build:linux:cross:sme:gcc-14:no-f64f64
variables:
EIGEN_CI_CCACHE_POOL: build-linux-cross-sme-gcc-14-no-f64f64
rules: !reference [.rules:libeigen:affected-tests:sme, rules]
# The VL sweep is the point of the affected tier for SVE: a change to the packet
# code is exactly what breaks at one vector length and not another.
build:linux:cross:sve:gcc-14:vl128:affected:
extends: build:linux:cross:sve:gcc-14:vl128
variables:
EIGEN_CI_CCACHE_POOL: build-linux-cross-sve-gcc-14-vl128
rules: !reference [.rules:libeigen:affected-tests:sve, rules]
build:linux:cross:sve:gcc-13:vl512:affected:
extends: build:linux:cross:sve:gcc-13:vl512
variables:
EIGEN_CI_CCACHE_POOL: build-linux-cross-sve-gcc-13-vl512
rules: !reference [.rules:libeigen:affected-tests:sve, rules]
build:linux:cross:sve:gcc-13:vl256:affected:
extends: build:linux:cross:sve:gcc-13:vl256
variables:
EIGEN_CI_CCACHE_POOL: build-linux-cross-sve-gcc-13-vl256
rules: !reference [.rules:libeigen:affected-tests:sve, rules]