# SPDX-License-Identifier: CC0-1.0
# SPDX-FileCopyrightText: 2018-2020 Collabora, Ltd. and the Monado contributors

variables:
  FDO_UPSTREAM_REPO: monado/monado

.templates_sha: &templates_sha 322bf2b8f29b6491caeb13861201e96969ddc169

.package_only_branch: &package_only_branch master

# Variables listing packages for Debian-based distros
.monado.variables.debian-based-packages:
  variables:
    CORE_REQUIRED_PACKAGES: "build-essential git wget unzip cmake meson ninja-build libeigen3-dev curl patch python3 pkg-config libx11-dev libx11-xcb-dev libxxf86vm-dev libxrandr-dev libxcb-randr0-dev libvulkan-dev glslang-tools libglvnd-dev libgl1-mesa-dev ca-certificates libusb-1.0-0-dev  libudev-dev"
    FEATURE_PACKAGES: "libhidapi-dev libwayland-dev libuvc-dev libavcodec-dev libopencv-dev libv4l-dev libcjson-dev libsdl2-dev libegl1-mesa-dev libdbus-1-dev"
    PACKAGING_PACKAGES: "devscripts debhelper osc osc-plugins-dput dput-ng gettext-base markdown"
    TOOLS_REQUIRED_PACKAGES: "clang-format-7 codespell doxygen graphviz python3-pip python3-click"

# Variables for build and usage of Debian 10 (Buster) image
.monado.variables.debian:buster:
  variables:
    FDO_DISTRIBUTION_VERSION: buster
    FDO_DISTRIBUTION_TAG: "2020-07-10.0"

# Variables for build and usage of Ubuntu 20.04 LTS (Focal) image
.monado.variables.ubuntu:focal:
  variables:
    FDO_DISTRIBUTION_VERSION: "20.04"
    FDO_DISTRIBUTION_TAG: "2020-07-10.0"

# Variables for build and usage of Debian 10 (Buster) + Android NDK image
.monado.variables.debian:buster-ndk:
  variables:
    FDO_DISTRIBUTION_VERSION: buster
    FDO_DISTRIBUTION_TAG: "2020-05-06.0"
    FDO_REPO_SUFFIX: ndk

# Variables for build and usage of Arch Linux image
.monado.variables.arch:rolling:
  variables:
    FDO_DISTRIBUTION_TAG: "2020-05-12.0"

include:
  - project: "freedesktop/ci-templates"
    ref: *templates_sha
    file: "/templates/debian.yml"
  - project: "freedesktop/ci-templates"
    ref: *templates_sha
    file: "/templates/ubuntu.yml"
  - project: "freedesktop/ci-templates"
    ref: *templates_sha
    file: "/templates/arch.yml"

stages:
  - container_prep
  - build
  - package
  - reprepro
  - pages
  - deploy

###
# Container prep jobs

# Base for all container prep
.monado.variables.container-prep-base:
  # "stage" set here doesn't work, for some reason
  variables:
    # no need to pull the whole tree for rebuilding the image - is this still needed?
    GIT_STRATEGY: none
    # Each most-derived container prep job has a script to set up stuff for it.
    FDO_DISTRIBUTION_EXEC: "bash .gitlab-ci/$(echo ${CI_JOB_NAME} | sed 's/:/_/g').sh"

# Debian Buster (x64 + i386)
debian:container_prep:
  stage: container_prep
  extends:
    - .monado.variables.debian:buster
    - .monado.variables.container-prep-base
    - .monado.variables.debian-based-packages
    - .fdo.container-build@debian # from ci-templates
  variables:
    # a list of packages to install - assembled from .monado.variables.debian-based-packages, plus reprepro
    FDO_DISTRIBUTION_PACKAGES: "${CORE_REQUIRED_PACKAGES} ${FEATURE_PACKAGES} ${PACKAGING_PACKAGES} ${TOOLS_REQUIRED_PACKAGES} reprepro"

