Files
libaaruformat/3rdparty/zstd.cmake
Kevin Bortis 120174e4cd Add multi-threaded zstd compression support
Switch zstd encoder from simple API (ZSTD_compress) to advanced API
(ZSTD_CCtx + ZSTD_compress2) with configurable worker threads via
ZSTD_c_nbWorkers. Consumer controls threading through threads=N
option string parameter. Default is 1 (single-threaded, bit-identical
output to previous behavior).

- Enable ZSTD_MULTITHREAD compile definition and link pthreads
- Add num_threads field to options struct and context
- Parse threads=N in option string (clamped >= 1)
- Rewrite aaruf_zstd_encode_buffer() with num_threads parameter
- Update all call sites (write.c, close.c)
2026-03-29 12:56:19 +02:00

68 lines
2.4 KiB
CMake

# Zstandard compression library (https://github.com/facebook/zstd)
# BSD/GPLv2 dual license
set(ZSTD_LIB_DIR "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/zstd/lib")
if(NOT EXISTS "${ZSTD_LIB_DIR}/zstd.h")
message(FATAL_ERROR "Zstandard submodule not found. Run: git submodule update --init 3rdparty/zstd")
endif()
message(STATUS "Zstandard: Building static library")
add_library(zstd_static STATIC
${ZSTD_LIB_DIR}/common/debug.c
${ZSTD_LIB_DIR}/common/entropy_common.c
${ZSTD_LIB_DIR}/common/error_private.c
${ZSTD_LIB_DIR}/common/fse_decompress.c
${ZSTD_LIB_DIR}/common/pool.c
${ZSTD_LIB_DIR}/common/threading.c
${ZSTD_LIB_DIR}/common/xxhash.c
${ZSTD_LIB_DIR}/common/zstd_common.c
${ZSTD_LIB_DIR}/compress/fse_compress.c
${ZSTD_LIB_DIR}/compress/hist.c
${ZSTD_LIB_DIR}/compress/huf_compress.c
${ZSTD_LIB_DIR}/compress/zstd_compress.c
${ZSTD_LIB_DIR}/compress/zstd_compress_literals.c
${ZSTD_LIB_DIR}/compress/zstd_compress_sequences.c
${ZSTD_LIB_DIR}/compress/zstd_compress_superblock.c
${ZSTD_LIB_DIR}/compress/zstd_double_fast.c
${ZSTD_LIB_DIR}/compress/zstd_fast.c
${ZSTD_LIB_DIR}/compress/zstd_lazy.c
${ZSTD_LIB_DIR}/compress/zstd_ldm.c
${ZSTD_LIB_DIR}/compress/zstd_opt.c
${ZSTD_LIB_DIR}/compress/zstd_preSplit.c
${ZSTD_LIB_DIR}/compress/zstdmt_compress.c
${ZSTD_LIB_DIR}/decompress/huf_decompress.c
${ZSTD_LIB_DIR}/decompress/zstd_ddict.c
${ZSTD_LIB_DIR}/decompress/zstd_decompress.c
${ZSTD_LIB_DIR}/decompress/zstd_decompress_block.c
)
# x86_64 assembly fast path for Huffman decompression
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64")
enable_language(ASM)
target_sources(zstd_static PRIVATE ${ZSTD_LIB_DIR}/decompress/huf_decompress_amd64.S)
endif()
target_include_directories(zstd_static PUBLIC ${ZSTD_LIB_DIR})
target_compile_definitions(zstd_static PRIVATE ZSTD_MULTITHREAD)
set_property(TARGET zstd_static PROPERTY POSITION_INDEPENDENT_CODE TRUE)
# zstd multi-threading requires pthreads on POSIX (musl includes pthreads in libc)
if(NOT WIN32)
find_package(Threads REQUIRED)
target_link_libraries(zstd_static PRIVATE Threads::Threads)
endif()
if(CMAKE_BUILD_TYPE STREQUAL "Release")
if(MSVC)
target_compile_options(zstd_static PRIVATE /O2)
else()
target_compile_options(zstd_static PRIVATE -O3)
endif()
endif()
# Link to aaruformat
target_link_libraries(aaruformat zstd_static)
target_include_directories(aaruformat PRIVATE ${ZSTD_LIB_DIR})