diff options
Diffstat (limited to 'docs/handbook/neozip/building.md')
| -rw-r--r-- | docs/handbook/neozip/building.md | 491 |
1 files changed, 491 insertions, 0 deletions
diff --git a/docs/handbook/neozip/building.md b/docs/handbook/neozip/building.md new file mode 100644 index 0000000000..1cd36090cc --- /dev/null +++ b/docs/handbook/neozip/building.md @@ -0,0 +1,491 @@ +# Building Neozip + +## Prerequisites + +- **CMake** ≥ 3.14 (up to 4.2.1 supported) +- A **C11** compiler (GCC ≥ 5, Clang ≥ 5, MSVC ≥ 2013, Intel ICC, NVIDIA HPC) +- Optional: C++ compiler for Google Test, benchmarks, and fuzz targets +- Optional: Google Test (fetched automatically by CMake) +- Optional: Google Benchmark (fetched automatically) + +--- + +## Quick Start + +### Default Build (Native API) + +```bash +cd neozip +cmake -B build -DCMAKE_BUILD_TYPE=Release +cmake --build build -j$(nproc) +``` + +This produces `libz-ng.so` (or `.dylib` / `.dll`) and `libz-ng.a` with the +`zng_` prefixed API. + +### zlib-Compatible Build + +```bash +cmake -B build -DCMAKE_BUILD_TYPE=Release -DZLIB_COMPAT=ON +cmake --build build -j$(nproc) +``` + +This produces `libz.so` and `libz.a` with standard zlib symbol names, +suitable as a drop-in replacement for system zlib. + +### Install + +```bash +cmake --install build --prefix /usr/local +``` + +--- + +## CMake Configuration Options + +### Core Options + +| Option | Type | Default | Description | +|---|---|---|---| +| `ZLIB_COMPAT` | BOOL | `OFF` | Build with zlib-compatible API. Produces `libz` instead of `libz-ng`. All public symbols use standard zlib names. Forces `WITH_GZFILEOP=ON`. | +| `ZLIB_ALIASES` | BOOL | `ON` | Provide zlib-compatible CMake targets regardless of `ZLIB_COMPAT`. | +| `WITH_GZFILEOP` | BOOL | `ON` | Compile gzip file I/O functions (`gzopen`, `gzread`, `gzwrite`, etc.). Forced `ON` in compat mode. | +| `WITH_OPTIM` | BOOL | `ON` | Enable architecture-specific optimisations. Set `OFF` to use only generic C code. | +| `WITH_NEW_STRATEGIES` | BOOL | `ON` | Use the `deflate_quick` and `deflate_medium` strategy functions. When `OFF`, only `deflate_fast`, `deflate_slow`, and special strategies are used. | +| `WITH_REDUCED_MEM` | BOOL | `OFF` | Reduce memory usage at the cost of performance. For memory-constrained environments. | +| `WITH_ALL_FALLBACKS` | BOOL | `OFF` | Build all generic fallback functions even when SIMD is available. Useful for benchmarking or running `gbench` comparisons. | +| `WITH_CRC32_CHORBA` | BOOL | `ON` | Enable the optimised Chorba CRC-32 algorithm. | + +### Native Instructions + +| Option | Type | Default | Description | +|---|---|---|---| +| `WITH_NATIVE_INSTRUCTIONS` | BOOL | `OFF` | Compile with `-march=native` (GCC/Clang) or equivalent. Produces a binary optimised for the build machine. Disables runtime CPU detection (`WITH_RUNTIME_CPU_DETECTION` is forced `OFF`). | +| `WITH_RUNTIME_CPU_DETECTION` | BOOL | `ON` | Build with runtime CPU feature detection. When `OFF`, function dispatch is resolved at compile time and only the features guaranteed by the target architecture are used. | +| `NATIVE_ARCH_OVERRIDE` | STRING | (empty) | Override the native instruction flag. For example, `-march=haswell`. | + +### x86 SIMD Options + +These options are available when building on x86/x86-64: + +| Option | Type | Default | Depends On | Description | +|---|---|---|---|---| +| `WITH_SSE2` | BOOL | `ON` | — | Build with SSE2 intrinsics. Always available on x86-64. | +| `WITH_SSSE3` | BOOL | `ON` | `WITH_SSE2` | Build with SSSE3 intrinsics. | +| `WITH_SSE41` | BOOL | `ON` | `WITH_SSSE3` | Build with SSE4.1 intrinsics. | +| `WITH_SSE42` | BOOL | `ON` | `WITH_SSE41` | Build with SSE4.2 intrinsics. | +| `WITH_PCLMULQDQ` | BOOL | `ON` | `WITH_SSE42` | Build with PCLMULQDQ carryless multiply for CRC-32. | +| `WITH_AVX2` | BOOL | `ON` | `WITH_SSE42` | Build with AVX2 intrinsics (also requires BMI2 at runtime). | +| `WITH_AVX512` | BOOL | `ON` | `WITH_AVX2` | Build with AVX-512 (F, DQ, BW, VL) intrinsics. | +| `WITH_AVX512VNNI` | BOOL | `ON` | `WITH_AVX512` | Build with AVX-512 VNNI for Adler-32 using `VPDPBUSD`. | +| `WITH_VPCLMULQDQ` | BOOL | `ON` | `WITH_PCLMULQDQ`, `WITH_AVX2` | Build with VPCLMULQDQ vectorised CRC-32. | + +The dependency chain is enforced by CMake `cmake_dependent_option`. Disabling +an earlier option automatically disables all options that depend on it. + +### ARM SIMD Options + +| Option | Type | Default | Description | +|---|---|---|---| +| `WITH_ARMV6` | BOOL | `ON` (32-bit only) | Build with ARMv6 SIMD for `slide_hash`. | +| `WITH_ARMV8` | BOOL | `ON` | Build with ARMv8 intrinsics (CRC32 instructions). | +| `WITH_NEON` | BOOL | `ON` | Build with NEON intrinsics. | + +### PowerPC Options + +| Option | Type | Default | Description | +|---|---|---|---| +| `WITH_ALTIVEC` | BOOL | `ON` | Build with AltiVec (VMX) optimisations. | +| `WITH_POWER8` | BOOL | `ON` | Build with POWER8 (VSX) optimisations. | +| `WITH_POWER9` | BOOL | `ON` | Build with POWER9 optimisations. | + +### RISC-V Options + +| Option | Type | Default | Description | +|---|---|---|---| +| `WITH_RVV` | BOOL | `ON` | Build with RISC-V Vector extension intrinsics. | +| `WITH_RISCV_ZBC` | BOOL | `ON` | Build with RISC-V Bit-manipulation CRC-32. | + +### IBM z/Architecture Options + +| Option | Type | Default | Description | +|---|---|---|---| +| `WITH_DFLTCC_DEFLATE` | BOOL | `OFF` | Build with DFLTCC hardware compression on IBM Z. | +| `WITH_DFLTCC_INFLATE` | BOOL | `OFF` | Build with DFLTCC hardware decompression on IBM Z. | +| `WITH_CRC32_VX` | BOOL | `ON` | Build with vectorised CRC-32 on IBM Z. | + +### LoongArch Options + +| Option | Type | Default | Description | +|---|---|---|---| +| `WITH_CRC32_LA` | BOOL | `ON` | Build with vectorised CRC-32 on LoongArch. | +| `WITH_LSX` | BOOL | `ON` | Build with LoongArch LSX SIMD. | +| `WITH_LASX` | BOOL | `ON` (depends on `WITH_LSX`) | Build with LoongArch LASX (256-bit) SIMD. | + +### Inflate Options + +| Option | Type | Default | Description | +|---|---|---|---| +| `WITH_INFLATE_STRICT` | BOOL | `OFF` | Enable strict distance checking in inflate. Rejects distances greater than the output produced so far. | +| `WITH_INFLATE_ALLOW_INVALID_DIST` | BOOL | `OFF` | Zero-fill invalid inflate distances instead of returning an error. | + +### Testing and Development Options + +| Option | Type | Default | Description | +|---|---|---|---| +| `BUILD_TESTING` | BOOL | `ON` | Build the test suite. | +| `WITH_GTEST` | BOOL | `ON` (if `BUILD_TESTING`) | Build Google Test-based tests. | +| `WITH_FUZZERS` | BOOL | `OFF` (if `BUILD_TESTING`) | Build fuzz targets under `test/fuzz/`. | +| `WITH_BENCHMARKS` | BOOL | `OFF` (if `BUILD_TESTING`) | Build Google Benchmark harnesses under `test/benchmarks/`. | +| `WITH_BENCHMARK_APPS` | BOOL | `OFF` (if `BUILD_TESTING`) | Build application-level benchmarks. | +| `WITH_SANITIZER` | STRING | `OFF` | Enable a sanitizer. Values: `OFF`, `memory`, `address`, `undefined`, `thread`. | +| `WITH_CODE_COVERAGE` | BOOL | `OFF` | Enable code coverage reporting (lcov/gcov). | +| `WITH_MAINTAINER_WARNINGS` | BOOL | `OFF` | Enable extra compiler warnings for project maintainers. | +| `INSTALL_UTILS` | BOOL | `OFF` | Install `minigzip` and `minideflate` utilities. | + +### Symbol Prefix + +| Option | Type | Default | Description | +|---|---|---|---| +| `ZLIB_SYMBOL_PREFIX` | STRING | (empty) | Add a custom prefix to all public symbols. Useful for embedding neozip into a larger library to avoid symbol conflicts. | + +--- + +## C Standard Selection + +The default C standard is **C11**. You can override it: + +```bash +cmake -B build -DCMAKE_C_STANDARD=99 # Use C99 +cmake -B build -DCMAKE_C_STANDARD=17 # Use C17 (requires CMake ≥ 3.21) +cmake -B build -DCMAKE_C_STANDARD=23 # Use C23 (requires CMake ≥ 3.21) +``` + +Valid standards: `99`, `11`, `17`, `23`. The build will fail with a clear +error message if an unsupported value is specified. + +--- + +## Build Types + +When not using a multi-config generator (e.g., Ninja, Makefiles), the +default build type is **Release**: + +| Build Type | Compiler Flags | Use Case | +|---|---|---| +| `Release` | `-O3` (GCC/Clang) | Production builds, benchmarks | +| `Debug` | `-O0 -g` | Development, debugging | +| `RelWithDebInfo` | `-O2 -g` | Profiling with debug symbols | +| `MinSizeRel` | `-Os` | Size-constrained environments | + +```bash +cmake -B build -DCMAKE_BUILD_TYPE=Debug +``` + +--- + +## Cross-Compilation + +### Toolchain File + +```bash +cmake -B build -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchain.cmake +``` + +The build system will log the toolchain being used: +``` +-- Using CMake toolchain: /path/to/toolchain.cmake +``` + +### Example: Cross-compiling for ARM64 + +```cmake +# aarch64-toolchain.cmake +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR aarch64) +set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc) +set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++) +``` + +```bash +cmake -B build-arm64 \ + -DCMAKE_TOOLCHAIN_FILE=aarch64-toolchain.cmake \ + -DCMAKE_BUILD_TYPE=Release +cmake --build build-arm64 -j$(nproc) +``` + +### Example: MinGW cross-compilation for Windows + +A pre-made toolchain file is provided: + +```bash +cmake -B build-mingw \ + -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-mingw32.cmake \ + -DCMAKE_BUILD_TYPE=Release +``` + +--- + +## zlib-Compat vs. Native Mode + +### API Differences + +| Aspect | `ZLIB_COMPAT=ON` | `ZLIB_COMPAT=OFF` (default) | +|---|---|---| +| Library name | `libz.so` / `libz.a` | `libz-ng.so` / `libz-ng.a` | +| Header | `zlib.h` | `zlib-ng.h` | +| Symbol prefix | `z_` (via mangling) | `zng_` | +| Stream type | `z_stream` (with `unsigned long`) | `zng_stream` (with `uint32_t`) | +| CMake target | `ZLIB::ZLIB` | `zlib-ng::zlib-ng` | +| Config file | `zlib-config.cmake` | `zlib-ng-config.cmake` | +| pkg-config | `zlib.pc` | (generated) | +| gzip file ops | Always included | Controlled by `WITH_GZFILEOP` | + +### Name Mangling + +In zlib-compat mode, `zlib_name_mangling.h` maps neozip's `zng_` names to +standard `z_` names: + +```c +#define zng_deflateInit deflateInit +#define zng_inflate inflate +#define zng_crc32 crc32 +// ... etc. +``` + +This is generated from `zlib_name_mangling.h.in` by CMake. + +--- + +## Runtime CPU Detection vs. Native Build + +### Runtime Detection (default) + +With `WITH_RUNTIME_CPU_DETECTION=ON`: +- The `functable.c` dispatch table is compiled +- `cpu_features.c` queries CPUID/feature registers at first use +- The binary works on any CPU of the target architecture +- Slight overhead from indirect function calls through `functable` + +### Native Build + +With `WITH_NATIVE_INSTRUCTIONS=ON`: +- `-march=native` (or equivalent) is passed to the compiler +- `WITH_RUNTIME_CPU_DETECTION` is forced `OFF` +- All dispatch is resolved at compile time via `native_` macros +- The binary only works on CPUs with the same (or newer) features as the build machine +- No dispatch overhead — direct function calls +- May enable additional compiler auto-vectorisation + +```bash +cmake -B build -DWITH_NATIVE_INSTRUCTIONS=ON -DCMAKE_BUILD_TYPE=Release +``` + +You can verify the selected native flag in the CMake output: +``` +-- Performing Test HAVE_MARCH_NATIVE +-- Performing Test HAVE_MARCH_NATIVE - Success +``` + +### When to Use Each + +| Scenario | Recommendation | +|---|---| +| Distribution package | Runtime detection (default) | +| Application bundled with specific hardware | Native instructions | +| Development and testing | Runtime detection | +| Maximum performance on known hardware | Native instructions | +| Benchmark comparisons | Both; compare results | + +--- + +## Sanitizer Builds + +```bash +# Address Sanitizer (memory errors) +cmake -B build-asan -DWITH_SANITIZER=address -DCMAKE_BUILD_TYPE=Debug +cmake --build build-asan + +# Memory Sanitizer (uninitialised reads) +cmake -B build-msan -DWITH_SANITIZER=memory -DCMAKE_BUILD_TYPE=Debug +cmake --build build-msan + +# Undefined Behaviour Sanitizer +cmake -B build-ubsan -DWITH_SANITIZER=undefined -DCMAKE_BUILD_TYPE=Debug +cmake --build build-ubsan + +# Thread Sanitizer (data races) +cmake -B build-tsan -DWITH_SANITIZER=thread -DCMAKE_BUILD_TYPE=Debug +cmake --build build-tsan +``` + +--- + +## Code Coverage + +```bash +cmake -B build-cov -DWITH_CODE_COVERAGE=ON -DCMAKE_BUILD_TYPE=Debug +cmake --build build-cov +cd build-cov +ctest +# Generate coverage report using lcov/gcov +``` + +--- + +## Building with ccache + +```bash +cmake -B build -DCMAKE_C_COMPILER_LAUNCHER=ccache +cmake --build build -j$(nproc) +``` + +--- + +## Building as a Subdirectory + +Neozip supports being included as a CMake subdirectory: + +```cmake +add_subdirectory(neozip) +target_link_libraries(myapp PRIVATE zlibstatic) +``` + +The `test/add-subdirectory-project/` directory contains an example. + +--- + +## Output Artifacts + +After a successful build, the following artifacts are produced: + +### Libraries + +| Target | Static | Shared | +|---|---|---| +| Native mode | `libz-ng.a` | `libz-ng.so.2.3.90` (Linux) | +| Compat mode | `libz.a` | `libz.so.1.3.1.zlib-ng` (Linux) | + +### Utilities (optional) + +| Utility | Description | +|---|---| +| `minigzip` | Minimal gzip compressor/decompressor | +| `minideflate` | Minimal raw deflate tool | + +### Test Binaries (optional) + +| Binary | Description | +|---|---| +| `gtest_zlib` | Google Test test runner | +| `example` | Classic zlib example | +| `switchlevels` | Level-switching test | +| `infcover` | Inflate code coverage test | + +--- + +## Compiler-Specific Notes + +### GCC + +- Full support from GCC 5 onwards +- `-march=native` works reliably +- `-fno-lto` is automatically applied when `WITH_NATIVE_INSTRUCTIONS=OFF` to + prevent LTO from hoisting SIMD code into non-SIMD translation units + +### Clang + +- Full support from Clang 5 onwards +- Supports all the same flags as GCC + +### MSVC + +- Minimum version: Visual Studio 2013 (MSVC 1800) +- SSE2 macros (`__SSE__`, `__SSE2__`) are explicitly defined since MSVC does + not set them by default +- Chorba SSE2/SSE4.1 variants require MSVC 2022 (version 1930+) + +### Intel ICC + +- Supports `-diag-disable=10441` for deprecation warning suppression +- Classic Intel compiler flags are handled + +### NVIDIA HPC + +- Uses `-tp px` or `-tp native` for target selection +- Supports the standard compilation flow + +--- + +## Feature Summary + +At the end of configuration, CMake prints a feature summary showing which +options are enabled. Example output: + +``` +-- Feature summary for zlib 1.3.1 +-- The following features have been enabled: +-- * CMAKE_BUILD_TYPE, Build type: Release (default) +-- * WITH_GZFILEOP +-- * WITH_OPTIM +-- * WITH_NEW_STRATEGIES +-- * WITH_CRC32_CHORBA +-- * WITH_RUNTIME_CPU_DETECTION +-- * WITH_SSE2 +-- * WITH_SSSE3 +-- * WITH_SSE41 +-- * WITH_SSE42 +-- * WITH_PCLMULQDQ +-- * WITH_AVX2 +-- * WITH_AVX512 +-- * WITH_AVX512VNNI +-- * WITH_VPCLMULQDQ +``` + +--- + +## Verifying the Build + +```bash +# Run the test suite +cd build +ctest --output-on-failure -j$(nproc) + +# Check the library version +./minigzip -h 2>&1 | head -1 + +# Verify architecture detection +cmake -B build -DCMAKE_BUILD_TYPE=Release 2>&1 | grep -i "arch\|SIMD\|SSE\|AVX\|NEON" +``` + +--- + +## Integration in Other Projects + +### Using `find_package` + +```cmake +# Native mode +find_package(zlib-ng 2.3 CONFIG REQUIRED) +target_link_libraries(myapp PRIVATE zlib-ng::zlib-ng) + +# Compat mode +find_package(ZLIB 1.3 CONFIG REQUIRED) +target_link_libraries(myapp PRIVATE ZLIB::ZLIB) +``` + +### Using pkg-config + +```bash +pkg-config --cflags --libs zlib # compat mode +``` + +### Using FetchContent + +```cmake +include(FetchContent) +FetchContent_Declare(neozip + SOURCE_DIR ${CMAKE_SOURCE_DIR}/neozip) +FetchContent_MakeAvailable(neozip) +target_link_libraries(myapp PRIVATE zlibstatic) +``` |