# Arch Linux (x64)
arch:container_prep:
  stage: container_prep
  extends:
    - .monado.variables.arch:rolling
    - .monado.variables.container-prep-base
    - .fdo.container-build@arch # from ci-templates
  variables:
    # a list of packages to install
    FDO_DISTRIBUTION_PACKAGES: "git gcc clang cmake meson ninja pkgconfig python3 diffutils patch doxygen graphviz eigen hidapi libxrandr mesa glslang vulkan-headers vulkan-icd-loader check glfw-x11 libusb opencv gtk3 ffmpeg v4l-utils qt5-base"

# Ubuntu Focal (x64)
ubuntu:container_prep:
  stage: container_prep
  extends:
    - .monado.variables.ubuntu:focal
    - .monado.variables.container-prep-base
    - .monado.variables.debian-based-packages
    - .fdo.container-build@ubuntu # from ci-templates
  variables:
    # a list of packages to install - assembled from .monado.variables.debian-based-packages
    FDO_DISTRIBUTION_PACKAGES: "${CORE_REQUIRED_PACKAGES} ${FEATURE_PACKAGES} ${PACKAGING_PACKAGES} ${TOOLS_REQUIRED_PACKAGES}"

# Debian Buster + the Android NDK in /opt/android-ndk
# The NDK itself gets installed by .gitlab-ci/ndk:container_prep.sh
ndk:container_prep:
  stage: container_prep
  extends:
    - .monado.variables.debian:buster-ndk
    - .monado.variables.container-prep-base
    - .fdo.container-build@debian # from ci-templates
  variables:
    # Repo suffix is set in .monado.variables.debian:buster-ndk
    # a list of packages to install
    FDO_DISTRIBUTION_PACKAGES: "git wget unzip cmake meson ninja-build libeigen3-dev python3 pkg-config ca-certificates glslang-tools"

# Style check job
format-and-spellcheck:
  extends:
    - .monado.variables.debian:buster
    - .fdo.distribution-image@debian # from ci-templates
  stage: build
  script:
    - scripts/format-and-spellcheck.sh
  artifacts:
    paths:
      - patches/
    expire_in: 1 week
    when: on_failure

# "Base" job for a CMake build
.monado.base-job.build-cmake:
  stage: build
  script:
    - mkdir build
    - pushd build
    - cmake -GNinja .. $CMAKE_ARGS
    # List build options
    - grep "^XRT_" CMakeCache.txt
    - ninja
    - ctest --output-on-failure

# "Base" job for a Meson build
.monado.base-job.build-meson:
  stage: build
  script:
    - mkdir build
    - pushd build
    - meson .. $MESON_ARGS
    - ninja

debian:cmake:
  extends:
    - .monado.variables.debian:buster
    - .fdo.distribution-image@debian # from ci-templates
    - .monado.base-job.build-cmake
  before_script:
    # Generate "changes since last release" and add to changelog,
    # since this is the build that makes our docs.
    - pip3 install proclamation
    - pushd doc/changes
    - proclamation build --overwrite vNEXT
    - popd
  artifacts:
    paths:
      - build/doc/html/

debian:cmake-no-opencv:
  extends:
    - .monado.variables.debian:buster
    - .fdo.distribution-image@debian # from ci-templates
    - .monado.base-job.build-cmake
  variables:
    CMAKE_ARGS: -DXRT_HAVE_OPENCV=OFF

debian:cmake-no-opengl:
  extends:
    - .monado.variables.debian:buster
    - .fdo.distribution-image@debian # from ci-templates
    - .monado.base-job.build-cmake
  variables:
    CMAKE_ARGS: -DXRT_HAVE_OPENGL=OFF

debian:cmake-no-sdl2:
  extends:
    - .monado.variables.debian:buster
    - .fdo.distribution-image@debian # from ci-templates
    - .monado.base-job.build-cmake
  variables:
    CMAKE_ARGS: -DXRT_HAVE_SDL2=OFF

