blob: cee45603d4217102af6b01a71556f4c6bbaaad27 [file]
name: CMake
on: [workflow_call, workflow_dispatch]
env:
TERM: xterm-256color
GTEST_COLOR: 1
jobs:
cmake:
name: ${{ matrix.name }}
runs-on: ${{ matrix.os }}
defaults:
run:
shell: ${{ matrix.shell || 'bash' }}
timeout-minutes: 80
strategy:
fail-fast: false
matrix:
include:
- name: Ubuntu GCC ASAN
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cxxflags: -Wno-maybe-uninitialized
cmake-args: -DWITH_SANITIZER=Address -DWITH_BENCHMARKS=ON
coverage: ubuntu_gcc
- name: Ubuntu GCC Native Instructions
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DWITH_NATIVE_INSTRUCTIONS=ON
coverage: ubuntu_gcc_native_inst
- name: Ubuntu GCC Native Instructions (AVX)
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DWITH_NATIVE_INSTRUCTIONS=ON -DNATIVE_ARCH_OVERRIDE="-mavx -mpclmul"
coverage: ubuntu_gcc_native_inst_avx
- name: Ubuntu GCC Symbol Prefix -O3
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DZLIB_SYMBOL_PREFIX=zTest_ -DWITH_BENCHMARKS=ON
cflags: -O3
# Skipping coverage to allow -O3
- name: Ubuntu GCC Compat Symbol Prefix
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DZLIB_COMPAT=ON -DZLIB_SYMBOL_PREFIX=zTest_ -DWITH_BENCHMARKS=ON
coverage: ubuntu_gcc_compat_sprefix
- name: Ubuntu GCC -O1 UBSAN
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DWITH_SANITIZER=Undefined
cflags: -O1
# Skipping coverage to allow -O1
- name: Ubuntu GCC 32-bit
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DCMAKE_C_FLAGS=-m32 -DCMAKE_CXX_FLAGS=-m32 -DCMAKE_SHARED_LINKER_FLAGS=-m32 -DCMAKE_EXE_LINKER_FLAGS=-m32 -DWITH_BENCHMARKS=ON
packages: gcc-multilib g++-multilib
coverage: ubuntu_gcc_m32
- name: Ubuntu GCC C17 MMAP
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DCMAKE_C_STANDARD=17
cflags: -DUSE_MMAP
coverage: ubuntu_gcc_c17_mmap
- name: Ubuntu GCC C23 REDUCED_MEM
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DCMAKE_C_STANDARD=23 -DWITH_REDUCED_MEM=ON
coverage: ubuntu_gcc_c23_reduced_mem
- name: Ubuntu GCC No Chorba
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DWITH_CHORBA=OFF
coverage: ubuntu_gcc_no_chorba
- name: Ubuntu GCC SSE2 UBSAN
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DWITH_SSSE3=OFF -DWITH_SSE42=OFF -DWITH_AVX2=OFF -DWITH_AVX512=OFF -DWITH_SANITIZER=Undefined
coverage: ubuntu_gcc_sse2
- name: Ubuntu GCC SSSE3 UBSAN
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DWITH_SSE42=OFF -DWITH_AVX2=OFF -DWITH_AVX512=OFF -DWITH_SANITIZER=Undefined
coverage: ubuntu_gcc_ssse3
- name: Ubuntu GCC SSE4.2 UBSAN
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DWITH_AVX2=OFF -DWITH_AVX512=OFF -DWITH_SANITIZER=Undefined
coverage: ubuntu_gcc_sse42
- name: Ubuntu GCC No PCLMULQDQ UBSAN
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DWITH_PCLMULQDQ=OFF -DWITH_SANITIZER=Undefined
coverage: ubuntu_gcc_no_pclmulqdq
- name: Ubuntu GCC No AVX512VNNI UBSAN
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DWITH_AVX512VNNI=OFF -DWITH_SANITIZER=Undefined
coverage: ubuntu_gcc_no_avx512vnni
- name: Ubuntu GCC Compat No Opt ASAN
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DZLIB_COMPAT=ON -DWITH_NEW_STRATEGIES=OFF -DWITH_OPTIM=OFF -DWITH_SANITIZER=Address
cflags: -DNOT_TWEAK_COMPILER
coverage: ubuntu_gcc_compat_no_opt
- name: Ubuntu GCC ARM SF
os: ubuntu-24.04-arm
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-arm.cmake
packages: qemu-user crossbuild-essential-armel
gcov-exec: arm-linux-gnueabi-gcov
coverage: ubuntu_gcc_armsf
- name: Ubuntu GCC ARM SF Compat No Opt
os: ubuntu-24.04-arm
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-arm.cmake -DZLIB_COMPAT=ON -DWITH_NEW_STRATEGIES=OFF -DWITH_OPTIM=OFF
packages: qemu-user crossbuild-essential-armel
gcov-exec: arm-linux-gnueabi-gcov
coverage: ubuntu_gcc_armsf_compat_no_opt
- name: Ubuntu GCC ARM HF ASAN
os: ubuntu-24.04-arm
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-armhf.cmake -DWITH_BENCHMARKS=ON -DWITH_SANITIZER=Address
cxxflags: -Wno-psabi -Wno-maybe-uninitialized
asan-options: detect_leaks=0
packages: qemu-user crossbuild-essential-armhf
gcov-exec: arm-linux-gnueabihf-gcov
coverage: ubuntu_gcc_armhf_asan
- name: Ubuntu GCC ARM HF No Neon No ARMv8 ASAN
os: ubuntu-24.04-arm
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-armhf.cmake -DWITH_NEON=OFF -DWITH_ARMV8=OFF -DWITH_SANITIZER=Address
asan-options: detect_leaks=0
packages: qemu-user crossbuild-essential-armhf
gcov-exec: arm-linux-gnueabihf-gcov
coverage: ubuntu_gcc_armhf_no_neon_no_armv8
- name: Ubuntu GCC ARM HF Compat UBSAN
os: ubuntu-24.04-arm
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-armhf.cmake -DZLIB_COMPAT=ON -DWITH_SANITIZER=Undefined
packages: qemu-user crossbuild-essential-armhf
gcov-exec: arm-linux-gnueabihf-gcov
coverage: ubuntu_gcc_armhf_compat_ubsan
- name: Ubuntu GCC AARCH64 ASAN
os: ubuntu-24.04-arm
cmake-args: -DWITH_BENCHMARKS=ON -DWITH_SANITIZER=Address
asan-options: detect_leaks=0
coverage: ubuntu_gcc_aarch64_asan
- name: Ubuntu GCC AARCH64 Compat UBSAN
os: ubuntu-24.04-arm
cmake-args: -DZLIB_COMPAT=ON -DWITH_SANITIZER=Undefined
coverage: ubuntu_gcc_aarch64_compat_ubsan
- name: Ubuntu Clang AARCH64 MSAN
os: ubuntu-24.04-arm
compiler: clang
cxx-compiler: clang++
cmake-args: -DWITH_SANITIZER=Memory
# Coverage disabled, causes MSAN errors
- name: Ubuntu GCC MIPS
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-mips.cmake
packages: qemu-user crossbuild-essential-mips
gcov-exec: mips-linux-gnu-gcov
coverage: ubuntu_gcc_mips
- name: Ubuntu GCC MIPS64
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-mips64.cmake -DWITH_BENCHMARKS=ON
packages: qemu-user crossbuild-essential-mips64
gcov-exec: mips64-linux-gnuabi64-gcov
coverage: ubuntu_gcc_mips64
- name: Ubuntu GCC PPC
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc.cmake
packages: qemu-user crossbuild-essential-powerpc
gcov-exec: powerpc-linux-gnu-gcov
coverage: ubuntu_gcc_ppc
- name: Ubuntu GCC PPC No Power8
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc.cmake -DWITH_POWER8=OFF
packages: qemu-user crossbuild-essential-powerpc
gcov-exec: powerpc-linux-gnu-gcov
coverage: ubuntu_gcc_ppc_no_power8
- name: Ubuntu GCC PPC64
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc64.cmake -DWITH_BENCHMARKS=ON
packages: qemu-user gcc-powerpc64-linux-gnu g++-powerpc64-linux-gnu libc-dev-ppc64-cross
ldflags: -static
gcov-exec: powerpc64-linux-gnu-gcov
coverage: ubuntu_gcc_ppc64
- name: Ubuntu GCC PPC64 Power9
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc64-power9.cmake
packages: qemu-user gcc-powerpc64-linux-gnu g++-powerpc64-linux-gnu libc-dev-ppc64-cross
ldflags: -static
gcov-exec: powerpc64-linux-gnu-gcov
coverage: ubuntu_gcc_ppc64_power9
- name: Ubuntu Clang PPC64 Power9
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc64-clang.cmake
packages: qemu-user clang binutils-powerpc64-linux-gnu libgcc-11-dev-ppc64-cross libc-dev-ppc64-cross libstdc++-11-dev-ppc64-cross
# Coverage disabled for clang on power9, errors
- name: Ubuntu GCC PPC64LE
os: ubuntu-latest
# gtest illegal instruction (related? https://bugs.launchpad.net/qemu/+bug/1781281)
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc64le.cmake -DWITH_GTEST=OFF
packages: qemu-user crossbuild-essential-ppc64el
gcov-exec: powerpc64le-linux-gnu-gcov
# mcpu required to test power8 with qemu-ppc64le -cpu power8 (see issue 1378)
cflags: -mcpu=power8
cxxflags: -mcpu=power8
coverage: ubuntu_gcc_ppc64le
- name: Ubuntu GCC PPC64LE No VSX
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc64le-power9.cmake -DWITH_POWER8=OFF -DWITH_POWER9=OFF
packages: qemu-user crossbuild-essential-ppc64el
gcov-exec: powerpc64le-linux-gnu-gcov
coverage: ubuntu_gcc_ppc64le_novsx
- name: Ubuntu GCC PPC64LE Power9
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc64le-power9.cmake
packages: qemu-user crossbuild-essential-ppc64el
gcov-exec: powerpc64le-linux-gnu-gcov
coverage: ubuntu_gcc_ppc64le_power9
- name: Ubuntu Clang PPC64LE Power9
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc64le-clang.cmake
packages: qemu-user crossbuild-essential-ppc64el
# Coverage disabled for clang on power9, errors
- name: Ubuntu GCC RISC-V
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-riscv.cmake -DWITH_BENCHMARKS=ON
packages: qemu-user crossbuild-essential-riscv64
gcov-exec: riscv64-linux-gnu-gcov
coverage: ubuntu_gcc_riscv64
- name: Ubuntu Clang RISC-V
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-riscv-clang.cmake
packages: qemu-user crossbuild-essential-riscv64
# Coverage disabled for clang on riscv, errors
- name: Ubuntu GCC 14 LoongArch64
os: ubuntu-latest
cmake-args: -DCOMPILER_SUFFIX=-14 -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-loongarch64-gcc.cmake -DWITH_BENCHMARKS=ON
packages: qemu-user gcc-14-loongarch64-linux-gnu g++-14-loongarch64-linux-gnu libc-dev-loong64-cross
ldflags: -static
gcov-exec: loongarch64-linux-gnu-gcov-14
coverage: ubuntu_gcc14_loongarch64
- name: Ubuntu GCC 14 LoongArch64 No LASX
os: ubuntu-latest
cmake-args: -DCOMPILER_SUFFIX=-14 -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-loongarch64-gcc.cmake -DWITH_BENCHMARKS=ON -DWITH_LASX=OFF
packages: qemu-user gcc-14-loongarch64-linux-gnu g++-14-loongarch64-linux-gnu libc-dev-loong64-cross
ldflags: -static
gcov-exec: loongarch64-linux-gnu-gcov-14
coverage: ubuntu_gcc14_loongarch64_no_lasx
- name: Ubuntu GCC SPARC64
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-sparc64.cmake
packages: qemu-user gcc-sparc64-linux-gnu g++-sparc64-linux-gnu libc-dev-sparc64-cross
ldflags: -static
gcov-exec: sparc64-linux-gnu-gcov
coverage: ubuntu_gcc_sparc64
- name: Ubuntu GCC S390x
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-s390x.cmake -DWITH_BENCHMARKS=ON
packages: qemu-user crossbuild-essential-s390x
ldflags: -static
gcov-exec: s390x-linux-gnu-gcov
coverage: ubuntu_gcc_s390x
- name: Ubuntu GCC S390X No VX optimizations
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-s390x.cmake -DWITH_S390_VX=OFF
packages: qemu-user crossbuild-essential-s390x
ldflags: -static
gcov-exec: s390x-linux-gnu-gcov
coverage: ubuntu_gcc_s390x_no_crc32
- name: ${{ github.repository == 'zlib-ng/zlib-ng' && 'EL10' || 'Ubuntu' }} GCC S390X DFLTCC Compat
os: ${{ github.repository == 'zlib-ng/zlib-ng' && 'z15' || 'ubuntu-latest' }}
compiler: gcc
cxx-compiler: g++
cmake-args: >-
${{ github.repository != 'zlib-ng/zlib-ng' && '-DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-s390x.cmake' || '' }}
-DWITH_DFLTCC_DEFLATE=ON -DWITH_DFLTCC_INFLATE=ON -DWITH_BENCHMARKS=ON -DZLIB_COMPAT=ON
packages: qemu-user gcc-s390x-linux-gnu g++-s390x-linux-gnu libc-dev-s390x-cross
ldflags: -static
gcov-exec: ${{ github.repository == 'zlib-ng/zlib-ng' && 'gcov' || 's390x-linux-gnu-gcov' }}
coverage: ${{ github.repository == 'zlib-ng/zlib-ng' && 'el10_gcc_s390x_dfltcc' || 'ubuntu_gcc_s390x_dfltcc' }}
- name: ${{ github.repository == 'zlib-ng/zlib-ng' && 'EL10 Clang S390X DFLTCC ASAN' || 'Ubuntu GCC S390X DFLTCC' }}
os: ${{ github.repository == 'zlib-ng/zlib-ng' && 'z15' || 'ubuntu-latest' }}
compiler: ${{ github.repository == 'zlib-ng/zlib-ng' && 'clang' || 'gcc' }}
cxx-compiler: ${{ github.repository == 'zlib-ng/zlib-ng' && 'clang++' || 'g++' }}
cmake-args: >-
${{ github.repository == 'zlib-ng/zlib-ng' && '-DWITH_SANITIZER=Address' || '-DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-s390x.cmake' }}
-DWITH_DFLTCC_DEFLATE=ON -DWITH_DFLTCC_INFLATE=ON
packages: qemu-user gcc-s390x-linux-gnu g++-s390x-linux-gnu libc-dev-s390x-cross
asan-options: detect_leaks=0
gcov-exec: ${{ github.repository == 'zlib-ng/zlib-ng' && 'llvm-cov gcov' || 's390x-linux-gnu-gcov' }}
coverage: ${{ github.repository == 'zlib-ng/zlib-ng' && 'el10_clang_s390x_dfltcc_asan' || 'ubuntu_gcc_s390x_dfltcc' }}
- name: ${{ github.repository == 'zlib-ng/zlib-ng' && 'EL10 Clang' || 'Ubuntu GCC' }} S390X DFLTCC UBSAN
os: ${{ github.repository == 'zlib-ng/zlib-ng' && 'z15' || 'ubuntu-latest' }}
compiler: ${{ github.repository == 'zlib-ng/zlib-ng' && 'clang' || 'gcc' }}
cxx-compiler: ${{ github.repository == 'zlib-ng/zlib-ng' && 'clang++' || 'g++' }}
cmake-args: >-
${{ github.repository != 'zlib-ng/zlib-ng' && '-DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-s390x.cmake' || '' }}
-DWITH_DFLTCC_DEFLATE=ON -DWITH_DFLTCC_INFLATE=ON -DWITH_SANITIZER=Undefined
packages: qemu-user gcc-s390x-linux-gnu g++-s390x-linux-gnu libc-dev-s390x-cross
gcov-exec: ${{ github.repository == 'zlib-ng/zlib-ng' && 'llvm-cov gcov' || 's390x-linux-gnu-gcov' }}
coverage: ${{ github.repository == 'zlib-ng/zlib-ng' && 'el10_clang_s390x_dfltcc_ubsan' || 'ubuntu_gcc_s390x_dfltcc_ubsan' }}
- name: ${{ github.repository == 'zlib-ng/zlib-ng' && 'EL10 Clang' || 'Ubuntu GCC' }} S390X DFLTCC ${{ (github.repository == 'zlib-ng/zlib-ng' && 'MSAN') || 'Compat' }}
os: ${{ github.repository == 'zlib-ng/zlib-ng' && 'z15' || 'ubuntu-latest' }}
compiler: ${{ github.repository == 'zlib-ng/zlib-ng' && 'clang' || 'gcc' }}
cxx-compiler: ${{ github.repository == 'zlib-ng/zlib-ng' && 'clang++' || 'g++' }}
cmake-args: >-
${{ github.repository == 'zlib-ng/zlib-ng' && '-GNinja -DWITH_SANITIZER=Memory' || '-DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-s390x.cmake -DZLIB_COMPAT=ON' }}
-DWITH_DFLTCC_DEFLATE=ON -DWITH_DFLTCC_INFLATE=ON
packages: qemu-user gcc-s390x-linux-gnu g++-s390x-linux-gnu libc-dev-s390x-cross
# Coverage disabled, causes MSAN errors
- name: Ubuntu Clang-15
os: ubuntu-latest
compiler: clang-15
cxx-compiler: clang++-15
cmake-args: -DCMAKE_LINKER_TYPE=LLD
packages: clang-15 lld
gcov-exec: llvm-cov-15 gcov
# Coverage disabled for clang-15, errors
- name: Ubuntu Clang C17 MMAP
os: ubuntu-latest
compiler: clang
cxx-compiler: clang++
cmake-args: -DCMAKE_LINKER_TYPE=LLD -DCMAKE_C_STANDARD=17
cflags: -DUSE_MMAP
packages: llvm-18 lld
gcov-exec: llvm-cov-18 gcov
coverage: ubuntu_clang_c17_mmap
- name: Ubuntu Clang-20 C23
os: ubuntu-latest
compiler: clang-20
cxx-compiler: clang++-20
cmake-args: -DCMAKE_LINKER_TYPE=LLD -DCMAKE_C_STANDARD=23
packages: clang-20 lld
# Coverage disabled for clang-20, errors
# Check for undefined symbols in the version script for the modern api
- name: Ubuntu Clang-20 Undefined Symbols
os: ubuntu-latest
compiler: clang-20
cxx-compiler: clang++-20
cmake-args: -DCMAKE_SHARED_LINKER_FLAGS="-fuse-ld=lld -Wl,--no-undefined-version" -DZLIBNG_ENABLE_TESTS=OFF
build-shared: 'ON'
packages: clang-20 lld
# Coverage disabled, no tests run
# Check for undefined symbols in the version script for the compat api
- name: Ubuntu Clang-20 Undefined Symbols Compat
os: ubuntu-latest
compiler: clang-20
cxx-compiler: clang++-20
cmake-args: -DCMAKE_SHARED_LINKER_FLAGS="-fuse-ld=lld -Wl,--no-undefined-version" -DZLIBNG_ENABLE_TESTS=OFF -DZLIB_COMPAT=ON
build-shared: 'ON'
packages: clang-20 lld
# Coverage disabled, no tests run
- name: Ubuntu Clang Inflate Strict REDUCED_MEM
os: ubuntu-latest
compiler: clang
cxx-compiler: clang++
cmake-args: -DWITH_INFLATE_STRICT=ON -DWITH_REDUCED_MEM=ON
packages: llvm-18
gcov-exec: llvm-cov-18 gcov
coverage: ubuntu_clang_inflate_strict_reduced_mem
- name: Ubuntu Clang Inflate Allow Invalid Dist
os: ubuntu-latest
compiler: clang
cxx-compiler: clang++
cmake-args: -DWITH_INFLATE_ALLOW_INVALID_DIST=ON
packages: llvm-18
gcov-exec: llvm-cov-18 gcov
coverage: ubuntu_clang_inflate_allow_invalid_dist
- name: Ubuntu Clang Compat Debug
os: ubuntu-latest
compiler: clang
cxx-compiler: clang++
cmake-args: -DZLIB_COMPAT=ON
packages: llvm-18
gcov-exec: llvm-cov-18 gcov
build-config: Debug
coverage: ubuntu_clang_compat_debug
- name: Ubuntu Clang-20 MSAN
os: ubuntu-latest
compiler: clang-20
cxx-compiler: clang++-20
cmake-args: -GNinja -DWITH_SANITIZER=Memory
packages: ninja-build clang-20 llvm-20 libclang-rt-20-dev
gcov-exec: llvm-cov-20 gcov
build-config: Debug
# https://github.com/llvm/llvm-project/issues/55785
msan-options: use_sigaltstack=0
# Coverage disabled for clang-20, errors
- name: Ubuntu Emscripten WASM32
os: ubuntu-latest
chost: wasm32
cmake-args: -DCMAKE_TOOLCHAIN_FILE=${EMSDK}/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_C_COMPILER_TARGET=wasm32 -DCMAKE_CROSSCOMPILING_EMULATOR=${EMSDK_NODE} -DZLIB_COMPAT=ON
# Coverage disabled for wasm
- name: Windows MSVC 2026 v145 Win64 C23
os: windows-2025-vs2026
compiler: cl
cmake-args: -G "Visual Studio 18 2026" -A x64 -T v145 -DCMAKE_C_STANDARD=23 -DWITH_BENCHMARKS=ON
# Coverage disabled for msvc
- name: Windows MSVC 2022 v143 Win32
os: windows-latest
compiler: cl
cmake-args: -G "Visual Studio 17 2022" -A Win32 -T v143
# Coverage disabled for msvc
- name: Windows MSVC 2022 v143 Win64
os: windows-latest
compiler: cl
cmake-args: -G "Visual Studio 17 2022" -A x64 -T v143
# Coverage disabled for msvc
- name: Windows MSVC 2022 v143 Win64 Native Instructions (AVX)
os: windows-latest
compiler: cl
cmake-args: -G "Visual Studio 17 2022" -A x64 -T v143 -DWITH_NATIVE_INSTRUCTIONS=ON -DNATIVE_ARCH_OVERRIDE=/arch:AVX
# Coverage disabled for msvc
- name: Windows MSVC 2022 v143 Win64 C17
os: windows-latest
compiler: cl
cmake-args: -G "Visual Studio 17 2022" -A x64 -T v143 -DCMAKE_C_STANDARD=17
# Coverage disabled for msvc
- name: Windows MSVC 2022 v142 Win32
os: windows-latest
compiler: cl
cmake-args: -G "Visual Studio 17 2022" -A Win32 -T v142
# Coverage disabled for msvc
- name: Windows MSVC 2022 v142 Win64
os: windows-latest
compiler: cl
cmake-args: -G "Visual Studio 17 2022" -A x64 -T v142
# Coverage disabled for msvc
- name: Windows MSVC 2022 v141 Win32
os: windows-2022
compiler: cl
cmake-args: -G "Visual Studio 17 2022" -A Win32 -T v141
# Coverage disabled for msvc
- name: Windows MSVC 2022 v141 Win64
os: windows-2022
compiler: cl
cmake-args: -G "Visual Studio 17 2022" -A x64 -T v141
# Coverage disabled for msvc
- name: Windows MSVC 2022 v140 Win32
os: windows-2022
compiler: cl
cmake-args: -G "Visual Studio 17 2022" -A Win32,version=10.0.14393.0 -T v140 -DCMAKE_SYSTEM_VERSION=10.0.14393.0
# Coverage disabled for msvc
- name: Windows MSVC 2022 v140 Win64
os: windows-2022
compiler: cl
cmake-args: -G "Visual Studio 17 2022" -A x64,version=10.0.14393.0 -T v140 -DCMAKE_SYSTEM_VERSION=10.0.14393.0
# Coverage disabled for msvc
- name: Windows MSVC ARM No Test
os: windows-latest
compiler: cl
cmake-args: -A ARM,version=10.0.22621.0
# Coverage disabled for msvc
- name: Windows MSVC ARM64
os: windows-11-arm
compiler: cl
cmake-args: -A ARM64
# Coverage disabled for msvc
- name: Windows MSVC ARM64EC
os: windows-11-arm
compiler: cl
cmake-args: -A ARM64EC
# Coverage disabled for msvc
- name: Windows ClangCl Win32
os: windows-latest
cmake-args: -T ClangCl -A Win32
# Coverage disabled for clangcl
- name: Windows ClangCl Win64
os: windows-latest
cmake-args: -T ClangCl -A x64
# Coverage disabled for clangcl
- name: Windows ClangCl Win64 Native Instructions (AVX)
os: windows-latest
cmake-args: -T ClangCl -A x64 -DWITH_NATIVE_INSTRUCTIONS=ON -DNATIVE_ARCH_OVERRIDE="-mavx -mpclmul"
# Coverage disabled for clangcl
- name: Windows GCC
os: windows-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -G Ninja
coverage: win64_gcc
- name: Windows GCC Native Instructions (AVX)
os: windows-2022
compiler: gcc
cxx-compiler: g++
cmake-args: -G Ninja -DWITH_NATIVE_INSTRUCTIONS=ON -DNATIVE_ARCH_OVERRIDE="-mavx -mpclmul"
coverage: win64_gcc_native_avx
- name: Windows GCC Compat No Opt
os: windows-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -G Ninja -DZLIB_COMPAT=ON -DWITH_NEW_STRATEGIES=OFF -DWITH_OPTIM=OFF
coverage: win64_gcc_compat_no_opt
- name: Windows GCC MinGW32
os: windows-latest
shell: msys2 {0}
compiler: i686-w64-mingw32-gcc
cxx-compiler: i686-w64-mingw32-g++
coverage: win32_gcc
- name: Windows GCC MinGW32 Compat
os: windows-latest
shell: msys2 {0}
compiler: i686-w64-mingw32-gcc
cxx-compiler: i686-w64-mingw32-g++
cmake-args: -DZLIB_COMPAT=ON
coverage: win32_gcc_compat
- name: macOS Clang (Intel, Target 10.10)
os: macos-15-intel
compiler: clang
cxx-compiler: clang++
cmake-args: -DCMAKE_OSX_DEPLOYMENT_TARGET=10.10 -DWITH_BENCHMARKS=ON
ldflags: -ld_classic
coverage: macos_clang_intel
- name: macOS Clang (Intel) ASAN
os: macos-15-intel
compiler: clang
cxx-compiler: clang++
cmake-args: -DWITH_SANITIZER=Address
coverage: macos_clang_intel_asan
- name: macOS Clang (Intel) UBSAN
os: macos-15-intel
compiler: clang
cxx-compiler: clang++
cmake-args: -DWITH_SANITIZER=Undefined
coverage: macos_clang_intel_ubsan
- name: macOS Clang (Intel) Native Instructions
os: macos-15-intel
compiler: clang
cxx-compiler: clang++
cmake-args: -DWITH_NATIVE_INSTRUCTIONS=ON
coverage: macos_clang_native_intel
- name: macOS Clang (ARM64) ASAN
os: macos-latest
compiler: clang
cxx-compiler: clang++
cmake-args: -DWITH_SANITIZER=Address
coverage: macos_clang_arm64
- name: macOS Clang (ARM64) UBSAN
os: macos-latest
compiler: clang
cxx-compiler: clang++
cmake-args: -DWITH_SANITIZER=Undefined
coverage: macos_clang_arm64_ubsan
- name: macOS Clang (ARM64) Native Instructions
os: macos-latest
compiler: clang
cxx-compiler: clang++
cmake-args: -DWITH_NATIVE_INSTRUCTIONS=ON
coverage: macos_clang_arm64_native
- name: Ubuntu LCC e2kv4
os: ubuntu-latest
cmake-args: -DWITH_BENCHMARKS=ON -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-e2k-lcc.cmake -DMCST_LCC_PREFIX=/opt/mcst/lcc-1.29.16.e2k-v4.linux-6.1 -DQEMU_CPU=elbrus-v4 -DBENCHMARK_ENABLE_WERROR=OFF -DBENCHMARK_FORCE_WERROR=OFF
toolchain: 1.29.16.e2k-v4.linux-6.1
cflags: -march=elbrus-v4
cxxflags: -march=elbrus-v4 -DBENCHMARK_HAS_NO_INLINE_ASSEMBLY
ldflags: -static
# Skipping coverage to allow optimized build
- name: Ubuntu LCC e2kv5
os: ubuntu-latest
cmake-args: -DWITH_BENCHMARKS=ON -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-e2k-lcc.cmake -DMCST_LCC_PREFIX=/opt/mcst/lcc-1.29.16.e2k-v5.linux-6.1 -DQEMU_CPU=elbrus-v5 -DBENCHMARK_ENABLE_WERROR=OFF -DBENCHMARK_FORCE_WERROR=OFF
toolchain: 1.29.16.e2k-v5.linux-6.1
cflags: -march=elbrus-v5
cxxflags: -march=elbrus-v5 -DBENCHMARK_HAS_NO_INLINE_ASSEMBLY
ldflags: -static
# Skipping coverage to allow optimized build
- name: Ubuntu LCC e2kv5 (coverage)
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-e2k-lcc.cmake -DMCST_LCC_PREFIX=/opt/mcst/lcc-1.29.16.e2k-v5.linux-6.1 -DQEMU_CPU=elbrus-v5
toolchain: 1.29.16.e2k-v5.linux-6.1
cflags: -march=elbrus-v5
cxxflags: -march=elbrus-v5
ldflags: -static
gcov-exec: /opt/mcst/lcc-1.29.16.e2k-v5.linux-6.1/gcov/bin/gcov
coverage: linux_mcst_lcc_e2kv5
- name: Ubuntu LCC e2kv6
os: ubuntu-latest
cmake-args: -DWITH_BENCHMARKS=ON -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-e2k-lcc.cmake -DMCST_LCC_PREFIX=/opt/mcst/lcc-1.29.16.e2k-v6.linux-6.1 -DQEMU_CPU=elbrus-v6 -DBENCHMARK_ENABLE_WERROR=OFF -DBENCHMARK_FORCE_WERROR=OFF
toolchain: 1.29.16.e2k-v6.linux-6.1
cflags: -march=elbrus-v6
cxxflags: -march=elbrus-v6 -DBENCHMARK_HAS_NO_INLINE_ASSEMBLY
ldflags: -static
# Skipping coverage to allow optimized build
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
show-progress: false
- name: Checkout test corpora
uses: actions/checkout@v6
# Don't test the extra corpora with Sanitizer builds or RISC-V or e2k, due to their slow testing.
if: ${{ !contains(matrix.name, 'RISC-V') && !contains(matrix.name, 'e2k') && !contains(matrix.cmake-args, 'WITH_SANITIZER') }}
with:
repository: zlib-ng/corpora
path: test/data/corpora
show-progress: false
- name: Setup MinGW32
if: runner.os == 'Windows' && contains(matrix.name, 'MinGW32')
uses: msys2/setup-msys2@v2
with:
update: true
msystem: MINGW32
install: >-
pkg-config
make
git
mingw-w64-i686-toolchain
mingw-w64-i686-cmake
- name: Add ubuntu mirrors
if: runner.os == 'Linux' && !contains(matrix.os, 'z15')
# Github Actions caching proxy is at times unreliable
run: |
echo -e 'http://azure.archive.ubuntu.com/ubuntu\tpriority:1\n' | sudo tee /etc/apt/mirrors.txt
curl http://mirrors.ubuntu.com/mirrors.txt | sudo tee --append /etc/apt/mirrors.txt
sudo sed -i 's#http://azure.archive.ubuntu.com/ubuntu/#mirror+file:/etc/apt/mirrors.txt#' /etc/apt/sources.list
- name: Install packages (Ubuntu)
if: runner.os == 'Linux' && !contains(matrix.os, 'z15')
run: |
sudo apt-get update
sudo apt-get install -y --allow-downgrades --no-install-recommends \
${{ matrix.packages || 'libgtest-dev libbenchmark-dev' }}
- name: Install packages (Windows)
if: runner.os == 'Windows'
shell: pwsh
run: |
# strawberryperl installs /c/Strawberry/c/bin/libstdc++-6.dll, which is incompatible with the mingw64 one.
# zlib-ng does not need perl, so simply remove it.
choco uninstall --no-progress strawberryperl
choco install --no-progress ninja ${{ matrix.packages }}
- name: Install Visual Studio toolset v140 (Windows)
if: contains(matrix.name, 'v140')
shell: pwsh
run: |
# Windows 10 SDK (10.0.14393.795)
# https://developer.microsoft.com/en-us/windows/downloads/sdk-archive/index-legacy
Invoke-WebRequest -Method Get -Uri https://go.microsoft.com/fwlink/p/?LinkId=838916 -OutFile sdksetup.exe -UseBasicParsing
Unblock-File sdksetup.exe
Start-Process -Wait sdksetup.exe -ArgumentList "/q", "/norestart", "/ceip off", "/features OptionId.WindowsSoftwareDevelopmentKit"
Set-Location "C:\Program Files (x86)\Microsoft Visual Studio\Installer\"
$InstallPath = "C:\Program Files\Microsoft Visual Studio\2022\Enterprise"
$componentsToInstall= @(
"Microsoft.VisualStudio.Component.VC.140"
)
[string]$workloadArgs = $componentsToInstall | ForEach-Object {" --add " + $_}
$Arguments = ('/c', "vs_installer.exe", 'modify', '--installPath', "`"$InstallPath`"",$workloadArgs, '--quiet', '--norestart', '--nocache')
# should be run twice
$process = Start-Process -FilePath cmd.exe -ArgumentList $Arguments -Wait -PassThru -WindowStyle Hidden
$process = Start-Process -FilePath cmd.exe -ArgumentList $Arguments -Wait -PassThru -WindowStyle Hidden
- name: Install Visual Studio toolset v141 (Windows)
if: contains(matrix.name, 'v141')
shell: pwsh
run: |
Set-Location "C:\Program Files (x86)\Microsoft Visual Studio\Installer\"
$InstallPath = "C:\Program Files\Microsoft Visual Studio\2022\Enterprise"
$componentsToInstall= @(
"Microsoft.VisualStudio.Component.VC.v141.x86.x64"
)
[string]$workloadArgs = $componentsToInstall | ForEach-Object {" --add " + $_}
$Arguments = ('/c', "vs_installer.exe", 'modify', '--installPath', "`"$InstallPath`"",$workloadArgs, '--quiet', '--norestart', '--nocache')
# should be run twice
$process = Start-Process -FilePath cmd.exe -ArgumentList $Arguments -Wait -PassThru -WindowStyle Hidden
$process = Start-Process -FilePath cmd.exe -ArgumentList $Arguments -Wait -PassThru -WindowStyle Hidden
- name: Install Windows 11 SDK (ARM)
shell: pwsh
if: contains(matrix.name, 'MSVC ARM ')
run: |
# Windows 11 SDK (10.0.22621.2428)
# https://developer.microsoft.com/en-us/windows/downloads/sdk-archive/index-legacy
Invoke-WebRequest -Method Get -Uri https://go.microsoft.com/fwlink/p/?LinkId=2250105 -OutFile sdksetup.exe -UseBasicParsing
Unblock-File sdksetup.exe
Start-Process -Wait sdksetup.exe -ArgumentList "/q", "/norestart", "/ceip off"
- name: Install packages (macOS)
if: runner.os == 'macOS'
run: brew install ninja ${{ matrix.packages }}
env:
HOMEBREW_NO_INSTALL_CLEANUP: 1
- name: Install Emscripten
if: contains(matrix.name, 'WASM32')
uses: mymindstorm/setup-emsdk@v14
# Get MCST LCC from github actions cache or download from dev.mcst.ru and save to cache
- name: Cache MCST LCC ${{ matrix.toolchain }} (Ubuntu)
if: contains(matrix.name, 'e2k')
id: cache-lcc
uses: actions/cache@v5
with:
path: /opt/mcst
key: cache-lcc-${{ matrix.toolchain }}
- name: Install MCST LCC ${{ matrix.toolchain }} (Ubuntu)
if: contains(matrix.name, 'e2k') && steps.cache-lcc.outputs.cache-hit != 'true'
shell: bash
run: |
wget -q https://dev.mcst.ru/downloads/2026-03-13/cross-sp-public-osl-${{ matrix.toolchain }}_64.tgz
sudo tar -xzf cross-sp-public-osl-${{ matrix.toolchain }}_64.tgz -C /
rm -f cross-sp-public-osl-${{ matrix.toolchain }}_64.tgz
# Get qemu-e2k-static from github actions cache or download from dev.mcst.ru and save to cache
- name: Cache MCST QEMU (Ubuntu)
if: contains(matrix.name, 'e2k')
id: cache-qemu-e2k-static
uses: actions/cache@v5
with:
path: /usr/local/bin/qemu-e2k-static
key: cache-qemu-e2k-static-2026-02-24
- name: Install MCST QEMU (Ubuntu)
if: contains(matrix.name, 'e2k') && steps.cache-qemu-e2k-static.outputs.cache-hit != 'true'
shell: bash
run: |
wget -q https://dev.mcst.ru/downloads/2026-02-24/qemu-e2k-static
chmod +x qemu-e2k-static
sudo mv qemu-e2k-static /usr/local/bin
- name: Set LLVM_BUILD_DIR for LLVM C++ libraries (MSAN)
if: contains(matrix.name, 'MSAN') && startsWith(matrix.compiler, 'clang')
run: |
echo "LLVM_BUILD_DIR=`pwd`/llvm-project/build" >> $GITHUB_ENV
- name: Get latest hash change for LLVM C++ libraries (MSAN)
if: contains(matrix.name, 'MSAN') && startsWith(matrix.compiler, 'clang')
id: llvm-remote-hash
run: |
HASH=$(git ls-remote https://github.com/llvm/llvm-project refs/heads/release/20.x | cut -f1)
if [ -z "$HASH" ]; then
echo "Failed to fetch LLVM remote hash"
exit 1
fi
echo "value=$HASH" >> $GITHUB_OUTPUT
- name: Cache LLVM C++ libraries (MSAN)
if: contains(matrix.name, 'MSAN') && startsWith(matrix.compiler, 'clang')
id: cache-llvm
uses: actions/cache@v5
with:
path: |
${{ env.LLVM_BUILD_DIR }}/lib
${{ env.LLVM_BUILD_DIR }}/include
key: cache-llvm-${{ matrix.os }}-${{ runner.arch }}-${{ matrix.compiler }}-${{ steps.llvm-remote-hash.outputs.value }}
- name: Compile LLVM C++ libraries (MSAN)
if: contains(matrix.name, 'MSAN') && startsWith(matrix.compiler, 'clang') && steps.cache-llvm.outputs.cache-hit != 'true'
run: |
# Use sparse-checkout to download only the folders we need (176MB instead of 2302MB)
git clone --depth=1 --filter=blob:none https://github.com/llvm/llvm-project --no-checkout --branch release/20.x
cd llvm-project
git sparse-checkout set cmake runtimes libc libcxx libcxxabi llvm/cmake
git checkout
cmake -S runtimes -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \
-DLLVM_USE_SANITIZER=MemoryWithOrigins \
-DLIBCXXABI_USE_LLVM_UNWINDER=OFF \
-DLIBCXX_ENABLE_STATIC=OFF \
-DLIBCXX_INCLUDE_BENCHMARKS=OFF \
-DLLVM_INCLUDE_TESTS=OFF \
-DLLVM_INCLUDE_DOCS=OFF
cmake --build build -j5 -- cxx cxxabi
env:
CFLAGS: -O2
CC: ${{ matrix.compiler }}
CXX: ${{ matrix.cxx-compiler }}
- name: Generate project files
# Shared libraries turned off for qemu ppc* and sparc & reduce code coverage sources
run: |
cmake -S . ${{ matrix.cmake-args }} \
-DCMAKE_BUILD_TYPE=${{ matrix.build-config || 'Release' }} \
-DBUILD_SHARED_LIBS=${{ matrix.build-shared || 'OFF' }} \
-DWITH_FUZZERS=ON \
-DWITH_MAINTAINER_WARNINGS=ON \
${{ matrix.coverage && '-DWITH_CODE_COVERAGE=ON' }}
env:
CC: ${{ matrix.compiler }}
CXX: ${{ matrix.cxx-compiler }}
CFLAGS: ${{ matrix.cflags }}
CXXFLAGS: ${{ matrix.cxxflags }}
LDFLAGS: ${{ matrix.ldflags }}
CI: true
- name: Compile source code
run: cmake --build . --verbose -j5 --config ${{ matrix.build-config || 'Release' }}
- name: Run test cases
# Don't run tests on 32-bit Windows ARM
if: runner.os != 'Windows' || contains(matrix.name, 'ARM') == false || runner.arch == 'ARM64'
run: ctest --verbose -C ${{ matrix.build-config || 'Release' }} -E benchmark_zlib --output-on-failure --max-width 120 -j ${{ matrix.parallel-jobs || '5' }}
env:
ASAN_OPTIONS: ${{ matrix.asan-options || 'verbosity=0' }}:abort_on_error=1:halt_on_error=1
MSAN_OPTIONS: ${{ matrix.msan-options || 'verbosity=0' }}:abort_on_error=1:halt_on_error=1
TSAN_OPTIONS: ${{ matrix.tsan-options || 'verbosity=0' }}:abort_on_error=1:halt_on_error=1
LSAN_OPTIONS: ${{ matrix.lsan-options || 'verbosity=0' }}:abort_on_error=1:halt_on_error=1
UBSAN_OPTIONS: ${{ matrix.ubsan-options || 'verbosity=0' }}:print_stacktrace=1:abort_on_error=1:halt_on_error=1
- name: Generate coverage report
if: matrix.coverage
shell: bash
run: |
python3 -u -m venv ./venv
source ./venv/${{ runner.os == 'Windows' && 'Scripts' || 'bin' }}/activate
python3 -u -m pip install gcovr
python3 -m gcovr -j 5 --gcov-ignore-parse-errors --verbose \
--exclude '(.*/|^)(_deps|benchmarks)/.*' \
--exclude-unreachable-branches \
--merge-mode-functions separate \
--merge-lines \
--gcov-executable "${{ matrix.gcov-exec || 'gcov' }}" \
--xml --output ${{ matrix.coverage }}.xml
- name: Upload job coverage report to coveralls
uses: coverallsapp/github-action@v2
env:
COVERALLS_REPO_TOKEN: "${{ secrets.COVERALLS_REPO_TOKEN }}"
if: |
matrix.coverage
&& !contains(matrix.os, 'z15')
&& (env.COVERALLS_REPO_TOKEN != '' || github.repository == 'zlib-ng/zlib-ng')
with:
file: ${{ matrix.coverage }}.xml
flag-name: "${{ matrix.name }}-${{ github.event_name }}"
parallel: true
- name: Test benchmarks (crashtest only, no coverage data collection)
if: contains(matrix.cmake-args, '-DWITH_BENCHMARKS=ON')
run: ctest --verbose -C Release -R ^benchmark_zlib$ --output-on-failure --max-width 120 -j ${{ matrix.parallel-jobs || '5' }}
env:
ASAN_OPTIONS: ${{ matrix.asan-options || 'verbosity=0' }}:abort_on_error=1:halt_on_error=1
MSAN_OPTIONS: ${{ matrix.msan-options || 'verbosity=0' }}:abort_on_error=1:halt_on_error=1
TSAN_OPTIONS: ${{ matrix.tsan-options || 'verbosity=0' }}:abort_on_error=1:halt_on_error=1
LSAN_OPTIONS: ${{ matrix.lsan-options || 'verbosity=0' }}:abort_on_error=1:halt_on_error=1
UBSAN_OPTIONS: ${{ matrix.ubsan-options || 'verbosity=0' }}:print_stacktrace=1:abort_on_error=1:halt_on_error=1
- name: Upload build errors
uses: actions/upload-artifact@v7
if: failure()
with:
name: ${{ matrix.name }} (cmake)
path: |
**/CMakeFiles/CMakeConfigureLog.yaml
**/CMakeFiles/CMakeOutput.log
**/CMakeFiles/CMakeError.log
**/Testing/Temporary/*
${{ matrix.coverage }}.xml
retention-days: 30