---
variables:
  BUILD_IMAGES_PROJECT: cmocka/gitlab-build-images
  FEDORA_BUILD: buildenv-fedora
  CENTOS7_BUILD: buildenv-centos7
  TUMBLEWEED_BUILD: buildenv-tumbleweed
  MINGW_BUILD: buildenv-mingw
  UBUNTU_BUILD: buildenv-ubuntu
  UBUNTU32_BUILD: buildenv-ubuntu32

stages:
  - build
  - test
  - analysis

centos7/x86_64:
  stage: test
  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$CENTOS7_BUILD
  script:
    - mkdir -p obj && cd obj && cmake3
      -DCMAKE_BUILD_TYPE=RelWithDebInfo
      -DPICKY_DEVELOPER=ON
      -DUNIT_TESTING=ON .. &&
      make -j$(nproc) && ctest --output-on-failure
  except:
    - tags
  artifacts:
    expire_in: 1 week
    when: on_failure
    paths:
      - obj/

fedora/x86_64:
  stage: test
  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD
  script:
    - mkdir -p obj && cd obj && cmake
      -DCMAKE_BUILD_TYPE=RelWithDebInfo
      -DPICKY_DEVELOPER=ON
      -DUNIT_TESTING=ON .. &&
      make -j$(nproc) && ctest --output-on-failure
  except:
    - tags
  artifacts:
    expire_in: 1 week
    when: on_failure
    paths:
      - obj/

fedora/address-sanitizer:
  stage: build
  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD
  script:
    - mkdir -p obj && cd obj && cmake
      -DCMAKE_BUILD_TYPE=AddressSanitizer
      -DPICKY_DEVELOPER=ON
      -DUNIT_TESTING=ON .. &&
      make -j$(nproc) && ctest --output-on-failure
  except:
    - tags
  artifacts:
    expire_in: 1 week
    when: on_failure
    paths:
      - obj/

fedora/undefined-sanitizer:
  stage: analysis
  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD
  script:
    - mkdir -p obj && cd obj && cmake
      -DCMAKE_BUILD_TYPE=UndefinedSanitizer
      -DUNIT_TESTING=ON ..
      && make -j$(nproc) && ctest --output-on-failure
  except:
    - tags
  artifacts:
    expire_in: 1 week
    when: on_failure
    paths:
      - obj/

# realpath() doesn't work with libtsan and returns EINVAL
#
# fedora/thread-sanitizer:
tumbleweed/thread-sanitizer:
  stage: analysis
  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD
  script:
    # Workaround for TSAN with ASLR on newer kernel
    # https://github.com/google/sanitizers/issues/1716
    - mkdir -p obj && cd obj && cmake
      -DCMAKE_BUILD_TYPE=ThreadSanitizer
      -DPICKY_DEVELOPER=ON
      -DUNIT_TESTING=ON .. &&
      make -j$(nproc) &&
      setarch --addr-no-randomize -- ctest --output-on-failure
  except:
    - tags
  artifacts:
    expire_in: 1 week
    when: on_failure
    paths:
      - obj/

fedora/csbuild:
  stage: analysis
  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD
  script:
    - |
      if [[ -z "$CI_COMMIT_BEFORE_SHA" ]]; then
          export CI_COMMIT_BEFORE_SHA=$(git rev-parse "${CI_COMMIT_SHA}~20")
      fi

      # Check if the commit exists in this branch
      # This is not the case for a force push
      git branch --contains $CI_COMMIT_BEFORE_SHA 2>/dev/null ||
        export CI_COMMIT_BEFORE_SHA=$(git rev-parse "${CI_COMMIT_SHA}~20")

      export CI_COMMIT_RANGE="$CI_COMMIT_BEFORE_SHA..$CI_COMMIT_SHA"

    - csbuild
      --build-dir=obj-csbuild
      --prep-cmd="cmake -DCMAKE_BUILD_TYPE=Debug -DPICKY_DEVELOPER=ON -DUNIT_TESTING=ON @SRCDIR@"
      --build-cmd "make clean && make -j$(nproc)"
      --git-commit-range $CI_COMMIT_RANGE
      --color
      --print-current --print-fixed
  except:
    - tags
  artifacts:
    expire_in: 1 week
    when: on_failure
    paths:
      - obj-csbuild/

