image: "flowdalic/debian-testing-dev:1.5"

before_script:
  - |
    readarray TOOLS <<EOF
    c++
    cc
    clang
    clang++
    clang-tidy
    doxygen
    g++
    gcc
    include-what-you-use
    meson
    nasm
    valgrind
    EOF
    for tool in ${TOOLS[@]}; do
      echo -n "$tool version: "
      $tool --version
    done

variables:
  BUILDDTYPE: debugoptimized
  CC: gcc
  CXX: g++
  EXTRA_NINJA_ARGS: -v
  EMPER_IO: "false"

stages:
  - smoke-test
  - test

smoke-test-suite:
  stage: smoke-test
  script: make smoke-test-suite

fast-static-analysis:
   stage: smoke-test
   script: make fast-static-analysis
   variables:
       EMPER_IO: "true"

iwyu:
   stage: smoke-test
   script: make iwyu
   variables:
       EMPER_IO: "true"

clang-tidy:
   stage: smoke-test
   script: make tidy
   variables:
       EMPER_IO: "true"

.test:
  stage: test
  script:
    - make test

.gcc:
  variables:
    CC: gcc
    CXX: g++

.clang:
  variables:
    CC: clang
    CXX: clang++

.emper-ws-scheduling:
  variables:
    EMPER_DEFAULT_SCHEDULING_STRATEGY: "work_stealing"

.emper-laws-scheduling:
  variables:
    EMPER_DEFAULT_SCHEDULING_STRATEGY: "locality_aware_work_stealing"

.emper-worker-no-sleep:
  variables:
    EMPER_WORKER_SLEEP: 'false'

.emper-worker-stats:
  variables:
    EMPER_WORKER_STATS: 'true'

.emper-userspace-rcu:
  variables:
    EMPER_USERSPACE_RCU: 'true'

.default-library-static:
  variables:
    EMPER_DEFAULT_LIBRARY: 'static'

.clang-sanitizer:
  extends:
    - .clang
    - .default-library-static
  variables:
    # Clang's sanitizers require undefined symbols to be allowed when
    # linking. See also:
    # - https://github.com/mesonbuild/meson/issues/764
    # - https://mesonbuild.com/Builtin-options.html
    EMPER_B_LUNDEF: 'false'


.clang-sanitizer-undefined:
  extends:
    - .clang-sanitizer
  variables:
    EMPER_B_SANITIZE: 'undefined'

#.clang-sanitizer-memory:
#  extends:
#    - .clang-sanitizer
#  variables:
#    EMPER_B_SANITIZE: 'memory'

#.sanitizer-address:
#  extends:
#    - .default-library-static
#  variables:
#    EMPER_B_SANITIZE: 'address'

.release-build:
  variables:
    BUILDTYPE: release

.debug-build:
  variables:
    BUILDTYPE: debug

.worker-wakeup-strategy-all:
  variables:
    EMPER_WORKER_WAKEUP_STRATEGY: "all"

.do-not-log-timestamp:
  variables:
    EMPER_LOG_TIMESTAMP: "false"

.locked-ws-queues:
  variables:
    EMPER_LOCKED_WS_QUEUE: "true"

.futex-wakeup-semaphore:
  variables:
    EMPER_WAKEUP_SEMAPHORE_IMPLEMENTATION: "futex"

.locked-wakeup-semaphore:
  variables:
    EMPER_WAKEUP_SEMAPHORE_IMPLEMENTATION: "locked"

test-gcc:
  extends:
    - .test
    - .gcc

test-gcc-release:
  extends:
    - test-gcc
    - .release-build

test-gcc-debug:
  extends:
    - test-gcc
    - .debug-build

test-clang:
  extends:
    - .test
    - .clang

test-clang-release:
  extends:
    - test-clang
    - .release-build

test-clang-debug:
  extends:
    - test-clang
    - .debug-build

test-worker-no-sleep:
  extends:
    - .test
    - .emper-worker-no-sleep

test-with-stats:
  extends:
    - .test
    - .emper-worker-stats

test-with-userspace-rcu:
  extends:
    - .test
    - .emper-userspace-rcu

test-clang-sanitizer-undefined:
  extends:
    - .test
    - .clang-sanitizer-undefined

#test-clang-sanitizer-memory:
#  extends:
#    - .test
#    - .clang-sanitizer-memory

#test-clang-sanitizer-address:
#  extends:
#    - .test
#    - .clang
#    - .sanitizer-address

test-laws:
  extends:
    - .test
    - .emper-laws-scheduling

test-laws-release:
  extends:
    - test-laws
    - .release-build

test-worker-wakeup-strategy-all:
  extends:
    - .test
    - .worker-wakeup-strategy-all

test-do-not-log-timestamp:
  extends:
    - .test
    - .do-not-log-timestamp

test-locked-ws-queues:
  extends:
    - .test
    - .locked-ws-queues

test-futex-wakeup-semaphore:
  extends:
    - .test
    - .futex-wakeup-semaphore

test-locked-wakeup-semaphore:
  extends:
    - .test
    - .locked-wakeup-semaphore
