| # 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" | |
| # The ccache pool's cache:policy. An affected build takes select:tests' | |
| # value instead (a dotenv variable outranks a job variable): `push` for a | |
| # NONE selection, which compiles nothing and so skips the download. | |
| EIGEN_CI_CCACHE_POLICY: pull-push | |
| EIGEN_CI_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. | |
| EIGEN_CI_CCACHE_MAXSIZE: 4G | |
| EIGEN_CI_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. | |
| EIGEN_CI_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. | |
| # | |
| # Restoring a cache replaces .ccache/ rather than merging into it, so an | |
| # unscoped pool is last-writer-wins: merge requests on different bases | |
| # overwrite each other's objects. Job 16273375875 restored a full 4 GB pool | |
| # and still missed 1431 of 1436 compiles, with no direct-mode hits at all. | |
| # EIGEN_CI_CCACHE_SCOPE gives each merge request its own pool; the fallback | |
| # key is the shared pool the default-branch builds fill, which is what a | |
| # first build draws on. | |
| # | |
| # GitLab splits every pool by a suffix -- `-protected` for a pipeline on a | |
| # protected ref or started by a Maintainer or Owner, `-non_protected` | |
| # otherwise -- and appends the same suffix to the fallback key. A | |
| # Developer-started merge request pipeline therefore cannot read the pool the | |
| # scheduled builds fill; a maintainer starting that pipeline can. | |
| cache: | |
| # Dedicated small cache for pinned tool binaries (sccache, ccache); shared across | |
| # all build jobs so runners download the static binary once. | |
| - key: "linux-ccache-bin" | |
| paths: | |
| - .ccache-bin/ | |
| - .sccache-bin/ | |
| when: always | |
| # Compiler object cache pool holding .ccache/ and .sccache/. | |
| - key: "$EIGEN_CI_CCACHE_POOL$EIGEN_CI_CCACHE_SCOPE-ccache" | |
| fallback_keys: | |
| - "$EIGEN_CI_CCACHE_POOL-ccache" | |
| paths: | |
| - .ccache/ | |
| - .sccache/ | |
| policy: $EIGEN_CI_CCACHE_POLICY | |
| # 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. | |
| 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" | |
| # 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" | |
| # AVX512-FP16 builds are split into official/contrib because building all | |
| # tests exceeds the 3-hour GitLab SaaS shared-runner timeout. Clang, because | |
| # GCC 12.1-14.3 and 15.1-15.2 emit a zero-masked vmovsh store for _Float16 | |
| # selects (see EIGEN_TEST_AVX512FP16 in CMakeLists.txt). Clang 18 crashes in | |
| # its backend on packetmath, array_cwise, matrix_cwise and half_float here. | |
| .build:linux:cross:x86-64:clang-19:avx512fp16: | |
| 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: "-DEIGEN_TEST_AVX512FP16=on -DEIGEN_TEST_AVX512DQ=on -DEIGEN_TEST_F16C=on" | |
| build:linux:cross:x86-64:clang-19:avx512fp16:official: | |
| extends: .build:linux:cross:x86-64:clang-19:avx512fp16 | |
| variables: | |
| EIGEN_CI_BUILD_TARGET: BuildOfficial | |
| build:linux:cross:x86-64:clang-19:avx512fp16:contrib: | |
| extends: .build:linux:cross:x86-64:clang-19:avx512fp16 | |
| variables: | |
| EIGEN_CI_BUILD_TARGET: BuildContrib | |
| # 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: | |
| - !reference [.rules:libeigen:gpu-schedule-guard, 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: | |
| - !reference [.rules:libeigen:gpu-schedule-guard, 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/" | |
| # Stands alone and leaves the test tier unchanged, so it composes with the | |
| # smoke and affected tiers. | |
| - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_PROJECT_NAMESPACE == "libeigen" && $CI_MERGE_REQUEST_LABELS =~ "/docs-build/" | |
| ######## Sanitizers ############################################################ | |
| # ASAN/UBSAN builds are split into official/contrib 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:contrib: | |
| extends: .build:linux:cross:x86-64:clang-19:default:asan-ubsan | |
| variables: | |
| EIGEN_CI_BUILD_TARGET: BuildContrib | |
| ######## 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/contrib 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: "" | |
| # Override CMake's NVHPC -fast default at both compilation and linking. | |
| EIGEN_CI_ADDITIONAL_ARGS: >- | |
| -DEIGEN_TEST_CUSTOM_CXX_FLAGS=-Kieee | |
| -DEIGEN_TEST_CUSTOM_LINKER_FLAGS=-Kieee | |
| # 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, web pipelines and the `nvhpc-tests` label, 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 few merge requests are likely to break in | |
| # isolation. Label a merge request that touches something nvc++ is known to | |
| # be fussy about rather than waiting for the scheduled run to find it; a web | |
| # pipeline is no substitute, since it cannot run a fork's branch. | |
| rules: !reference [.rules:libeigen:nvhpc, rules] | |
| # Both builds have failed in every scheduled pipeline since at least | |
| # 2026-09-13: at -j16 nvc++ runs the runner out of memory and ninja then | |
| # stalls for hours, while at a -j low enough to avoid that the official build | |
| # cannot fit its 719 targets in the 3 h limit. Report them as warnings until | |
| # the build fits. | |
| allow_failure: true | |
| 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:contrib: | |
| extends: .build:linux:x86-64:nvhpc-26.1 | |
| variables: | |
| EIGEN_CI_BUILD_TARGET: BuildContrib | |
| ######## 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 reach the launcher through CMAKE_CUDA_COMPILER_LAUNCHER, | |
| # which ei_gpu_testing_enable() copies from CMAKE_CXX_COMPILER_LAUNCHER. 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: "" | |
| # Default architecture coverage spans the minimum supported architecture | |
| # (sm_60) and the GPUs used by CI: GitLab's SaaS runners are Tesla T4 | |
| # (sm_75), and eigen-gpu-testing-001.gcloud is an L4 (sm_89). Jobs tied to | |
| # one runner pool may override this set below. | |
| EIGEN_CI_CUDA_COMPUTE_ARCH: "60;75;89" | |
| 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.8 + oldest supported compilers --------------------------------- | |
| # 11.8 is the oldest toolkit that knows sm_89, so gcc can cover the default | |
| # T4/L4 architecture set. CUDA 11.x images are Ubuntu 20.04 only, which lacks | |
| # clang-14 and cmake >= 3.17; the before_scripts add the Kitware and LLVM apt | |
| # repos. | |
| build:linux:cuda-11.8:gcc-10: | |
| extends: .build:linux:cuda | |
| image: nvidia/cuda:11.8.0-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.8:clang-14: | |
| extends: build:linux:cuda-11.8: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" | |
| # clang-14 predates sm_89 (LLVM 16 added it), so this pair targets sm_75. | |
| # The 11.8 toolkit is newer than clang-14 knows; it treats it as 11.5, | |
| # which is what the suppressed warning says. | |
| EIGEN_CI_CUDA_COMPUTE_ARCH: "75" | |
| EIGEN_CI_CUDA_CXX_FLAGS: "-Wno-unknown-cuda-version" | |
| # ---- Latest CUDA + newest compilers, sm_89;sm_90 --------------------------- | |
| # These jobs run natively on the L4 at sm_89 and retain compile-only 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" | |
| # ---- CUDA 13 ---------------------------------------------------------------- | |
| # CUDA 13 dropped offline compilation for sm_70, relocated the CCCL headers and | |
| # ships an nvcc that rejects code every 12.x toolkit accepted (issue #3139 was | |
| # found on a laptop because no job here compiled with it). This pair runs on | |
| # the L4 at sm_89, built through CMake's CUDA language like the other Linux | |
| # CUDA jobs. | |
| # GCC-13, CUDA-13.3 (nvcc) | |
| build:linux:cuda-13.3:gcc-13: | |
| extends: .build:linux:cuda | |
| image: nvidia/cuda:13.3.1-devel-ubuntu24.04 | |
| variables: | |
| EIGEN_CI_C_COMPILER: gcc-13 | |
| EIGEN_CI_CXX_COMPILER: g++-13 | |
| EIGEN_CI_CUDA_COMPUTE_ARCH: "89" | |
| ######### 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 | |
| # HIP Clang reports each `#pragma unroll` loop in TensorConvolution.h whose | |
| # trip count is not constant ("loop not unrolled") once per kernel | |
| # instantiation: over half of this job's log, which overran GitLab's 4 MB | |
| # log limit and so cut off the end of the build. | |
| EIGEN_CI_ADDITIONAL_ARGS: -DEIGEN_TEST_HIP=on -DCMAKE_HIP_FLAGS=-Wno-pass-failed | |
| 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 ############################################################### | |
| # Cross-compiled on amd64, as the smoke tier has always built it; the paired | |
| # test jobs run the artifact on a native arm64 runner. On the arm64 pool host | |
| # and target match, so common.linux.before_script.sh picks the native compiler | |
| # and the build gets the 8 vCPU that pool tops out at rather than 32. The | |
| # open-source cost factor is flat per minute rather than per runner size, so | |
| # that was also the dearer runner: 102-115 min for a full-suite build against | |
| # 20-34 for the same selection on the x86-64 jobs over 2026-09. | |
| .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-2xlarge-amd64 | |
| ######## 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. | |
| # The -march goes in CMAKE_CXX_FLAGS, not EIGEN_TEST_CUSTOM_CXX_FLAGS: | |
| # EIGEN_TEST_SME adds -DEIGEN_ARM64_USE_SME to CMAKE_CXX_FLAGS, so every | |
| # target needs the SME2 -march, not only those ei_add_test registers -- | |
| # e.g. blas_ilp64 and the ILP64 BLAS library it links. | |
| EIGEN_CI_ADDITIONAL_ARGS: >- | |
| -DEIGEN_TEST_SME=ON | |
| -DCMAKE_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 Contrib) 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. A cold build takes 31-63 min on the | |
| # hosted 2xlarge runners but 95-96 min on the 16-vCPU group runner, where one | |
| # run hit the former 2h limit (job 16054590852); 3h is the hosted runners' | |
| # ceiling. Split into BuildOfficial/BuildContrib builds if that 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: 3h | |
| # 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 | |
| -DCMAKE_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 (contrib/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 | |
| # One compiler for all three widths. gcc-14 is not usable above 128 bits: at -O3 | |
| # with -msve-vector-bits=256 or above, gcc-14.2 miscompiles | |
| # redux_commutative<double> in test/redux.cpp, summing 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. | |
| # | |
| # gcc-13.3 is clean at 128, 256 and 512, and SVE ACLE needs only gcc-10, so | |
| # nothing here depends on 14 the way SME's ACLE does. Naming one compiler is | |
| # what lets the test jobs install the compiler their artifacts were built with, | |
| # which the failtest and buildsystem tests require -- see .test:linux:sve. | |
| .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. | |
| # 128-bit SVE matches native ARMv9 hardware (Neoverse V2 / Axion) and runs natively | |
| # on our ARM runner without QEMU emulation. | |
| build:linux:cross:sve:gcc-13:vl128: | |
| extends: .build:linux:cross:sve:gcc-13 | |
| variables: | |
| EIGEN_CI_ADDITIONAL_ARGS: >- | |
| -DEIGEN_TEST_SVE=ON | |
| -DEIGEN_TEST_SVE_VL=128 | |
| -DEIGEN_TEST_CUSTOM_CXX_FLAGS=-march=armv8.2-a+sve | |
| 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++-13-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, .smoketest:build ] | |
| 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, .smoketest:build ] | |
| 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, .smoketest:build ] | |
| 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-medium-amd64 | |
| build:linux:cross:x86-64:clang-14:default:smoketest: | |
| extends: [ build:linux:cross:x86-64:clang-14:default, .smoketest:build ] | |
| 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-medium-amd64 | |
| build:linux:aarch64:gcc-10:default:smoketest: | |
| extends: [ build:linux:cross:aarch64:gcc-10:default, .smoketest:build ] | |
| 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-medium-amd64 | |
| build:linux:aarch64:clang-14:default:smoketest: | |
| extends: [ build:linux:cross:aarch64:clang-14:default, .smoketest:build ] | |
| 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-medium-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:clang-19:avx512fp16:official:affected: | |
| extends: build:linux:cross:x86-64:clang-19:avx512fp16:official | |
| variables: | |
| EIGEN_CI_CCACHE_POOL: build-linux-cross-x86-64-clang-19-avx512fp16-official | |
| rules: !reference [.rules:libeigen:affected-tests:avx512fp16, rules] | |
| build:linux:cross:x86-64:clang-19:avx512fp16:contrib:affected: | |
| extends: build:linux:cross:x86-64:clang-19:avx512fp16:contrib | |
| variables: | |
| EIGEN_CI_CCACHE_POOL: build-linux-cross-x86-64-clang-19-avx512fp16-contrib | |
| 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-13:vl128:affected: | |
| extends: [ build:linux:cross:sve:gcc-13:vl128, .affected:build ] | |
| variables: | |
| EIGEN_CI_CCACHE_POOL: build-linux-cross-sve-gcc-13-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, .affected:build ] | |
| 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, .affected:build ] | |
| variables: | |
| EIGEN_CI_CCACHE_POOL: build-linux-cross-sve-gcc-13-vl256 | |
| rules: !reference [.rules:libeigen:affected-tests:sve, rules] |