# Base configuration for linux cross-compilation.
.build:linux:cross:
  needs: []
  extends: .common:linux:cross
  stage: build
  variables:
    EIGEN_CI_BUILD_TARGET: buildtests
  script:
    - . ci/scripts/build.linux.script.sh
  tags:
    - saas-linux-2xlarge-amd64
  rules:
    - if: $CI_PIPELINE_SOURCE == "schedule" && $CI_PROJECT_NAMESPACE == "libeigen"
    - 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/"
  cache:
    key: "$CI_JOB_NAME_SLUG-$CI_COMMIT_REF_SLUG-BUILD"
    paths:
      - ${EIGEN_CI_BUILDDIR}/

######## 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-6 (minimum on Ubuntu 18.04)
build:linux:cross:x86-64:gcc-6:default:
  extends: .build:linux:cross:x86-64
  image: ubuntu:18.04
  variables:
    EIGEN_CI_C_COMPILER: gcc-6
    EIGEN_CI_CXX_COMPILER: g++-6
    EIGEN_CI_CROSS_INSTALL: g++-6-x86-64-linux-gnu
    EIGEN_CI_CROSS_C_COMPILER: x86_64-linux-gnu-gcc-6
    EIGEN_CI_CROSS_CXX_COMPILER: x86_64-linux-gnu-g++-6

# 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

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-6 (minimum on Ubuntu 20.04)
build:linux:cross:x86-64:clang-6:default:
  extends: .build:linux:cross:x86-64
  image: ubuntu:20.04
  variables:
    EIGEN_CI_INSTALL: g++-8 clang-6.0 lld-6.0
    EIGEN_CI_C_COMPILER: clang-6.0
    EIGEN_CI_CXX_COMPILER: clang++-6.0
    EIGEN_CI_CROSS_INSTALL: g++-8-x86-64-linux-gnu clang-6.0 lld-6.0
    EIGEN_CI_ADDITIONAL_ARGS: -DCMAKE_EXE_LINKER_FLAGS=-fuse-ld=lld-6.0

# Clang-12 (stable recent version)
build:linux:cross:x86-64:clang-12:default:
  extends: .build:linux:cross:x86-64
  variables:
    EIGEN_CI_INSTALL: clang-12
    EIGEN_CI_C_COMPILER: clang-12
    EIGEN_CI_CXX_COMPILER: clang++-12
    EIGEN_CI_CROSS_INSTALL: g++-10-x86-64-linux-gnu clang-12

build:linux:cross:x86-64:clang-12:avx:
  extends: build:linux:cross:x86-64:clang-12:default
  variables:
    EIGEN_CI_ADDITIONAL_ARGS: "-DEIGEN_TEST_AVX=on"

build:linux:cross:x86-64:clang-12:avx2:
  extends: build:linux:cross:x86-64:clang-12:default
  variables:
    EIGEN_CI_ADDITIONAL_ARGS: "-DEIGEN_TEST_AVX2=on"

build:linux:cross:x86-64:clang-12:avx512dq:
  extends: build:linux:cross:x86-64:clang-12:default
  variables:
    EIGEN_CI_ADDITIONAL_ARGS: "-DEIGEN_TEST_AVX512DQ=on"

# Generic vector extension backend.
build:linux:cross:x86-64:clang-19:generic:avx512dq:
  image: ubuntu:24.04
  extends: build:linux:cross:x86-64:clang-12: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

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"
  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 (Disabled because ASAN hangs and MSAN requires instrumented libc++)
# build:linux:cross:x86-64:clang-12:default:asan:
#   extends: build:linux:cross:x86-64:clang-12:default
#   variables:
#     EIGEN_CI_ADDITIONAL_ARGS:
#       -DEIGEN_TEST_CUSTOM_CXX_FLAGS=-fsanitize=address,undefined
#       -DEIGEN_TEST_CUSTOM_LINKER_FLAGS=-fsanitize=address,undefined

# build:linux:cross:x86-64:clang-12:default:msan:
#   extends: build:linux:cross:x86-64:clang-12:default
#   variables:
#     EIGEN_CI_ADDITIONAL_ARGS:
#       -DEIGEN_TEST_CUSTOM_CXX_FLAGS=-fsanitize=memory
#       -DEIGEN_TEST_CUSTOM_LINKER_FLAGS=-fsanitize=memory

######## CUDA ##################################################################

