language: c

# Dump CPU info before start
before_install:
  - cat /proc/cpuinfo || echo /proc/cpuinfo is not present

matrix:
  fast_finish: true
  include:

    - name: General linux x64 tests
      arch: amd64
      addons:
        apt:
          packages:
            - g++-multilib
            - gcc-multilib
            - cppcheck
      script:
        - make -B test-all
        - make clean
        - CFLAGS="-Werror" MOREFLAGS="-Wno-sign-conversion" make dispatch  # removing sign conversion warnings due to a bug in gcc-5's definition of some AVX512 intrinsics
        - make clean
        - CFLAGS="-O1 -mavx512f -Werror" make
        - make clean
        - CFLAGS="-Wall -Wextra -Werror" make DISPATCH=1
        - make clean
        - CFLAGS="-std=c90 -pedantic -Wno-long-long -Werror" make xxhsum  # check C90 + long long compliance
        - make c90test # strict c90, with no long long support; resulting in no XXH64_* symbol
        - make noxxh3test # check library can be compiled with XXH_NO_XXH3, resulting in no XXH3_* symbol


    - name: Check results consistency on x64
      arch: amd64
      script:
        - CPPFLAGS=-DXXH_VECTOR=XXH_SCALAR make check   # Scalar code path
        - make clean
        - CPPFLAGS=-DXXH_VECTOR=XXH_SSE2 make check   # SSE2 code path
        - make clean
        - CPPFLAGS="-mavx2 -DXXH_VECTOR=XXH_AVX2" make check   # AVX2 code path
        - make clean
        - CPPFLAGS="-mavx512f -DXXH_VECTOR=XXH_AVX512" make check   # AVX512 code path
        - make clean
        - CPPFLAGS=-DXXH_REROLL=1 make check   # reroll code path (#240)
        - make -C tests/bench

    - name: macOS General Test
      os: osx
      compiler: clang
      script:
        - CFLAGS="-Werror" make   # test library build
        - make clean
        - make test MOREFLAGS='-Werror' | tee # test scenario where `stdout` is not the console

    - name: ARM compilation and consistency checks (Qemu)
      dist: xenial
      arch: amd64
      addons:
        apt:
          packages:
            - qemu-system-arm
            - qemu-user-static
            - gcc-arm-linux-gnueabi
            - libc6-dev-armel-cross
      script:
        # arm (32-bit)
        - CC=arm-linux-gnueabi-gcc CPPFLAGS=-DXXH_VECTOR=XXH_SCALAR LDFLAGS=-static RUN_ENV=qemu-arm-static make check   # Scalar code path
        - make clean
        # NEON (32-bit)
        - CC=arm-linux-gnueabi-gcc CPPFLAGS=-DXXH_VECTOR=XXH_NEON CFLAGS="-O3 -march=armv7-a -fPIC -mfloat-abi=softfp -mfpu=neon-vfpv4" LDFLAGS=-static RUN_ENV=qemu-arm-static make check   # NEON code path

    - name: aarch64 compilation and consistency checks
      dist: xenial
      arch: arm64
      script:
        # aarch64
        - CPPFLAGS=-DXXH_VECTOR=XXH_SCALAR make check   # Scalar code path
        # NEON (64-bit)
        - make clean
        - CPPFLAGS=-DXXH_VECTOR=XXH_NEON make check   # NEON code path
        # clang
        - make clean
        - CC=clang CPPFLAGS=-DXXH_VECTOR=XXH_SCALAR make check   # Scalar code path
        # clang + NEON
        - make clean
        - CC=clang CPPFLAGS=-DXXH_VECTOR=XXH_NEON make check   # NEON code path

    # We need Bionic here because the QEMU versions shipped in the older repos
    # do not support POWER8 emulation, and compiling QEMU from source is a pain.
    - name: PowerPC + PPC64 compilation and consistency checks (Qemu on Bionic)
      dist: bionic
      arch: amd64
      addons:
        apt:
          packages:
            - qemu-system-ppc
            - qemu-user-static
            - gcc-powerpc-linux-gnu
            - gcc-powerpc64-linux-gnu
            - libc6-dev-powerpc-cross
            - libc6-dev-ppc64-cross
      script:
        - CC=powerpc-linux-gnu-gcc RUN_ENV=qemu-ppc-static LDFLAGS=-static make check   # Scalar code path
        - make clean
        - CC=powerpc64-linux-gnu-gcc RUN_ENV=qemu-ppc64-static CPPFLAGS=-DXXH_VECTOR=XXH_SCALAR CFLAGS="-O3" LDFLAGS="-static -m64" make check   # Scalar code path
        # VSX code
        - make clean
        - CC=powerpc64-linux-gnu-gcc RUN_ENV="qemu-ppc64-static -cpu power8" CPPFLAGS=-DXXH_VECTOR=XXH_VSX CFLAGS="-O3 -maltivec -mvsx -mcpu=power8 -mpower8-vector" LDFLAGS="-static -m64" make check   # VSX code path
        # altivec.h redefinition issue #426
        - make clean
        - CC=powerpc64-linux-gnu-gcc CPPFLAGS=-DXXH_VECTOR=XXH_VSX CFLAGS="-maltivec -mvsx -mcpu=power8 -mpower8-vector" make -C tests test_ppc_redefine

    - name: PPC64LE compilation and consistency checks
      dist: xenial
      arch: ppc64le
      script:
        # Scalar (universal) code path
        - CPPFLAGS=-DXXH_VECTOR=XXH_SCALAR LDFLAGS=-static make check
        # VSX code path (64-bit)
        - make clean
        - CPPFLAGS=-DXXH_VECTOR=XXH_VSX CFLAGS="-O3 -maltivec -mvsx -mpower8-vector -mcpu=power8" LDFLAGS="-static" make check
        # altivec.h redefinition issue #426
        - make clean
        - CPPFLAGS=-DXXH_VECTOR=XXH_VSX CFLAGS="-maltivec -mvsx -mcpu=power8 -mpower8-vector" make -C tests test_ppc_redefine

    - name: IBM s390x compilation and consistency checks
      dist: bionic
      arch: s390x
      script:
        # Scalar (universal) code path
        - CPPFLAGS=-DXXH_VECTOR=XXH_SCALAR LDFLAGS=-static make check
        # s390x code path (64-bit)
        - make clean
        - CPPFLAGS=-DXXH_VECTOR=XXH_VSX CFLAGS="-O3 -march=arch11 -mzvector" LDFLAGS="-static" make check

    - name: cmake build test
      script:
        - cd cmake_unofficial
        - mkdir build
        - cd build
        - cmake ..
        - CFLAGS=-Werror make
