ebcc-sys 0.1.0

Low-level Rust bindings to the EBCC compressor
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
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

  check-x32:
    runs-on: ubuntu-20.04  # ubuntu-latest == ubuntu-22.04 have issues currently with x32
    steps:
    - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
    - name: make check on x32 ABI # https://en.wikipedia.org/wiki/X32_ABI
      env:
        CHECK_CONSTRAINED_MEM: true
      run: |
        sudo apt update
        APT_PACKAGES="gcc-multilib" make apt-install
        CFLAGS="-mx32 -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: |
        FUZZERTEST=-T1mn ZSTREAM_TESTTIME=-T1mn make cmakebuild V=1

  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: zlib wrapper test
      run: |
        sudo apt-get -qqq update
        make valgrindinstall
        make -C zlibWrapper test
        make -C zlibWrapper test-valgrind

  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-tests-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-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: ${{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
          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 builddir
          ninja -C builddir/
          meson test -C builddir/ --print-errorlogs
          meson install -C builddir --destdir staging/

  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"
    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 -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-20.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-arm,    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: |
        LDFLAGS="-static -z force-bti" MOREFLAGS="-mbranch-protection=standard" CC=$XCC QEMU_SYS=$XEMU make clean check
        LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check
    - 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@cc11e9188b693c2b100158c3322424c4cc1dadea # tag=v2.22.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@006ad0b0946ca6d0a3ea2d4437677fa767392401 # tag=master
      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

  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

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

  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

  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


# Failing tests, for reference

# icc tests are currently failing on Github Actions, likely to issues during installation stage
#
#  icc:
#    name: icc-check
#    runs-on: ubuntu-latest
#    steps:
#    - name: install icc
#      run: |
#        export DEBIAN_FRONTEND=noninteractive
#        sudo apt-get -qqq update
#        sudo apt-get install -y wget build-essential pkg-config cmake ca-certificates gnupg
#        sudo wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2023.PUB
#        sudo apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS-2023.PUB
#        sudo add-apt-repository "deb https://apt.repos.intel.com/oneapi all main"
#        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: |
#        make CC=/opt/intel/oneapi/compiler/latest/linux/bin/intel64/icc check