freebsd/x86_64:
  stage: test
  image:
  script:
    - mkdir -p obj && cd obj && cmake
      -DCMAKE_BUILD_TYPE=RelWithDebInfo
      -DPICKY_DEVELOPER=ON
      -DUNIT_TESTING=ON .. &&
      make && ctest --output-on-failure
  tags:
    - freebsd
  except:
    - tags
  only:
    - branches@cwrap/socket_wrapper
    - branches@cryptomilk/socket_wrapper
    - branches@metze/socket_wrapper
  artifacts:
    expire_in: 1 week
    when: on_failure
    paths:
      - obj/

tumbleweed/x86_64/gcc:
  stage: test
  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD
  script:
    - mkdir -p obj && cd obj && cmake
      -DCMAKE_BUILD_TYPE=RelWithDebInfo
      -DPICKY_DEVELOPER=ON
      -DUNIT_TESTING=ON .. &&
      make -j$(nproc) && ctest --output-on-failure
  except:
    - tags
  artifacts:
    expire_in: 1 week
    when: on_failure
    paths:
      - obj/

tumbleweed/x86_64/gcc7:
  stage: test
  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD
  script:
    - mkdir -p obj && cd obj && cmake
      -DCMAKE_C_COMPILER=gcc-7 -DCMAKE_CXX_COMPILER=g++-7
      -DCMAKE_BUILD_TYPE=RelWithDebInfo
      -DPICKY_DEVELOPER=ON
      -DUNIT_TESTING=ON .. &&
      make -j$(nproc) && ctest --output-on-failure
  except:
    - tags
  artifacts:
    expire_in: 1 week
    when: on_failure
    paths:
      - obj/

tumbleweed/x86_64/clang:
  stage: test
  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD
  script:
    - mkdir -p obj && cd obj && cmake
      -DCMAKE_BUILD_TYPE=RelWithDebInfo
      -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
      -DPICKY_DEVELOPER=ON
      -DUNIT_TESTING=ON .. &&
      make -j$(nproc) && ctest --output-on-failure
  except:
    - tags
  artifacts:
    expire_in: 1 week
    when: on_failure
    paths:
      - obj/

tumbleweed/x86/gcc:
  stage: test
  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD
  script:
    - mkdir -p obj && cd obj && cmake
      -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-cross-m32.cmake
      -DCMAKE_BUILD_TYPE=RelWithDebInfo
      -DPICKY_DEVELOPER=ON
      -DUNIT_TESTING=ON .. &&
      make -j$(nproc) && ctest --output-on-failure
  except:
    - tags
  artifacts:
    expire_in: 1 week
    when: on_failure
    paths:
      - obj/

tumbleweed/static-analysis:
  stage: analysis
  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD
  script:
    - export CCC_CC=clang
    - export CCC_CXX=clang++
    - mkdir -p obj && cd obj && scan-build cmake
      -DCMAKE_BUILD_TYPE=Debug
      -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
      -DPICKY_DEVELOPER=ON
      -DUNIT_TESTING=ON .. &&
      scan-build --status-bugs -o scan make -j$(nproc)
  except:
    - tags
  artifacts:
    expire_in: 1 week
    when: on_failure
    paths:
      - obj/scan

tumbleweed/helgrind:
  stage: analysis
  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD
  script:
    - mkdir -p obj && cd obj && cmake
      -DCMAKE_BUILD_TYPE=Debug
      -DPICKY_DEVELOPER=ON
      -DUNIT_TESTING=ON
      -DHELGRIND_TESTING=ON .. &&
      make -j$(nproc) && ctest --output-on-failure
  except:
    - tags
  artifacts:
    expire_in: 1 week
    when: on_failure
    paths:
      - obj/
  only:
    variables:
      - $VALGRIND_SUPPORTS_FORKED_MUTEXES == "yes"

ubuntu/x86_64:
  stage: test
  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$UBUNTU_BUILD
  script:
    - mkdir -p obj && cd obj && cmake
      -DCMAKE_BUILD_TYPE=RelWithDebInfo
      -DPICKY_DEVELOPER=ON
      -DUNIT_TESTING=ON .. &&
      make -j$(nproc) && ctest --output-on-failure
  except:
    - tags
  artifacts:
    expire_in: 1 week
    when: on_failure
    paths:
      - obj/

ubuntu/x86:
  stage: test
  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$UBUNTU32_BUILD
  script:
    - mkdir -p obj && cd obj && cmake
      -DCMAKE_BUILD_TYPE=RelWithDebInfo
      -DPICKY_DEVELOPER=ON
      -DUNIT_TESTING=ON .. &&
      make -j$(nproc) && ctest --output-on-failure
  except:
    - tags
  artifacts:
    expire_in: 1 week
    when: on_failure
    paths:
      - obj/
