name: dev-short-tests
# Faster tests: mostly build tests, along with some other
# misc tests

concurrency:
  group: fast-${{ github.ref }}
  cancel-in-progress: true

on:
  pull_request:
    branches: [ dev, release, actionsTest ]

permissions: read-all

jobs:
  linux-kernel:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: linux kernel, library + build + test
      run: make -C contrib/linux-kernel test CFLAGS="-Werror -Wunused-const-variable -Wunused-but-set-variable"

  benchmarking:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: make benchmarking
      run: make benchmarking

  check-32bit: # designed to catch https://github.com/facebook/zstd/issues/2428
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: make check on 32-bit
      run: |
        sudo apt update
        APT_PACKAGES="gcc-multilib" make apt-install
        CFLAGS="-m32 -O1 -fstack-protector" make check V=1

  build-c89:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: ensure zstd can be build with c89/c90 compilers (+ long long support + variadic macros)
      run: |
        make c89build V=1

  build-zstd-dll:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: build zstd bin against a dynamic lib (debuglevel for more dependencies)
      run: |
        make -C lib lib-mt-release
        DEBUGLEVEL=2 make -C programs zstd-dll

  gcc-7-libzstd:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: gcc-7 + libzstdmt compilation
      # See https://askubuntu.com/a/1428822
      run: |
        echo "deb [arch=amd64] http://archive.ubuntu.com/ubuntu focal main universe" | sudo tee -a /etc/apt/sources.list
        sudo apt-get -qqq update
        make gcc7install
        CC=gcc-7 CFLAGS=-Werror make -j all
        make clean
        LDFLAGS=-Wl,--no-undefined make -C lib libzstd-mt

    # candidate test (for discussion) : underlink test
    # LDFLAGS=-Wl,--no-undefined : will make the linker fail if dll is underlinked

  cmake-build-and-test-check:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: cmake build and test
      run: |
        sudo apt install liblzma-dev
        FUZZERTEST=-T1mn ZSTREAM_TESTTIME=-T1mn make cmakebuild V=1

  cmake-source-directory-with-spaces:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        include:
          - os: ubuntu-latest
            generator: "Unix Makefiles"
          - os: windows-latest
            generator: "NMake Makefiles"
          - os: macos-latest
            generator: "Unix Makefiles"
    env:
      SRC_DIR: "source directory with spaces"
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
      with:
        path: "${{ env.SRC_DIR }}"
    - uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0
      if: ${{ matrix.generator == 'NMake Makefiles' }}
    - name: cmake build on a source directory with spaces
      run: |
        cmake -S "${{ env.SRC_DIR }}/build/cmake" -B build -DBUILD_TESTING=ON -G "${{ matrix.generator }}" -DCMAKE_BUILD_TYPE=Release --install-prefix "${{ runner.temp }}/install"
        cmake --build build --config Release
        cmake --install build --config Release

  cpp-gnu90-c99-compatibility:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: C++, gnu90 and c99 compatibility
      run: |
        make cxxtest
        make clean
        make gnu90build
        make clean
        make c99build
        make clean
        make travis-install   # just ensures `make install` works

  mingw-cross-compilation:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: mingw cross-compilation
      run: |
        # sudo update-alternatives --set x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++-posix; (doesn't work)
        sudo apt-get -qqq update
        sudo apt-get install gcc-mingw-w64
        CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ CFLAGS="-Werror -O1" make zstd

  armbuild:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: ARM Build Test
      run: |
        sudo apt-get -qqq update
        make arminstall
        make armbuild

  bourne-shell:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: Bourne shell compatibility (shellcheck)
      run: |
        wget https://github.com/koalaman/shellcheck/releases/download/v0.7.1/shellcheck-v0.7.1.linux.x86_64.tar.xz
        tar -xf shellcheck-v0.7.1.linux.x86_64.tar.xz
        shellcheck-v0.7.1/shellcheck --shell=sh --severity=warning --exclude=SC2010 tests/playTests.sh

  zlib-wrapper:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: install valgrind
      run: |
        sudo apt-get -qqq update
        make valgrindinstall V=1
    - name: zlib wrapper test
      run: make -C zlibWrapper test V=1
    - name: zlib wrapper test under valgrind
      run: make -C zlibWrapper test-valgrind V=1

  lz4-threadpool-libs:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: LZ4, thread pool, and libs build testslib wrapper test
      run: |
        make lz4install
        make -C tests test-lz4
        make check < /dev/null | tee   # mess with lz4 console detection
        make clean
        make -C tests test-pool
        make clean
        bash tests/libzstd_builds.sh

  gcc-make-all-avx2:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: Make all, with AVX2
      run: |
        sudo apt-get -qqq update
        make libc6install
        CFLAGS="-Werror -mavx2" make -j all

  gcc-make-all-32bit:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: Make all, 32bit mode
      run: |
        sudo apt-get -qqq update
        make libc6install
        CFLAGS="-Werror -m32" make -j all32

  gcc-make-all-32bit-avx2:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: Make all, 32bit + AVX2 mode
      run: |
        sudo apt-get -qqq update
        make libc6install
        CPPFLAGS="-DSTATIC_BMI2=1" CFLAGS="-Werror -m32 -mavx2 -mbmi2" make -j all32


  gcc-8-make:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
      - name: gcc-8 build
        # See https://askubuntu.com/a/1428822
        run: |
          echo "deb [arch=amd64] http://archive.ubuntu.com/ubuntu focal main universe" | sudo tee -a /etc/apt/sources.list
          sudo apt-get -qqq update
          make gcc8install
          CC=gcc-8 CFLAGS="-Werror" make -j all

  make-external-compressors:
    strategy:
      matrix:
        include:
          - name: "no external compressors"
            flags: "HAVE_ZLIB=0 HAVE_LZ4=0 HAVE_LZMA=0"
          - name: "only zlib"
            flags: "HAVE_ZLIB=1 HAVE_LZ4=0 HAVE_LZMA=0"
          - name: "only lz4"
            flags: "HAVE_ZLIB=0 HAVE_LZ4=1 HAVE_LZMA=0"
          - name: "only lzma"
            flags: "HAVE_ZLIB=0 HAVE_LZ4=0 HAVE_LZMA=1"
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
      - name: Build with ${{matrix.name}}
        run: |
          sudo apt install liblzma-dev
          ${{matrix.flags}} make zstd


  implicit-fall-through:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
      - name: -Wimplicit-fallthrough build
        run: |
          make clean
          CC=gcc MOREFLAGS="-Werror -Wimplicit-fallthrough=2 -O0" make -C lib -j libzstd.a ZSTD_LEGACY_SUPPORT=0
          make clean
          CC=clang MOREFLAGS="-Werror -Wimplicit-fallthrough -O0" make -C lib -j libzstd.a ZSTD_LEGACY_SUPPORT=0

  meson-linux:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
      - name: Install packages
        run: |
          sudo apt-get update
          sudo apt-get -y install build-essential python3-pip ninja-build liblz4-dev liblzma-dev
          pip install --pre meson
      - name: Build with Meson
        run: |
          meson setup \
            --buildtype=debugoptimized \
            -Db_lundef=false \
            -Dauto_features=enabled \
            -Dbin_programs=true \
            -Dbin_tests=true \
            -Dbin_contrib=true \
            -Ddefault_library=both \
            build/meson mesonBuild
          ninja -C mesonBuild/
          meson test -C mesonBuild/ --print-errorlogs
          meson install -C mesonBuild --destdir staging/

  meson-mingw-cross-compilation:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
      - name: Install packages
        run: |
          sudo apt-get -qqq update
          sudo apt-get -y install build-essential python3-pip ninja-build {gcc,g++}-mingw-w64-x86-64
          pip install --pre meson
      - name: Build with Meson
        run: |
          cat > cross.ini <<EOF
          [binaries]
          ar = 'x86_64-w64-mingw32-ar'
          c = 'x86_64-w64-mingw32-gcc'
          cpp = 'x86_64-w64-mingw32-g++'
          ld = 'x86_64-w64-mingw32-ld'
          objcopy = 'x86_64-w64-mingw32-objcopy'
          objdump = 'x86_64-w64-mingw32-objdump'
          strip = 'x86_64-w64-mingw32-strip'
          windres = 'x86_64-w64-mingw32-windres'

          [host_machine]
          system = 'windows'
          endian = 'little'
          cpu_family = 'x86_64'
          cpu = 'x86_64'
          EOF

          # pzstd doesn't build; skip -Dbin_contrib=true
          meson setup \
            --buildtype=debugoptimized \
            --cross-file=cross.ini \
            -Db_lundef=false \
            -Dbin_programs=true \
            -Dbin_tests=true \
            -Ddefault_library=both \
            build/meson builddir
          ninja -C builddir/
          if grep -- -pthread builddir/meson-private/libzstd.pc; then
            echo "Error: found stray pthread dependency"
            exit 1
          fi

  meson-windows:
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
      - name: Install packages
        run: pip install --pre meson
      - name: Configure with Meson
        run: |
          meson setup --vsenv build/meson/ builddir -Dbin_tests=true -Dbin_programs=true -Dbin_contrib=true
      - name: Build with Meson
        run: |
          meson compile -C builddir/
      - name: Test with Meson
        run: |
          meson test -C builddir/ --print-errorlogs
      - name: Install with Meson
        run: |
          meson install -C builddir --destdir staging/

  cmake-visual-2022:
    strategy:
      matrix:
        include:
          - generator: "Visual Studio 17 2022"
            flags: "-A x64"
          - generator: "Visual Studio 17 2022"
            flags: "-A Win32"
          - generator: "MinGW Makefiles"
          - generator: "Visual Studio 17 2022"
            flags: "-T ClangCL"
          - generator: "Visual Studio 17 2022"
            flags: "-T ClangCL -A x64 -DCMAKE_C_FLAGS=/arch:AVX2"
    runs-on: windows-2022
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: Add MSBuild to PATH
      uses: microsoft/setup-msbuild@6fb02220983dee41ce7ae257b6f4d8f9bf5ed4ce # tag=v2.0.0
    - name: Build & Test
      working-directory: ${{env.GITHUB_WORKSPACE}}
      run: |
        cd build\cmake
        mkdir build
        cd build
        cmake.exe -G "${{matrix.generator}}" ${{matrix.flags}} -DCMAKE_BUILD_TYPE=Debug -DCMAKE_COMPILE_WARNING_AS_ERROR=ON -DZSTD_BUILD_TESTS:BOOL=ON -DZSTD_ZSTREAM_FLAGS=-T30s -DZSTD_FUZZER_FLAGS=-T30s -DZSTD_FULLBENCH_FLAGS=-i0 ..
        cmake.exe --build .
        ctest.exe -V -C Debug

  msbuild-visual-studio:
    strategy:
      fail-fast: false  # 'false' means Don't stop matrix workflows even if some matrix failed.
      matrix:
        include: [
          { name: "VS 2022 x64 Debug", platform: x64, configuration: Debug, toolset: v143, runner: "windows-2022", arch: "" },
          { name: "VS 2022 Win32 Debug", platform: Win32, configuration: Debug, toolset: v143, runner: "windows-2022", arch: "" },
          { name: "VS 2022 x64 Release", platform: x64, configuration: Release, toolset: v143, runner: "windows-2022", arch: ""},
          { name: "VS 2022 Win32 Release", platform: Win32, configuration: Release, toolset: v143, runner: "windows-2022", arch: ""},
          { name: "VS 2019 x64 Release", platform: Win32, configuration: Release, toolset: v142, runner: "windows-2019", arch: ""},
          { name: "VS 2019 Win32 Release", platform: x64, configuration: Release, toolset: v142, runner: "windows-2019", arch: ""},
          { name: "VS 2022 x64 Release AVX2", platform: x64, configuration: Release, toolset: v143, runner: "windows-2022", arch: "AdvancedVectorExtensions2" },
        ]
    runs-on: ${{matrix.runner}}
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: Add MSBuild to PATH
      uses: microsoft/setup-msbuild@6fb02220983dee41ce7ae257b6f4d8f9bf5ed4ce # tag=v2.0.0
    - name: Build ${{matrix.name}}
      working-directory: ${{env.GITHUB_WORKSPACE}}
      # See https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference
      if: ${{ matrix.arch == '' }}
      run: >
        msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=${{matrix.toolset}}
        /t:Clean,Build /p:Platform=${{matrix.platform}} /p:Configuration=${{matrix.configuration}} /warnaserror
    - name: Build ${{matrix.name}}
      working-directory: ${{env.GITHUB_WORKSPACE}}
      # See https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference
      if: ${{ matrix.arch != '' }}
      run: >
        msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=${{matrix.toolset}}
        /t:Clean,Build /p:Platform=${{matrix.platform}} /p:Configuration=${{matrix.configuration}} /warnaserror
        /p:InstructionSet=${{matrix.arch}}

  # This tests that we don't accidentally grow the size too much.
  # If the size grows intentionally, you can raise these numbers.
  # But we do need to think about binary size, since it is a concern.
  libzstd-size:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: libzstd size test
      run: |
        make clean && make -j -C lib libzstd && ./tests/check_size.py lib/libzstd.so 1100000
        make clean && make -j -C lib libzstd ZSTD_LIB_COMPRESSION=0 ZSTD_LIB_DICTBUILDER=0 && ./tests/check_size.py lib/libzstd.so 400000
        make clean && make -j -C lib libzstd ZSTD_LIB_MINIFY=1 && ./tests/check_size.py lib/libzstd.so 300000
        make clean && make -j -C lib libzstd ZSTD_LIB_MINIFY=1 ZSTD_LIB_COMPRESSION=0 ZSTD_LIB_DICTBUILDER=0 && ./tests/check_size.py lib/libzstd.so 80000

  minimal-decompressor-macros:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: minimal decompressor macros
      run: |
        make clean && make -j all ZSTD_LIB_MINIFY=1 MOREFLAGS="-Werror"
        make clean && make check ZSTD_LIB_MINIFY=1 MOREFLAGS="-Werror"
        make clean && make -j all MOREFLAGS="-Werror -DHUF_FORCE_DECOMPRESS_X1 -DZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT"
        make clean && make check MOREFLAGS="-Werror -DHUF_FORCE_DECOMPRESS_X1 -DZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT"
        make clean && make -j all MOREFLAGS="-Werror -DHUF_FORCE_DECOMPRESS_X2 -DZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG"
        make clean && make check MOREFLAGS="-Werror -DHUF_FORCE_DECOMPRESS_X2 -DZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG"
        make clean && make -j all MOREFLAGS="-Werror -DZSTD_NO_INLINE -DZSTD_STRIP_ERROR_STRINGS"
        make clean && make check MOREFLAGS="-Werror -DZSTD_NO_INLINE -DZSTD_STRIP_ERROR_STRINGS"
        make clean && make check ZSTD_LIB_EXCLUDE_COMPRESSORS_DFAST_AND_UP=1 MOREFLAGS="-Werror"
        make clean && make check ZSTD_LIB_EXCLUDE_COMPRESSORS_GREEDY_AND_UP=1 MOREFLAGS="-Werror"

  dynamic-bmi2:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: dynamic bmi2 tests
      run: |
        make clean && make -j check MOREFLAGS="-O0 -Werror -mbmi2"
        make clean && make -j check MOREFLAGS="-O0 -Werror -DDYNAMIC_BMI2=1"
        make clean && make -j check MOREFLAGS="-O0 -Werror -DDYNAMIC_BMI2=1 -mbmi2"
        make clean && make -j check MOREFLAGS="-O0 -Werror -DDYNAMIC_BMI2=0"
        make clean && make -j check MOREFLAGS="-O0 -Werror -DDYNAMIC_BMI2=0 -mbmi2"

  test-variants:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: make all variants & validate
      run: |
        make -j -C programs allVariants MOREFLAGS=-O0
        ./tests/test-variants.sh

  qemu-consistency:
    name: QEMU ${{ matrix.name }}
    runs-on: ubuntu-24.04
    strategy:
      fail-fast: false  # 'false' means Don't stop matrix workflows even if some matrix failed.
      matrix:
        include: [
          { name: ARM,      xcc_pkg: gcc-arm-linux-gnueabi,     xcc: arm-linux-gnueabi-gcc,     xemu_pkg: qemu-system-arm,    xemu: qemu-arm-static     },
          { name: ARM64,    xcc_pkg: gcc-aarch64-linux-gnu,     xcc: aarch64-linux-gnu-gcc,     xemu_pkg: qemu-system-aarch64,xemu: qemu-aarch64-static },
          { name: PPC,      xcc_pkg: gcc-powerpc-linux-gnu,     xcc: powerpc-linux-gnu-gcc,     xemu_pkg: qemu-system-ppc,    xemu: qemu-ppc-static     },
          { name: PPC64LE,  xcc_pkg: gcc-powerpc64le-linux-gnu, xcc: powerpc64le-linux-gnu-gcc, xemu_pkg: qemu-system-ppc,    xemu: qemu-ppc64le-static },
          { name: S390X,    xcc_pkg: gcc-s390x-linux-gnu,       xcc: s390x-linux-gnu-gcc,       xemu_pkg: qemu-system-s390x,  xemu: qemu-s390x-static   },
          { name: MIPS,     xcc_pkg: gcc-mips-linux-gnu,        xcc: mips-linux-gnu-gcc,        xemu_pkg: qemu-system-mips,   xemu: qemu-mips-static    },
          { name: RISC-V,   xcc_pkg: gcc-riscv64-linux-gnu,     xcc: riscv64-linux-gnu-gcc,     xemu_pkg: qemu-system-riscv64,xemu: qemu-riscv64-static },
          { name: M68K,     xcc_pkg: gcc-m68k-linux-gnu,        xcc: m68k-linux-gnu-gcc,        xemu_pkg: qemu-system-m68k,   xemu: qemu-m68k-static    },
          { name: SPARC,    xcc_pkg: gcc-sparc64-linux-gnu,     xcc: sparc64-linux-gnu-gcc,     xemu_pkg: qemu-system-sparc,  xemu: qemu-sparc64-static },
        ]
    env:                        # Set environment variables
      XCC: ${{ matrix.xcc }}
      XEMU: ${{ matrix.xemu }}
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: apt update & install
      run: |
        sudo apt-get update
        sudo apt-get install gcc-multilib g++-multilib qemu-utils qemu-user-static
        sudo apt-get install ${{ matrix.xcc_pkg }} ${{ matrix.xemu_pkg }}
    - name: Environment info
      run: |
        echo && which $XCC
        echo && $XCC --version
        echo && $XCC -v  # Show built-in specs
        echo && which $XEMU
        echo && $XEMU --version
    - name: ARM
      if: ${{ matrix.name == 'ARM' }}
      run: |
        LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check
    - name: ARM64
      if: ${{ matrix.name == 'ARM64' }}
      run: |
        make clean
        LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make -j check
