#############################################################################
#                                                                           #
#      Travis-ci test-suite for LibTomMath                                  #
#      (https://github.com/libtom/libtommath.git)                           #
#                                                                           #
#############################################################################

# The Ubuntu version we're going to use to run the tests
dist: bionic

# Compilation failures are in gcc_errors_*.log
# Failed tests in test_*.log
# Files do not exist in case of success
after_failure:
  - cat test_*.log
  - cat valgrind_test.log
  - cat gcc_errors_*.log

# In case of a Travis error a success might get signaled
# even without any test run. This file also keeps any notes
# printed from the tests which might come handy from time
# to time.
# Valgrid will print its output to stderr which will not show up
# in test_*.log. testme.sh accepts one additional option to
# valgrind and "--valgrind-options=--log-fd=1" sends the output
# of Valgrind to stdout instead.
after_success:
  - cat test_*.log

# Tests restricted to the following branches of LTM.
branches:
  only:
    - master
    - develop
    - /^release/
    - /^support/
    - /^travis/

# Additional installs: Valgrind for memory tests.
install:
  - sudo apt-get update -qq
  - sudo apt-get install valgrind
  - apt-cache search gcc | grep '^gcc-[0-9\.]* '
  - apt-cache search clang | grep compiler

# The language is C and it will load the respective dependencies
language: c

