Files
eigen/ci/build.linux.gitlab-ci.yml
2026-08-21 19:27:36 -07:00

764 lines
32 KiB
YAML

# 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
stage: build
variables:
EIGEN_CI_BUILD_TARGET: buildtests
EIGEN_CI_SKIP_APT: "false"
# "off" disables the ccache compiler launchers (see build.linux.script.sh);
# used where the compiler is unsupported by ccache (nvc++) or a cache does
# not survive the image (ROCm). 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"
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 job name (GitLab still keeps protected refs' caches separate
# from unprotected ones).
cache:
key: "$CI_JOB_NAME_SLUG-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
# The build-directory cache was disabled here because its upload took ~35
# minutes; the ccache directory is bounded by CCACHE_MAXSIZE, so this job
# can cache again.
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.
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
# nvc++ is not a compiler ccache supports; no cache to populate.
cache: []
variables:
EIGEN_CI_CCACHE: "off"
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"
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).
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_75;sm_90 ----------------------
# sm_75 (T4) coverage comes from every job; sm_90 only from newer CUDA.
# 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: "75;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: "75;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]
cache: [] # Disable cache for ROCm, since it fails whenever the image updates.
######## 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/mixingtypes exercise
# the SME packers through their non-dense-GEMM consumers (selfadjoint,
# triangular-solve, triangular-product, rank-update, mixed-scalar) that
# product_sme can't reach; each has double subtests, so they cover both SME
# scalar types. 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 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_assert
# that keeps double off the GEMM driver, and double 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
# subtest is 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
######## 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
build:linux:riscv64:gcc-15:default:smoketest:
extends: build:linux:riscv64:gcc-15:default
variables:
EIGEN_CI_BUILD_TARGET: buildsmoketests
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
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:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
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:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
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:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
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:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
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:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
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.
#
# Two jobs always run under the label and give generic coverage. The rest are
# gated on the backend they compile, so a backend change also builds on the ISA
# it targets -- coverage the default smoke matrix has no job for at all, since
# every smoke build is at baseline ISA. The trigger rules are shared with the
# paired test jobs; see .rules:libeigen:affected-tests:* in
# ci/common.gitlab-ci.yml.
.affected:build:
needs: [ select:tests ]
variables:
EIGEN_CI_BUILD_TARGET_FILE: affected/targets.txt
##### Always, under the label ##################################################
build:linux:cross:x86-64:gcc-10:avx2:affected:
extends: [ build:linux:cross:x86-64:gcc-10:avx2, .affected:build ]
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 ]
rules: !reference [.rules:libeigen:affected-tests, rules]
##### Backend-triggered ########################################################
build:linux:cross:x86-64:gcc-10:default:affected:
extends: [ build:linux:cross:x86-64:gcc-10:default, .affected:build ]
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 ]
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 ]
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
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
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 ]
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 ]
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 ]
rules: !reference [.rules:libeigen:affected-tests:lsx, rules]
build:linux:riscv64:gcc-15:default:affected:
extends: [ build:linux:riscv64:gcc-15:default, .affected:build ]
rules: !reference [.rules:libeigen:affected-tests:rvv10, rules]
# SVE and SME get 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
rules: !reference [.rules:libeigen:affected-tests:sve-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
rules: !reference [.rules:libeigen:affected-tests:sve-sme, rules]