# This test is only compatible with standard libraries that support BTI (Branch Target Identification).
# Unfortunately, the standard library provided on Ubuntu 24.04 does not have this feature enabled.
#        make clean
#        LDFLAGS="-static -z force-bti" MOREFLAGS="-mbranch-protection=standard" CC=$XCC QEMU_SYS=$XEMU make check V=1
    - name: PPC
      if: ${{ matrix.name == 'PPC' }}
      run: |
        LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check
    - name: PPC64LE
      if: ${{ matrix.name == 'PPC64LE' }}
      run: |
        LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check
    - name: S390X
      if: ${{ matrix.name == 'S390X' }}
      run: |
        LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check
    - name: MIPS
      if: ${{ matrix.name == 'MIPS' }}
      run: |
        LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check
    - name: RISC-V
      if: ${{ matrix.name == 'RISC-V' }}
      run: |
        LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check
    - name: M68K
      if: ${{ matrix.name == 'M68K' }}
      run: |
        LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check
    - name: SPARC
      if: ${{ matrix.name == 'SPARC' }}
      run: |
        LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check

  mingw-short-test:
    runs-on: windows-latest
    strategy:
      fail-fast: false  # 'false' means Don't stop matrix workflows even if some matrix failed.
      matrix:
        include: [
          { compiler: gcc, msystem: MINGW32, cflags: "-Werror"},
          { compiler: gcc, msystem: MINGW64, cflags: "-Werror"},
          { compiler: clang, msystem: MINGW64, cflags: "--target=x86_64-w64-mingw32 -Werror -Wconversion -Wno-sign-conversion -Wno-unused-command-line-argument"},
        ]
    defaults:
      run:
        shell: msys2 {0}
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - uses: msys2/setup-msys2@d44ca8e88d8b43d56cf5670f91747359d5537f97 # tag=v2.26.0
      with:
        msystem: ${{ matrix.msystem }}
        install: make diffutils
        update: true
    # Based on https://ariya.io/2020/07/on-github-actions-with-msys2
    - name: install mingw gcc i686
      if: ${{ (matrix.msystem == 'MINGW32') && (matrix.compiler == 'gcc') }}
      run: pacman --noconfirm -S mingw-w64-i686-gcc
    - name: install mingw gcc x86_64
      if: ${{ (matrix.msystem == 'MINGW64') && (matrix.compiler == 'gcc') }}
      run: pacman --noconfirm -S mingw-w64-x86_64-gcc
    - name: install mingw clang i686
      if: ${{ (matrix.msystem == 'MINGW32') && (matrix.compiler == 'clang') }}
      run: pacman --noconfirm -S mingw-w64-i686-clang
    - name: install mingw clang x86_64
      if: ${{ (matrix.msystem == 'MINGW64') && (matrix.compiler == 'clang') }}
      run: pacman --noconfirm -S mingw-w64-x86_64-clang
    - name: run mingw tests
      run: |
        make -v
        export CC=${{ matrix.compiler }}
        $CC --version
        CFLAGS="${{ matrix.cflags }}" make -j allzstd
        echo "Testing $CC ${{ matrix.msystem }}"
        make clean
        MSYS="" make check

  visual-runtime-tests:
    runs-on: windows-latest
    strategy:
      matrix:
        platform: [x64, Win32]
        configuration: [Release]
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: Add MSBuild to PATH
      uses: microsoft/setup-msbuild@6fb02220983dee41ce7ae257b6f4d8f9bf5ed4ce # tag=v2.0.0
    - name: Build and run tests
      working-directory: ${{env.GITHUB_WORKSPACE}}
      env:
        ZSTD_BIN: ./zstd.exe
        DATAGEN_BIN: ./datagen.exe
      # See https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference
      run: |
        msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v142 /t:Clean,Build /p:Platform=${{matrix.platform}} /p:Configuration=${{matrix.configuration}}
        COPY build\VS2010\bin\${{matrix.platform}}_${{matrix.configuration}}\*.exe tests\
        CD tests
        sh -e playTests.sh
        .\fuzzer.exe -T2m

  # Following instructions at: https://github.com/marketplace/actions/install-cygwin-action
  cygwin-tests:
    runs-on: windows-latest
    steps:
    - run: git config --global core.autocrlf input
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - uses: cygwin/cygwin-install-action@f61179d72284ceddc397ed07ddb444d82bf9e559 # tag=v5
      with:
        platform: x86_64
        packages: >-
          autoconf,
          automake,
          gcc-g++,
          make,
          mingw64-x86_64-gcc-g++,
          patch,
          perl
    - name: cygwin tests
      shell: C:\cygwin\bin\bash.exe --noprofile --norc -eo pipefail '{0}'
      run: >-
        export PATH=/usr/bin:$(cygpath ${SYSTEMROOT})/system32 &&
        export CFLAGS="-Werror -O1" &&
        ls &&
        make -j allzstd &&
        make -C tests fuzzer &&
        ./tests/fuzzer.exe -v -T1m
    - name: cygwin install test
      shell: C:\cygwin\bin\bash.exe --noprofile --norc -eo pipefail '{0}'
      run: >-
        make -j &&
        make install

  pkg-config:
    runs-on: ubuntu-latest
    container:
      image: debian:testing
    steps:
      - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
      - name: Install dependencies
        run: |
          apt -y update
          apt -y install --no-install-recommends gcc libc6-dev make pkg-config
      - name: Build and install
        run: make -C lib install
      - name: Test pkg-config
        run: |
          cc -Wall -Wextra -Wpedantic -Werror -o simple examples/simple_compression.c $(pkg-config --cflags --libs libzstd)
          ./simple LICENSE

  versions-compatibility:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: Versions Compatibility Test
      run: |
        make -C tests versionsTest

  clangbuild:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: make clangbuild
      run: |
        make clangbuild

  gcc-pgo:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: Build PGO Zstd with GCC
      env:
        CC: gcc
      run: |
        make -C programs zstd-pgo
        ./programs/zstd -b

  clang-pgo:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: Build PGO Zstd with Clang
      env:
        CC: clang
      run: |
        sudo apt install -y llvm
        llvm-profdata --version
        make -C programs zstd-pgo
        ./programs/zstd -b

  intel-cet-compatibility:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: Build Zstd
      run: |
        make -j zstd V=1
        readelf -n zstd
    - name: Get Intel SDE
      run: |
        curl -LO https://downloadmirror.intel.com/813591/sde-external-9.33.0-2024-01-07-lin.tar.xz
        tar xJvf sde-external-9.33.0-2024-01-07-lin.tar.xz
    - name: Configure Permissions
      run: |
        echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
    - name: Run Under SDE
      run: |
        sde-external-9.33.0-2024-01-07-lin/sde -cet -cet-raise 0 -cet-endbr-exe -cet-stderr -cet-abort -- ./zstd -b3

  icx:
    # install instructions: https://www.intel.com/content/www/us/en/docs/oneapi/installation-guide-linux/2025-0/apt-005.html
    name: icx-check
    runs-on: ubuntu-latest
    steps:
    - name: install icx
      run: |
        # download the key to system keyring
        wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB \
        | gpg --dearmor | sudo tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null

        # add signed entry to apt sources and configure the APT client to use Intel repository:
        echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list
        sudo apt-get update
        sudo apt-get install -y intel-basekit intel-hpckit
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: make check
      run: |
        source /opt/intel/oneapi/setvars.sh
        make CC=icx check