debian:cmake-no-service:
  extends:
    - .monado.variables.debian:buster
    - .fdo.distribution-image@debian # from ci-templates
    - .monado.base-job.build-cmake
  variables:
    CMAKE_ARGS: -DXRT_FEATURE_SERVICE=OFF

arch:cmake:
  extends:
    - .monado.variables.arch:rolling
    - .fdo.distribution-image@arch # from ci-templates
    - .monado.base-job.build-cmake

arch:cmake:clang:
  extends:
    - .monado.variables.arch:rolling
    - .fdo.distribution-image@arch # from ci-templates
    - .monado.base-job.build-cmake
  variables:
    CMAKE_ARGS: -DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++

ubuntu:cmake:
  extends:
    - .monado.variables.ubuntu:focal
    - .fdo.distribution-image@ubuntu # from ci-templates
    - .monado.base-job.build-cmake

debian:meson:
  extends:
    - .monado.variables.debian:buster
    - .fdo.distribution-image@debian # from ci-templates
    - .monado.base-job.build-meson

ubuntu:meson:
  extends:
    - .monado.variables.ubuntu:focal
    - .fdo.distribution-image@ubuntu # from ci-templates
    - .monado.base-job.build-meson

arch:meson:
  extends:
    - .monado.variables.arch:rolling
    - .fdo.distribution-image@arch # from ci-templates
    - .monado.base-job.build-meson
  variables:
    MESON_ARGS: -Ddocs=disabled

# Cross-compiling
debian:meson:32bit:
  extends:
    - .monado.variables.debian:buster
    - .fdo.distribution-image@debian # from ci-templates
    - .monado.base-job.build-meson
  variables:
    MESON_ARGS: --prefix /usr --libdir /usr/lib/i386-linux-gnu --cross-file ../.gitlab-ci/i386-cross.txt

debian:cmake:32bit:
  extends:
    - .monado.variables.debian:buster
    - .fdo.distribution-image@debian # from ci-templates
    - .monado.base-job.build-cmake
  variables:
    # OpenCV and local OpenHMD doesn't play nicely with us in multi-arch.
    CMAKE_ARGS: -DCMAKE_TOOLCHAIN_FILE=../.gitlab-ci/i386.cmake -DXRT_HAVE_OPENCV=off -DXRT_BUILD_DRIVER_OHMD=off

# Packaging
.monado.base-job.debuild:
  stage: package
  only:
    - *package_only_branch
  before_script:
    # Configure git - needed despite not actually committing here.
    - git config --global user.email "ryan.pavlik@collabora.com"
    - git config --global user.name "Monado CI"
  script:
    # Prep the source tree
    - git clean -dfx
    - git merge origin/${PACKAGE_BRANCH} --no-commit
    - FULLNAME="Monado CI <ryan.pavlik@collabora.com>" debian/extra/prepare-commit-package.sh ${CI_COMMIT_SHA} 1~${BACKPORT_SUFFIX}~ci$(date --utc "+%Y%m%d")
    # Build the package
    - debuild -uc -us
    # Use dput-ng to move the package-related files into some artifacts.
    - export INCOMING=$(pwd)/incoming
    - mkdir -p $INCOMING
    - mkdir -p ~/.dput.d/profiles
    - cat .gitlab-ci/localhost.json | envsubst  > ~/.dput.d/profiles/localhost.json
    - dpkg-parsechangelog --show-field version > incoming/${DISTRO}.distro
    - dput --debug localhost ../monado_$(dpkg-parsechangelog --show-field version)_amd64.changes
  artifacts:
    paths:
      - "incoming/"
    expire_in: 2 days

debian:buster:package:
  extends:
    - .monado.variables.debian:buster
    - .fdo.distribution-image@debian # from ci-templates
    - .monado.base-job.debuild
  variables:
    BACKPORT_SUFFIX: bpo10
    PACKAGE_BRANCH: debian/buster-backports
    DISTRO: buster