.build:linux:cuda:
  extends: .build:linux:cross:x86-64
  variables:
    # Additional flags passed to the cuda compiler.
    EIGEN_CI_CUDA_CXX_FLAGS: ""
    # Compute architectures present in the GitLab CI runners.
    EIGEN_CI_CUDA_COMPUTE_ARCH: "50;75"
    EIGEN_CI_BUILD_TARGET: buildtests_gpu
    EIGEN_CI_TEST_CUDA_CLANG: "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}
  tags:
    # Build on regular linux to limit GPU cost.
    - saas-linux-2xlarge-amd64

# GCC-10, CUDA-12.2
build:linux:cuda-12.2:gcc-10:
  extends: .build:linux:cuda
  image: nvidia/cuda:12.2.0-devel-ubuntu20.04
  variables:
    EIGEN_CI_C_COMPILER: gcc-10
    EIGEN_CI_CXX_COMPILER: g++-10

# Clang-12, CUDA-12.2
build:linux:cuda-12.2:clang-12:
  extends: build:linux:cuda-12.2:gcc-10
  variables:
    EIGEN_CI_C_COMPILER: clang-12
    EIGEN_CI_CXX_COMPILER: clang++-12
    EIGEN_CI_TEST_CUDA_CLANG: "on"

######### HIP ##################################################################
# Note: these are currently build-only, until we get an AMD-supported runner.

# ROCm HIP
build:linux:rocm-latest:gcc-10:
  extends: .build:linux:cross
  image: rocm/dev-ubuntu-24.04:latest
  variables:
    EIGEN_CI_C_COMPILER: gcc-10
    EIGEN_CI_CXX_COMPILER: g++-10
    EIGEN_CI_BUILD_TARGET: buildtests_gpu
    EIGEN_CI_ADDITIONAL_ARGS: -DEIGEN_TEST_HIP=on
  cache: [] # Disable cache for ROCm, since it fails whenever the image updates.


######## Arm ###################################################################

.build:linux:cross:arm:
  extends: .build:linux:cross
  variables:
    EIGEN_CI_TARGET_ARCH: arm
    EIGEN_CI_CROSS_TARGET_TRIPLE: arm-linux-gnueabihf
    EIGEN_CI_ADDITIONAL_ARGS: >
      -DEIGEN_TEST_CUSTOM_CXX_FLAGS=-march=armv7-a;-mfpu=neon-vfpv4
      -DCMAKE_SYSTEM_NAME=Linux
      -DCMAKE_CROSSCOMPILING_EMULATOR=qemu-arm-static;-L;/usr/arm-linux-gnueabihf

build:linux:cross:arm:gcc-10:default:
  extends: .build:linux:cross:arm
  variables:
    EIGEN_CI_CROSS_INSTALL: g++-10-arm-linux-gnueabihf qemu-user-static
    EIGEN_CI_CROSS_C_COMPILER: arm-linux-gnueabihf-gcc-10
    EIGEN_CI_CROSS_CXX_COMPILER: arm-linux-gnueabihf-g++-10

build:linux:cross:arm:clang-12:default:
  extends: .build:linux:cross:arm
  variables:
    EIGEN_CI_INSTALL: clang-12
    EIGEN_CI_C_COMPILER: clang-12
    EIGEN_CI_CXX_COMPILER: clang++-12
    EIGEN_CI_CROSS_INSTALL: g++-10-arm-linux-gnueabihf clang-12 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

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-12:default:
  extends: .build:linux:cross:aarch64
  variables:
    EIGEN_CI_INSTALL: clang-12
    EIGEN_CI_C_COMPILER: clang-12
    EIGEN_CI_CXX_COMPILER: clang++-12
    EIGEN_CI_CROSS_INSTALL: g++-10-aarch64-linux-gnu clang-12

######## ppc64le ###############################################################

.build:linux:cross:ppc64le:
  extends: .build:linux:cross
  image: ubuntu:24.04
  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
  image: ubuntu:24.04
  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

######## MR Smoke Tests ########################################################

build:linux:cross:x86-64:gcc-10:default:smoketest:
  extends: build:linux:cross:x86-64:gcc-10:default
  variables:
    EIGEN_CI_BUILD_TARGET: buildsmoketests
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  tags:
    - saas-linux-medium-amd64

build:linux:cross:x86-64:clang-12:default:smoketest:
  extends: build:linux:cross:x86-64:clang-12:default
  variables:
    EIGEN_CI_BUILD_TARGET: buildsmoketests
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  tags:
    - saas-linux-medium-amd64
