language: c

matrix:
  fast_finish: true
  include:
    # OS X Mavericks
    - name: (macOS) General Test
      os: osx
      compiler: clang
      script:
        - make   # test library build
        - make clean
        - make test MOREFLAGS='-Werror -Wconversion -Wno-sign-conversion' | tee # test scenario where `stdout` is not the console

    # Container-based 12.04 LTS Server Edition 64 bit (doesn't support 32-bit includes)
    - name: (Precise) benchmark test
      dist: precise
      script:
        - make -C tests test-lz4 test-lz4c test-fullbench

    - name: (Precise) frame and fuzzer test
      dist: precise
      install:
        - sudo sysctl -w vm.mmap_min_addr=4096
      script:
        - make -C tests test-frametest test-fuzzer

    - name: ASAN tests with fuzzer and frametest
      install:
        - sudo sysctl -w vm.mmap_min_addr=4096
      script:
        - CC=clang MOREFLAGS=-fsanitize=address make -C tests test-frametest test-fuzzer

    - name: Custom LZ4_DISTANCE_MAX ; lz4-wlib (CLI linked to dynamic library); LZ4_USER_MEMORY_FUNCTIONS
      script:
        - MOREFLAGS=-DLZ4_DISTANCE_MAX=8000 make check
        - make clean
        - make -C programs lz4-wlib
        - make clean
        - make -C tests fullbench-wmalloc  # test LZ4_USER_MEMORY_FUNCTIONS
        - make clean
        - CC="c++ -Wno-deprecated" make -C tests fullbench-wmalloc  # stricter function signature check

    - name: (Precise) g++ and clang CMake test
      dist: precise
      script:
        - make gpptest
        - make clean
        - make examples
        - make clean cmake
        - make clean travis-install
        - make clean clangtest

    - name: x32 compatibility test
      addons:
        apt:
          packages:
            - gcc-multilib
      script:
        - make -C tests test MOREFLAGS=-mx32

    # 14.04 LTS Server Edition 64 bit
    # presume clang >= v3.9.0
    - name: (Trusty) USan test
      dist: trusty
      compiler: clang
      script:
        - make usan MOREFLAGS=-Wcomma -Werror

    - name: (Trusty) valgrind test
      dist: trusty
      install:
        - sudo apt-get install -qq valgrind
      script:
        - make c_standards
        - make -C tests test-lz4 test-mem

    - name: (Trusty) c-to-c++ test
      dist: trusty
      script:
        - make ctocpptest

    - name: (Trusty) i386 benchmark + version test
      dist: trusty
      install:
        - sudo apt-get install -qq python3 libc6-dev-i386 gcc-multilib
      script:
        - make -C tests test-lz4c32 test-fullbench32 versionsTest

    - name: (Trusty) i386 frame + fuzzer test
      dist: trusty
      install:
        - sudo apt-get install -qq libc6-dev-i386 gcc-multilib
        - sudo sysctl -w vm.mmap_min_addr=4096
      script:
        - make -C tests test-frametest32 test-fuzzer32

    - name: (Trusty) gcc-6 standard C compilation
      dist: trusty
      addons:
        apt:
          sources:
            - ubuntu-toolchain-r-test
          packages:
            - gcc-6
      env:
        - CC=gcc-6
      script:
        - make c_standards
        - make -C tests test-lz4 MOREFLAGS=-Werror

    - name: (Trusty) arm + aarch64 compilation
      dist: trusty
      install:
        - sudo apt-get install -qq
            qemu-system-arm
            qemu-user-static
            gcc-arm-linux-gnueabi
            libc6-dev-armel-cross
            gcc-aarch64-linux-gnu
            libc6-dev-arm64-cross
      script:
        - make platformTest CC=arm-linux-gnueabi-gcc QEMU_SYS=qemu-arm-static
        - make platformTest CC=aarch64-linux-gnu-gcc QEMU_SYS=qemu-aarch64-static

    - name: aarch64 real-hw tests
      arch: arm64
      script:
        - make test

    - name: PPC64LE real-hw tests
      arch: ppc64le
      script:
        - make test

    - name: IBM s390x real-hw tests
      arch: s390x
      script:
        - make test

    - name: (Xenial) gcc-5 compilation
      dist: xenial
      install:
        - sudo apt-get install -qq libc6-dev-i386 gcc-multilib
      script:
        - make -C tests test-lz4 clean test-lz4c32 MOREFLAGS=-Werror

    - name: (Trusty) clang-3.8 compilation
      dist: trusty
      addons:
        apt:
          sources:
            - ubuntu-toolchain-r-test
            - llvm-toolchain-precise-3.8
          packages:
            - clang-3.8
      script:
        - make -C tests test-lz4 CC=clang-3.8

    - name: (Trusty) PowerPC + PPC64 compilation
      dist: trusty
      install:
        - sudo apt-get install -qq qemu-system-ppc qemu-user-static gcc-powerpc-linux-gnu
      script:
        - make platformTest CC=powerpc-linux-gnu-gcc QEMU_SYS=qemu-ppc-static
        - make platformTest CC=powerpc-linux-gnu-gcc QEMU_SYS=qemu-ppc64-static MOREFLAGS=-m64

    - name: (Trusty) scan-build + cppcheck
      dist: trusty
      compiler: clang
      install:
        - sudo apt-get install -qq cppcheck
      script:
        - make staticAnalyze
        - make cppcheck

    - name: (Trusty) gcc-4.4 compilation
      dist: trusty
      addons:
        apt:
          sources:
            - ubuntu-toolchain-r-test
          packages:
            - libc6-dev-i386
            - gcc-multilib
            - gcc-4.4
      script:
        - make clean all CC=gcc-4.4 MOREFLAGS=-Werror
        - make clean
        - CFLAGS=-fPIC LDFLAGS='-pie -fPIE -D_FORTIFY_SOURCE=2' make -C programs

    # tag-specific test
    - name: tag build
      if: tag =~ ^v[0-9]\.[0-9]
      os: linux
      script:
        - make -C tests checkTag
        - tests/checkTag "$TRAVIS_BRANCH"

    - name: (Xenial) Meson + clang build
      #env: ALLOW_FAILURES=true
      dist: xenial
      language: cpp
      compiler: clang
      install:
        - sudo apt-get install -qq python3 tree
        - |
          travis_retry curl -o ~/ninja.zip -L 'https://github.com/ninja-build/ninja/releases/download/v1.9.0/ninja-linux.zip' &&
          unzip ~/ninja.zip -d ~/.local/bin
        - |
          travis_retry curl -o ~/get-pip.py 'https://bootstrap.pypa.io/get-pip.py' &&
          python3 ~/get-pip.py --user &&
          pip3 install --user meson
      script:
        - |
          meson setup \
            --buildtype=debug \
            -Db_lundef=false \
            -Dauto_features=enabled \
            -Ddefault_library=both \
            -Dbin_programs=true \
            -Dbin_contrib=true \
            -Dbin_tests=true \
            -Dbin_examples=true \
            contrib/meson build
        - pushd build
        - DESTDIR=./staging ninja install
        - tree ./staging

    # oss-fuzz compilation test
    - name: Compile OSS-Fuzz targets
      script:
        - ./ossfuzz/travisoss.sh

  allow_failures:
    - env: ALLOW_FAILURES=true