ubuntu:focal:package:
  extends:
    - .monado.variables.ubuntu:focal
    - .fdo.distribution-image@ubuntu # from ci-templates
    - .monado.base-job.debuild
  variables:
    BACKPORT_SUFFIX: ubuntu20.04
    PACKAGE_BRANCH: ubuntu/focal
    DISTRO: focal

reprepro:package:
  stage: reprepro
  only:
    - *package_only_branch
  extends:
    - .monado.variables.debian:buster
    - .fdo.distribution-image@debian # from ci-templates
  dependencies:
    - debian:buster:package
    - ubuntu:focal:package
  before_script:
    # Convince gnupg to work properly in CI
    - mkdir -p ~/.gnupg && chmod 700 ~/.gnupg
    - touch ~/.gnupg/gpg.conf
    - echo 'use-agent' > ~/.gnupg/gpg.conf
    - echo 'pinentry-mode loopback' >> ~/.gnupg/gpg.conf
    - touch ~/.gnupg/gpg-agent.conf
    - echo 'allow-loopback-pinentry' > ~/.gnupg/gpg-agent.conf
    - echo RELOADAGENT | gpg-connect-agent
    - gpg --batch --no-tty --yes --pinentry-mode loopback --passphrase ${MONADO_GPG_PASSPHRASE} --import ${MONADO_GPG_SECRET_KEY}

  script:
    # Use reprepro to create an apt repository in our artifacts
    - mkdir -p repo/conf
    # For each distro, sign the changes file and add it to the repo.
    - |
      for fn in incoming/*.distro; do
        # parse the distro name out
        export DISTRO=$(echo $fn | sed -e 's:incoming/::' -e 's:[.]distro::')
        echo "Processing $DISTRO"
        # add distro to repository config - blank line is mandatory!
        cat .gitlab-ci/distributions | envsubst >> repo/conf/distributions
        echo >> repo/conf/distributions

        echo "Signing package for $DISTRO"
        debsign -k ${MONADO_GPG_FINGERPRINT} -p "gpg --batch --no-tty --yes --pinentry-mode loopback --passphrase ${MONADO_GPG_PASSPHRASE}" incoming/monado_$(cat $fn)_amd64.changes

        echo "Adding package for $DISTRO to the repository"
        reprepro -V --ignore=wrongdistribution -b repo include ${DISTRO} incoming/monado_$(cat $fn)_amd64.changes
      done
  artifacts:
    paths:
      - "repo/"
    expire_in: 2 days

# Base of Android NDK builds.
# Takes the last :-delimited part of the name as the ABI to build for,
# so you don't need to do anything other than "extends" in the job
.monado.ndk:build-base:
  stage: build
  extends:
    - .monado.variables.debian:buster-ndk
    - .fdo.suffixed-image@debian # from ci-templates
  variables:
    ANDROID_PLATFORM: 26
  script:
    - mkdir build
    - pushd build
    # This extracts the ABI from the job name
    - export ABI=$(echo $CI_JOB_NAME | cut --delimiter=":" -f 2)
    # Note we are pointing CMake to the host install of Eigen3 because it's header-only
    # and thus this is safe to do.
    - cmake -GNinja .. -DANDROID_PLATFORM=$ANDROID_PLATFORM -DANDROID_ABI=$ABI -DCMAKE_TOOLCHAIN_FILE=/opt/android-ndk/build/cmake/android.toolchain.cmake -DEigen3_DIR=/usr/lib/cmake/eigen3/
    - grep "^XRT_" CMakeCache.txt
    - ninja

ndk:armeabi-v7a:
  extends: .monado.ndk:build-base

ndk:arm64-v8a:
  extends: .monado.ndk:build-base

###
# Pages
###
pages:
  stage: pages
  only:
    - master
  dependencies:
    - debian:cmake
    - reprepro:package
  script:
    - mkdir -p public
    - mv build/doc/html/* public/
    - mv repo public/apt
  artifacts:
    paths:
      - public