# The actual workspace. Will run the individual jobs in parallel
# which also means that the jobs must be able to run in parallel.
# Either specify sets which will be combined or, as in this case,
# specify all builds individually. The number of jobs is currently
# restricted to 200 jobs at most.
matrix:
  # Will mark as finished if all of the remaining tests are allowed to fail
  # or one test has failed already.
  fast_finish: true

  # The individual jobs
  include:
    # The environment given to the programs in the build
    # We have only one program and the variable $BUILDOPTIONS
    # has only the options to that program: testme.sh

    # Check c89 <-> c99 roundtrip
    - env: BUILDOPTIONS='--c89-c99-roundtrip'

    # Check source code format
    - env: BUILDOPTIONS='--format'
      addons:
        apt:
          packages:
            - astyle

    # Check public symbols of dynamic libraries
    - env: BUILDOPTIONS='--symbols'
      addons:
        apt:
          packages:
            - libtool-bin

    # Run always with valgrind (no sanitizer, but debug info)
    - env: COMPILE_DEBUG=1 BUILDOPTIONS='--with-cc=gcc --with-m64 --with-valgrind'

    # Shared library build
    - env: COMPILE_LTO=1 BUILDOPTIONS='--with-cc=gcc --make-option=-f --make-option=makefile.shared'
      addons:
        apt:
          packages:
            - gcc-8
            - libtool-bin

    # GCC for the 32-bit architecture (no valgrind)
    - env: BUILDOPTIONS='--with-cc=gcc --with-m32'
      addons:
        apt:
          packages:
            - libc6-dev-i386
            - gcc-multilib

    # clang for the 32-bit architecture (no valgrind)
    - env: BUILDOPTIONS='--with-cc=clang-7 --with-m32'
      addons:
        apt:
          packages:
            - libc6-dev-i386
            - gcc-multilib

    # RSA superclass with tests (no sanitizer, but debug info)
    - env: COMPILE_DEBUG=1 BUILDOPTIONS='--with-cc=gcc-5 --with-m64 --cflags=-DLTM_NOTHING --cflags=-DSC_RSA_1_WITH_TESTS --with-travis-valgrind'

    # Test "autotuning", the automatic evaluation and setting of the Toom-Cook cut-offs.
    #- env: SANITIZER=1 BUILDOPTIONS='--with-cc=gcc-5 --cflags=-DMP_16BIT --with-travis-valgrind --make-option=tune'
    #- env: SANITIZER=1 BUILDOPTIONS='--with-cc=gcc-5 --cflags=-DMP_32BIT --with-travis-valgrind --make-option=tune'
    #- env: SANITIZER=1 BUILDOPTIONS='--with-cc=gcc-5 --with-travis-valgrind --make-option=tune'
    #- env: SANITIZER=1 BUILDOPTIONS='--with-cc=clang-7 --cflags=-DMP_16BIT --with-travis-valgrind --make-option=tune'
    #- env: SANITIZER=1 BUILDOPTIONS='--with-cc=clang-7 --cflags=-DMP_32BIT --with-travis-valgrind --make-option=tune'
    - env: SANITIZER=1 BUILDOPTIONS='--with-cc=clang-7 --with-travis-valgrind --make-option=tune'

    # GCC for the x86-64 architecture testing against a different Bigint-implementation
    # with 333333 different inputs.
    #- env: BUILDOPTIONS='--with-cc=gcc --test-vs-mtest=333333 --with-travis-valgrind'
    # ...  and a better random source.
    - env: BUILDOPTIONS='--with-cc=gcc --test-vs-mtest=333333 --mtest-real-rand --with-travis-valgrind'

    # clang for the x86-64 architecture testing against a different Bigint-implementation
    # with 333333 different inputs
    - env: BUILDOPTIONS='--with-cc=clang-7 --test-vs-mtest=333333 --with-travis-valgrind'
    # ...  and a better random source.
    #- env: BUILDOPTIONS='--with-cc=clang-7 --test-vs-mtest=333333 --mtest-real-rand --with-travis-valgrind'

    # GCC for the x64_32 architecture (32-bit longs and 32-bit pointers)
    # TODO: Probably not possible to run anything in x32 in Travis
    #       but needs to be checked to be sure.
    - env: SANITIZER=1 BUILDOPTIONS='--with-cc=gcc --with-mx32'
      addons:
        apt:
          packages:
            - libc6-dev-x32
            - gcc-multilib

    # GCC for the x86-64 architecture (64-bit longs and 64-bit pointers)
    - env: SANITIZER=1 BUILDOPTIONS='--with-cc=gcc --with-m64 --with-travis-valgrind'
    - env: BUILDOPTIONS='--with-cc=gcc-5 --with-m64 --with-travis-valgrind'
      addons:
        apt:
          packages:
            - gcc-5
    - env: BUILDOPTIONS='--with-cc=gcc-4.8 --with-m64 --with-travis-valgrind'
      addons:
        apt:
          packages:
            - gcc-4.8

    # clang for x86-64 architecture (64-bit longs and 64-bit pointers)
    - env: SANITIZER=1 CONV_WARNINGS=relaxed BUILDOPTIONS='--with-cc=clang-7 --with-m64 --with-travis-valgrind'
    - env: SANITIZER=1 CONV_WARNINGS=strict BUILDOPTIONS='--with-cc=clang-7 --with-m64 --with-travis-valgrind'
    - env: SANITIZER=1 CONV_WARNINGS=strict BUILDOPTIONS='--with-cc=clang-7 --cflags=-DMP_USE_MEMOPS --with-m64 --with-travis-valgrind'
    - env: SANITIZER=1 CONV_WARNINGS=strict BUILDOPTIONS='--with-cc=clang-7 --c89 --with-m64 --with-travis-valgrind'
    - env: SANITIZER=1 BUILDOPTIONS='--with-cc=clang-7 --with-m64 --with-travis-valgrind --cflags=-DMP_PREC=MP_MIN_PREC'
    - env: SANITIZER=1 BUILDOPTIONS='--with-cc=clang-10 --with-m64 --with-travis-valgrind'
      addons:
        apt:
          packages:
            - clang-10
    - env: SANITIZER=1 BUILDOPTIONS='--with-cc=clang-9 --with-m64 --with-travis-valgrind'
      addons:
        apt:
          packages:
            - clang-9
    - env: SANITIZER=1 BUILDOPTIONS='--with-cc=clang-8 --with-m64 --with-travis-valgrind'
      addons:
        apt:
          packages:
            - clang-8
    - env: SANITIZER=1 BUILDOPTIONS='--with-cc=clang-6.0 --with-m64 --with-travis-valgrind'
      addons:
        apt:
          packages:
            - clang-6.0
    - env: SANITIZER=1 BUILDOPTIONS='--with-cc=clang-5.0 --with-m64 --with-travis-valgrind'
      addons:
        apt:
          packages:
            - clang-5.0
    - env: BUILDOPTIONS='--with-cc=clang-4.0 --with-m64 --with-travis-valgrind'
      addons:
        apt:
          packages:
            - clang-4.0

    # Link time optimization
    - env: SANITIZER=1 COMPILE_LTO=1 BUILDOPTIONS='--with-cc=gcc --with-m64 --with-travis-valgrind'
    #- env: SANITIZER=1 COMPILE_LTO=1 BUILDOPTIONS='--with-cc=clang-7 --with-m64 --with-travis-valgrind'

    # GCC for the x86-64 architecture with restricted limb sizes
    # formerly started with the option "--with-low-mp" to testme.sh
    # but testing all three in one run took to long and timed out.
    - env: SANITIZER=1 BUILDOPTIONS='--with-cc=gcc --cflags=-DMP_16BIT --with-travis-valgrind'
    - env: SANITIZER=1 BUILDOPTIONS='--with-cc=gcc --cflags=-DMP_32BIT --with-travis-valgrind'

    # clang for the x86-64 architecture with restricted limb sizes
    - env: SANITIZER=1 BUILDOPTIONS='--with-cc=clang --cflags=-DMP_16BIT --with-travis-valgrind'
    - env: SANITIZER=1 BUILDOPTIONS='--with-cc=clang --cflags=-DMP_32BIT --with-travis-valgrind'

# Notifications go to
# An email address is also possible.
notifications:
  irc: "chat.freenode.net#libtom-notifications"

# The actual script the jobs run.
# Because of a default timeout of 10 minutes it was necessary to use
# a Travis tool to extend that timeout to 40 minutes. 50 minutes
# seem to be the max and 20 the default if travis_wait is called without
# any options.
script:
  - ./testme.sh ${BUILDOPTIONS}
