stages:
  - build

.Debian:
  tags:
    - docker
    - linux
  image: debian:bullseye
  cache:
    paths:
    - apt-cache/
    - ccache/
  before_script:
    - export APT_CACHE_DIR=`pwd`/apt-cache && mkdir -pv $APT_CACHE_DIR
    - apt-get update -yq 
    - apt-get -o dir::cache::archives="$APT_CACHE_DIR" install -y cmake build-essential libboost-filesystem-dev libboost-program-options-dev libboost-system-dev libboost-iostreams-dev libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libswresample-dev libsdl2-dev libqt5opengl5-dev libopenal-dev libopenscenegraph-dev libunshield-dev libtinyxml-dev libmygui-dev libbullet-dev ccache git clang
  stage: build
  script:
    - export CCACHE_BASEDIR="`pwd`"
    - export CCACHE_DIR="`pwd`/ccache" && mkdir -pv "$CCACHE_DIR"
    - ccache -z -M "${CCACHE_SIZE}"
    - CI/before_script.linux.sh
    - cd build
    - cmake --build . -- -j $(nproc)
    - cmake --install .
    - if [[ "${BUILD_TESTS_ONLY}" ]]; then ./openmw_test_suite; fi
    - ccache -s
  artifacts:
    paths:
      - build/install/

Debian_GCC:
  extends: .Debian
  cache:
    key: Debian_GCC.v2
  variables:
    CC: gcc
    CXX: g++
    CCACHE_SIZE: 3G

Debian_GCC_tests:
  extends: .Debian
  cache:
    key: Debian_GCC_tests.v2
  variables:
    CC: gcc
    CXX: g++
    CCACHE_SIZE: 1G
    BUILD_TESTS_ONLY: 1

Debian_Clang:
  extends: .Debian
  cache:
    key: Debian_Clang.v2
  variables:
    CC: clang
    CXX: clang++
    CCACHE_SIZE: 2G

Debian_Clang_tests:
  extends: .Debian
  cache:
    key: Debian_Clang_tests.v2
  variables:
    CC: clang
    CXX: clang++
    CCACHE_SIZE: 1G
    BUILD_TESTS_ONLY: 1

MacOS:
  tags:
    - macos
  stage: build
  rules:
    - if: '$CI_PROJECT_ID != "7107382"'
      allow_failure: true

  script:
    - rm -fr build/*  #  remove anything in the build directory
    - CI/before_install.osx.sh
    - CI/before_script.osx.sh
    - cd build; make -j2 package
    - for dmg in *.dmg; do mv "$dmg" "${dmg%.dmg}_${CI_COMMIT_REF_NAME}_${CI_JOB_ID}.dmg"; done
  artifacts:
    paths:
      - build/OpenMW-*.dmg
      - "build/**/*.log"

variables: &engine-targets
  targets: "openmw,openmw-essimporter,openmw-iniimporter,openmw-launcher,openmw-wizard"

variables: &cs-targets
  targets: "openmw-cs,bsatool,esmtool,niftest"

.Windows_Ninja_Base:
  tags:
    - windows
  before_script:
  - Import-Module "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1"
  - choco source add -n=openmw-proxy -s="https://repo.openmw.org/repository/Chocolately/" --priority=1
  - choco install git --force --params "/GitAndUnixToolsOnPath" -y
  - choco install 7zip -y
  - choco install cmake.install --installargs 'ADD_CMAKE_TO_PATH=System' -y
  - choco install vswhere -y
  - choco install ninja -y
  - choco install python -y
  - refreshenv
  stage: build
  script:
    - $time = (Get-Date -Format "HH:mm:ss")
    - echo ${time}
    - echo "started by ${GITLAB_USER_NAME}"
    - sh CI/before_script.msvc.sh -c $config -p Win64 -v 2019 -k -V -N
    - cd MSVC2019_64_Ninja
    - .\ActivateMSVC.ps1
    - cmake --build . --config $config --target ($targets.Split(','))
    - cd $config
    - |
      if (Get-ChildItem -Recurse *.pdb) {
        7z a -tzip ..\..\OpenMW_MSVC2019_64_${config}_${CI_COMMIT_REF_NAME}_${CI_JOB_ID}_symbols.zip '*.pdb'
        Get-ChildItem -Recurse *.pdb | Remove-Item
      }
    - 7z a -tzip ..\..\OpenMW_MSVC2019_64_${config}_${CI_COMMIT_REF_NAME}_${CI_JOB_ID}.zip '*'
  cache:
    key: ninja-v2
    paths:
    - deps
    - MSVC2019_64_Ninja/deps/Qt
  artifacts:
    when: always
    paths:
    - "*.zip"
    - "*.log"
    - MSVC2019_64_Ninja/*.log
    - MSVC2019_64_Ninja/*/*.log
    - MSVC2019_64_Ninja/*/*/*.log
    - MSVC2019_64_Ninja/*/*/*/*.log
    - MSVC2019_64_Ninja/*/*/*/*/*.log
    - MSVC2019_64_Ninja/*/*/*/*/*/*.log
    - MSVC2019_64_Ninja/*/*/*/*/*/*/*.log
    - MSVC2019_64_Ninja/*/*/*/*/*/*/*/*.log

