---
# This file is meant to be included from one of pacxx's .gitlab-cy.yml files.
#
# The including file should set the variable ADOPT to whereever it's
# checked-out files should end up in pacxx's source tree, see the --adopt=
# parameter in base/getpacxx.
#
# The project should set the protected CI variable DOCKER_REBUILD_TOKEN to a
# token that can be used to trigger rebuilds for the docker images

stages:
- source
- build
- test
- deploy

######################################################################
#
#  PACXX Source: get the sources (also, verify ci is current)
#

check-ci-main.yml:
  stage: source
  image: alpine:latest
  variables:
    REFERENCE: https://gitlab.dune-project.org/joe/pacxx-docker/raw/master/ci-main.yml
  script:
  - apk add curl
  - curl -f -o ci-main.yml.upstream "$REFERENCE"
  - if ! diff -u ci-main.yml.upstream ci-main.yml; then
      echo "Outdated ci setup, please update ci-main.yml from $REFERENCE";
      exit 2;
    fi
  tags:
  - hpc2seci
  allow_failure: true

source-pacxx:
  stage: source
  image: registry.dune-project.org/joe/pacxx-docker:base-native.master
  script:
  - getpacxx ${ADOPT:+--adopt="$ADOPT"} --branch="$CI_COMMIT_REF_NAME"
             --versionlog=repoversions
  # Trim down to stay within ZIVGITLAB limits
  - find llvm/ -name .git -prune -print0 | xargs -0 rm -rf
  - mv repoversions llvm/
  - cat llvm/repoversions
  tags:
  - hpc2seci
  artifacts:
    paths:
    - llvm/

source-samples:
  stage: source
  image: registry.dune-project.org/joe/pacxx-docker:base-native.master
  script:
  - getpacxx ${ADOPT:+--adopt="$ADOPT"} --branch="$CI_COMMIT_REF_NAME"
             --versionlog=repoversions --samples
  - mv repoversions samples/repoversions
  - cat samples/repoversions
  tags:
  - hpc2seci
  artifacts:
    paths:
    - samples/

######################################################################
#
#  Build: build pacxx using the base image
#

build-native:
  image: registry.dune-project.org/joe/pacxx-docker:base-native.master
  stage: build
  variables:
    GIT_STRATEGY: none
  dependencies:
  - source-pacxx
  script:
  - cat llvm/repoversions
  - export PACXX_INSTALL=$(pwd)/install
  - mkdir build
  - ( cd build &&
      cmake ../llvm -DBUILD_SHARED_LIBS=ON -DLLVM_ENABLE_RTTI=ON -DLLVM_ENABLE_CXX1Y=ON
        -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS_RELEASE="-O3"
        -DCMAKE_INSTALL_PREFIX="${PACXX_INSTALL}" )
  - make -C build -j$(nproc) install
  - cp llvm/repoversions install/
  tags:
  - hpc2seci
  artifacts:
    paths:
    - install/

build-cuda:
  image: registry.dune-project.org/joe/pacxx-docker:base-cuda.master
  stage: build
  variables:
    GIT_STRATEGY: none
  dependencies:
  - source-pacxx
  script:
  - cat llvm/repoversions
  - export PACXX_INSTALL=$(pwd)/install
  - mkdir build
  - ( cd build &&
      cmake ../llvm -DBUILD_SHARED_LIBS=ON -DLLVM_ENABLE_RTTI=ON -DLLVM_ENABLE_CXX1Y=ON
        -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS_RELEASE="-O3"
        -DCMAKE_INSTALL_PREFIX="${PACXX_INSTALL}" )
  - make -C build -j$(nproc) install
  - cp llvm/repoversions install/
  tags:
  - hpc2seci-nvidia
  artifacts:
    paths:
    - install/

######################################################################
#
#  Test: test the just built pacxx
#

