stages:
  - build
  - test
  - deploy
  - cleanup

############################################
# Windows
############################################

.template_windows: &win
  tags:
    - windows
    - x64
  before_script:
    - "echo off"
    - 'call "%VS2017INSTALLDIR%\VC\Auxiliary\Build\vcvars64"'
    - set CI_DIR=C:\ci\%CI_PIPELINE_ID%
    - set CLCACHE_BASEDIR=C:\ci\%CI_PIPELINE_ID%
    - set NETGEN_BUILD_DIR=%CI_DIR%\build
    - set INSTALL_DIR=%CI_DIR%\install
    - set SRC_DIR=%CI_DIR%\src
    - set NETGENDIR=%INSTALL_DIR%\bin
    - set PYTHONPATH=%INSTALL_DIR%\lib\site-packages

build_win:
  <<: *win
  stage: build
  script:
    - mkdir %SRC_DIR%
    - xcopy . %SRC_DIR%\ /O /X /E /H /K /Q
    - cd %SRC_DIR%
    - git submodule update --init --recursive
    - rd /s /q %NETGEN_BUILD_DIR%
    - mkdir %NETGEN_BUILD_DIR%
    - cd %NETGEN_BUILD_DIR%
    - >-
        cmake %SRC_DIR%
        -G Ninja
        -DCMAKE_INSTALL_PREFIX=%INSTALL_DIR%
        -DUSE_OCC=ON
        -DUSE_CCACHE=ON
        -DCMAKE_BUILD_TYPE=Release
    - cmake --build . --target install --config Release

test_win:
  <<: *win
  stage: test
  script:
    - cd %NETGEN_BUILD_DIR%\netgen
    - ctest -C Release -V
    - cd ..

cleanup_win:
  <<: *win
  stage: cleanup
  tags:
    - windows
    - x64
  script:
    - cd %CI_PROJECT_DIR%
    - rd /s /q %CI_DIR%
  when: always
  allow_failure: true

############################################
# Ubuntu/Linux
############################################

.template_ubuntu: &ubuntu
  tags:
    - linux
  before_script:
    - pwd
    - ls
    - docker info
  variables:
    UBUNTU_VERSION: "18.04"

build_ubuntu:
  <<: *ubuntu
  stage: build
  script:
    - docker build -t netgen_${CI_PIPELINE_ID}:${UBUNTU_VERSION} -f tests/dockerfile .
    - rm -f netgen_${CI_PIPELINE_ID}_$UBUNTU_VERSION.id
    - docker run --cidfile netgen_${CI_PIPELINE_ID}_${UBUNTU_VERSION}.id -e CCACHE_DIR=/ccache -v /mnt/ccache:/ccache netgen_${CI_PIPELINE_ID}:${UBUNTU_VERSION} bash /root/src/netgen/tests/build.sh
    - docker commit `cat netgen_${CI_PIPELINE_ID}_${UBUNTU_VERSION}.id` netgen_${CI_PIPELINE_ID}_installed:${UBUNTU_VERSION}
    - rm netgen_${CI_PIPELINE_ID}_${UBUNTU_VERSION}.id

build_ubuntu_mpi:
  <<: *ubuntu
  stage: build
  script:
    - docker build -t netgen_mpi_${CI_PIPELINE_ID}:${UBUNTU_VERSION} -f tests/dockerfile_mpi .
    - rm -f netgen_mpi_${CI_PIPELINE_ID}_$UBUNTU_VERSION.id_mpi
    - docker run --cidfile netgen_mpi_${CI_PIPELINE_ID}_${UBUNTU_VERSION}.id -e CCACHE_DIR=/ccache -v /mnt/ccache:/ccache netgen_mpi_${CI_PIPELINE_ID}:${UBUNTU_VERSION} bash /root/src/netgen/tests/build_mpi.sh
    - docker commit `cat netgen_mpi_${CI_PIPELINE_ID}_${UBUNTU_VERSION}.id` netgen_mpi_${CI_PIPELINE_ID}_installed:${UBUNTU_VERSION}
    - rm netgen_mpi_${CI_PIPELINE_ID}_${UBUNTU_VERSION}.id

test_ubuntu:
  <<: *ubuntu
  stage: test
  script:
    - >-
      docker run
      -e NETGENDIR=/opt/netgen/bin
      -e PYTHONPATH=/opt/netgen/lib/python3/dist-packages
      netgen_${CI_PIPELINE_ID}_installed:${UBUNTU_VERSION}
      bash -c 'cd /root/build/netgen && make test_netgen ARGS="-V"'

