| # 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] |