Windows_Ninja_Engine_Release:
  extends:
    - .Windows_Ninja_Base
  variables:
    <<: *engine-targets
    config: "Release"

Windows_Ninja_Engine_Debug:
  extends:
    - .Windows_Ninja_Base
  variables:
    <<: *engine-targets
    config: "Debug"

Windows_Ninja_Engine_RelWithDebInfo:
  extends:
    - .Windows_Ninja_Base
  variables:
    <<: *engine-targets
    config: "RelWithDebInfo"

Windows_Ninja_CS_Release:
  extends:
    - .Windows_Ninja_Base
  variables:
    <<: *cs-targets
    config: "Release"

Windows_Ninja_CS_Debug:
  extends:
    - .Windows_Ninja_Base
  variables:
    <<: *cs-targets
    config: "Debug"

Windows_Ninja_CS_RelWithDebInfo:
  extends:
    - .Windows_Ninja_Base
  variables:
    <<: *cs-targets
    config: "RelWithDebInfo"

.Windows_MSBuild_Base:
  tags:
    - windows
  before_script:
  - Import-Module "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1"
  - choco source add -n=openmw-proxy -s="https://repo.openmw.org/repository/Chocolately/" --priority=1
  - choco install git --force --params "/GitAndUnixToolsOnPath" -y
  - choco install 7zip -y
  - choco install cmake.install --installargs 'ADD_CMAKE_TO_PATH=System' -y
  - choco install vswhere -y
  - choco install python -y
  - refreshenv
  stage: build
  script:
    - $time = (Get-Date -Format "HH:mm:ss")
    - echo ${time}
    - echo "started by ${GITLAB_USER_NAME}"
    - sh CI/before_script.msvc.sh -c $config -p Win64 -v 2019 -k -V
    - cd MSVC2019_64
    - cmake --build . --config $config --target ($targets.Split(','))
    - cd $config
    - |
      if (Get-ChildItem -Recurse *.pdb) {
        7z a -tzip ..\..\OpenMW_MSVC2019_64_${config}_${CI_COMMIT_REF_NAME}_${CI_JOB_ID}_symbols.zip '*.pdb'
        Get-ChildItem -Recurse *.pdb | Remove-Item
      }
    - 7z a -tzip ..\..\OpenMW_MSVC2019_64_${config}_${CI_COMMIT_REF_NAME}_${CI_JOB_ID}.zip '*'
  cache:
    key: msbuild-v2
    paths:
    - deps
    - MSVC2019_64/deps/Qt
  artifacts:
    when: always
    paths:
    - "*.zip"
    - "*.log"
    - MSVC2019_64/*.log
    - MSVC2019_64/*/*.log
    - MSVC2019_64/*/*/*.log
    - MSVC2019_64/*/*/*/*.log
    - MSVC2019_64/*/*/*/*/*.log
    - MSVC2019_64/*/*/*/*/*/*.log
    - MSVC2019_64/*/*/*/*/*/*/*.log
    - MSVC2019_64/*/*/*/*/*/*/*/*.log

Windows_MSBuild_Engine_Release:
  extends:
    - .Windows_MSBuild_Base
  variables:
    <<: *engine-targets
    config: "Release"

Windows_MSBuild_Engine_Debug:
  extends:
    - .Windows_MSBuild_Base
  variables:
    <<: *engine-targets
    config: "Debug"

Windows_MSBuild_Engine_RelWithDebInfo:
  extends:
    - .Windows_MSBuild_Base
  variables:
    <<: *engine-targets
    config: "RelWithDebInfo"

Windows_MSBuild_CS_Release:
  extends:
    - .Windows_MSBuild_Base
  variables:
    <<: *cs-targets
    config: "Release"

Windows_MSBuild_CS_Debug:
  extends:
    - .Windows_MSBuild_Base
  variables:
    <<: *cs-targets
    config: "Debug"

Windows_MSBuild_CS_RelWithDebInfo:
  extends:
    - .Windows_MSBuild_Base
  variables:
    <<: *cs-targets
    config: "RelWithDebInfo"