test_ubuntu_mpi:
  <<: *ubuntu
  stage: test
  script:
    - >-
      docker run
      -e NETGENDIR=/opt/netgen/bin
      -e PYTHONPATH=/opt/netgen/lib/python3/dist-packages
      netgen_mpi_${CI_PIPELINE_ID}_installed:${UBUNTU_VERSION}
      bash -c 'cd /root/build/netgen && make test_netgen ARGS="-V"'

test_build_ngsolve:
  <<: *ubuntu
  allow_failure: true
  stage: deploy
  script:
    - >-
      docker run
      -e NETGENDIR=/opt/netgen/bin
      -e PYTHONPATH=/opt/netgen/lib/python3/dist-packages
      -e MKLROOT=/opt/intel/mkl
      -v /opt/intel:/opt/intel
      -e CCACHE_DIR=/ccache
      -v /mnt/ccache:/ccache
      netgen_${CI_PIPELINE_ID}_installed:${UBUNTU_VERSION}
      bash -c 'cd /root/src/netgen/tests/ && ./build_ngsolve.sh'

# cpp guideline checks
test_guidelines:
  <<: *ubuntu
  stage: test
  script:
    - docker run -e CCACHE_DIR=/ccache -v /mnt/ccache:/ccache netgen_${CI_PIPELINE_ID}:${UBUNTU_VERSION} bash /root/src/netgen/tests/build_guidelines.sh
  when: always
  allow_failure: true

# check if it compiles without spdlog
test_noSpdlog:
  <<: *ubuntu
  stage: test
  script:
    - docker run -e CCACHE_DIR=/ccache -v /mnt/ccache:/ccache netgen_${CI_PIPELINE_ID}:${UBUNTU_VERSION} bash /root/src/netgen/tests/build_nospdlog.sh

cleanup_ubuntu:
  stage: cleanup
  tags:
    - linux
  script:
    # remove intermediate and old docker images and containers
    - docker rm -f `docker ps --no-trunc -aq`
    - docker images --no-trunc -aqf "dangling=true" | xargs docker rmi -f || true
  when: always
  allow_failure: true


############################################
# MacOSX
############################################

.template_mac: &mac
  tags:
    - mac
  before_script:
    - export ROOT_DIR=/tmp/$CI_PIPELINE_ID
    - export SRC_DIR=$ROOT_DIR/src
    - export BUILD_DIR=$ROOT_DIR/build
    - export CMAKE_INSTALL_PREFIX=/tmp/$CI_PIPELINE_ID/install/Netgen.app
    - export PYTHONPATH=$CMAKE_INSTALL_PREFIX/Contents/Resources/`python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1,0,''))"`:.
    - export PATH=$CMAKE_INSTALL_PREFIX/Contents/MacOS:$PATH

build_mac:
  <<: *mac
  stage: build
  script:
    - git submodule update --init --recursive
    - rm -rf $BUILD_DIR
    - mkdir -p $BUILD_DIR
    - rm -rf $SRC_DIR
    - mkdir -p $SRC_DIR
    - cp -a . $SRC_DIR/
    - cd $BUILD_DIR
    - >-
        cmake $SRC_DIR
        -DCMAKE_INSTALL_PREFIX=$CMAKE_INSTALL_PREFIX
        -DCMAKE_BUILD_TYPE=Release
        -DUSE_NATIVE_ARCH=OFF
        -DUSE_CCACHE=ON
        -DENABLE_UNIT_TESTS=ON
        -DCMAKE_OSX_DEPLOYMENT_TARGET=10.9
        -DCMAKE_OSX_SYSROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
    - make -j5 install

test_mac:
  <<: *mac
  stage: test
  script:
    - cd $BUILD_DIR/netgen
    - ctest . --output-on-failure

cleanup_mac:
  <<: *mac
  stage: cleanup
  script:
    - rm -rf $ROOT_DIR
  when: always
  allow_failure: true

############################################
# Deploy stage
############################################

deploy_sourceforge:
  stage: deploy
  tags:
    - linux
    - docker
  script:
    - git remote add sourceforge ssh://mhochste@git.code.sf.net/p/netgen-mesher/git || true
    - git remote add github git@github.com:NGSolve/netgen.git || true
    - git remote update
    - git checkout master
    - git pull origin master
    - git push sourceforge master
    - git push github master
  only:
    - master