test-native-make-debug:
  image: registry.dune-project.org/joe/pacxx-docker:base-native.master
  stage: test
  variables:
    GIT_STRATEGY: none
    PACXX_FORCE_DEFAULT_RT: 1
    PACXX_DEFAULT_RT: 1 # native
  dependencies:
  - build-native
  - source-samples
  script:
  - cat install/repoversions
  - cat samples/repoversions
  - export PATH=$(pwd)/install/bin:$PATH
  - mkdir build
  - cd build
  - cmake ../samples -DCMAKE_CXX_COMPILER=pacxx++ -DCMAKE_BUILD_TYPE=Debug
  - make -j$(nproc)
  - ctest -j$(nproc) -LE '^native-debug-(known-failure|slow)$' --output-on-failure
  - ctest -j$(nproc) -L '^native-debug-known-failure$' --output-on-failure || true
  - ": The following tests were skipped because they are known to be slow"
  - ctest -N -L '^native-debug-slow$'
  tags:
  - hpc2seci

test-native-ninja-release:
  image: registry.dune-project.org/joe/pacxx-docker:base-native.master
  stage: test
  variables:
    GIT_STRATEGY: none
    PACXX_FORCE_DEFAULT_RT: 1
    PACXX_DEFAULT_RT: 1 # native
  dependencies:
  - build-native
  - source-samples
  script:
  - cat install/repoversions
  - cat samples/repoversions
  - export PATH=$(pwd)/install/bin:$PATH
  - mkdir build
  - cd build
  - cmake ../samples -G Ninja -DCMAKE_CXX_COMPILER=pacxx++ -DCMAKE_BUILD_TYPE=Release
  - ninja
  - ctest -j$(nproc) -LE '^native-release-known-failure$' --output-on-failure
  - ctest -j$(nproc) -L '^native-release-known-failure$' --output-on-failure || true
  tags:
  - hpc2seci


test-cuda-make-debug:
  image: registry.dune-project.org/joe/pacxx-docker:base-cuda.master
  stage: test
  variables:
    GIT_STRATEGY: none
    PACXX_FORCE_DEFAULT_RT: 1
    PACXX_DEFAULT_RT: 0 # Cuda
  dependencies:
  - build-cuda
  - source-samples
  script:
  - cat install/repoversions
  - cat samples/repoversions
  - export PATH=$(pwd)/install/bin:$PATH
  - mkdir build
  - cd build
  - cmake ../samples -DCMAKE_CXX_COMPILER=pacxx++ -DCMAKE_BUILD_TYPE=Debug
  - make -j$(nproc)
  - ctest -j$(nproc) -LE '^cuda-debug-(known-failure|slow)$' --output-on-failure
  - ctest -j$(nproc) -L '^cuda-debug-known-failure$' --output-on-failure || true
  - ": The following tests were skipped because they are known to be slow"
  - ctest -N -L '^cuda-debug-slow$'
  tags:
  - hpc2seci-nvidia

test-cuda-make-release:
  image: registry.dune-project.org/joe/pacxx-docker:base-cuda.master
  stage: test
  variables:
    GIT_STRATEGY: none
    PACXX_FORCE_DEFAULT_RT: 1
    PACXX_DEFAULT_RT: 0 # Cuda
  dependencies:
  - build-cuda
  - source-samples
  script:
  - cat install/repoversions
  - cat samples/repoversions
  - export PATH=$(pwd)/install/bin:$PATH
  - mkdir build
  - cd build
  - cmake ../samples -DCMAKE_CXX_COMPILER=pacxx++ -DCMAKE_BUILD_TYPE=Release
  - make -j$(nproc)
  - ctest -j$(nproc) -LE '^cuda-release-known-failure$' --output-on-failure
  - ctest -j$(nproc) -L '^cuda-release-known-failure$' --output-on-failure || true
  tags:
  - hpc2seci-nvidia

######################################################################
#
#  Deploy: Trigger rebuild of the docker images
#

trigger-docker-rebuild:
  stage: deploy
  image: alpine:latest
  variables:
    GIT_STRATEGY: none
  script:
  - apk add curl
  - curl -f -X POST -F token=$DOCKER_REBUILD_TOKEN -F ref=master https://gitlab.dune-project.org/api/v4/projects/702/trigger/pipeline
  tags:
  - hpc2seci
  dependencies: []
  only:
  - master