From: Nathan Moinvaziri Date: Fri, 4 Jun 2021 01:02:03 +0000 (-0700) Subject: Added CMake project for building pigz. X-Git-Tag: 2.0.4~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3b8489fe6c86d83ac0c0833fd256f9dc1b731a20;p=thirdparty%2Fzlib-ng.git Added CMake project for building pigz. Added GitHub Actions CI for testing pigz. --- diff --git a/.github/workflows/pigz.yml b/.github/workflows/pigz.yml new file mode 100644 index 000000000..5b1a335d5 --- /dev/null +++ b/.github/workflows/pigz.yml @@ -0,0 +1,87 @@ +name: CI Pigz +on: [push, pull_request] +jobs: + ci-cmake: + name: ${{ matrix.name }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - name: Ubuntu GCC + os: ubuntu-latest + compiler: gcc + codecov: ubuntu_gcc_pigz + + - name: Ubuntu Clang + os: ubuntu-latest + compiler: clang + packages: llvm-11-tools + gcov-exec: llvm-cov-11 gcov + codecov: ubuntu_clang_pigz + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Checkout test corpora + uses: actions/checkout@v2 + with: + repository: zlib-ng/corpora + path: test/data/corpora + + - name: Install packages (Ubuntu) + if: runner.os == 'Linux' && matrix.packages + run: | + sudo apt-get update + sudo apt-get install -y ${{ matrix.packages }} + + - name: Install codecov.io tools + if: matrix.codecov + run: | + python -u -m pip install codecov + + - name: Generate project files + run: | + cd test/pigz + cmake ${{ matrix.cmake-args }} -DCMAKE_BUILD_TYPE=${{ matrix.build-config || 'Release' }} -DBUILD_SHARED_LIBS=OFF -DZLIB_ROOT=../.. -DWITH_CODE_COVERAGE=ON -DWITH_MAINTAINER_WARNINGS=ON + env: + CC: ${{ matrix.compiler }} + CFLAGS: ${{ matrix.cflags }} + LDFLAGS: ${{ matrix.ldflags }} + CI: true + + - name: Compile source code + run: | + cd test/pigz + cmake --build . --config ${{ matrix.build-config || 'Release' }} + + - name: Run test cases + run: | + cd test/pigz + ctest --verbose -C Release --output-on-failure --max-width 120 -j ${{ matrix.parallels-jobs || '2' }} + + - name: Upload coverage report + if: matrix.codecov && ( env.CODECOV_TOKEN_SECRET != '' || github.repository == 'zlib-ng/zlib-ng' ) + shell: bash + run: | + bash tools/codecov-upload.sh + env: + # Codecov does not yet support GitHub Actions + CODECOV_TOKEN_SECRET: "${{secrets.CODECOV_TOKEN}}" + CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN || 'e4fdf847-f541-4ab1-9d50-3d27e5913906' }}" + CODECOV_FLAGS: "${{ matrix.codecov }}" + CODECOV_NAME: "${{ matrix.name }}" + CODECOV_EXEC: "${{ matrix.gcov-exec || 'gcov' }}" + CODECOV_DIR: "." + + - name: Upload build errors + uses: actions/upload-artifact@v2 + if: failure() + with: + name: ${{ matrix.name }} (cmake) + path: | + **/CMakeFiles/CMakeOutput.log + **/CMakeFiles/CMakeError.log + **/Testing/Temporary/* + retention-days: 30 diff --git a/test/pigz/CMakeLists.txt b/test/pigz/CMakeLists.txt new file mode 100644 index 000000000..a9298201e --- /dev/null +++ b/test/pigz/CMakeLists.txt @@ -0,0 +1,180 @@ +# CMakeLists.txt -- Build madler/pigz against zlib variant + +# Copyright (C) 2021 Nathan Moinvaziri +# Licensed under the Zlib license, see LICENSE.md for details + +# By default pigz will be linked against the system zlib and +# pthread libraries if installed. + +# Optional Variables +# PIGZ_ENABLE_TESTS - Enable adding unit tests +# ZLIB_ROOT - Path to the zlib source directory +# PTHREADS4W_ROOT - Path to pthreads4w source directory on Windows. +# If not specified then threading will be disabled. + +cmake_minimum_required(VERSION 3.11) + +include(CheckCCompilerFlag) +include(FeatureSummary) +include(FetchContent) + +include(../../cmake/detect-coverage.cmake) + +option(WITH_CODE_COVERAGE "Enable code coverage reporting" OFF) +option(PIGZ_ENABLE_TESTS "Build unit tests" ON) + +project(pigz LANGUAGES C) + +# Set code coverage compiler flags +if(WITH_CODE_COVERAGE) + add_code_coverage() +endif() + +# Compiler definitions +if(CMAKE_C_COMPILER_ID STREQUAL "Clang") + add_definitions(-fno-caret-diagnostics) +elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU") + if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.5.0) + add_definitions(-Wno-unused-result) + endif() + if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.8.0) + add_definitions(-fno-diagnostics-show-caret) + endif() +elseif(MSVC) + add_definitions(-D_CRT_SECURE_NO_DEPRECATE) +endif() + +# Fetch pigz source code from official repository +FetchContent_Declare(pigz + GIT_REPOSITORY https://github.com/madler/pigz.git) +FetchContent_MakeAvailable(pigz) +FetchContent_GetProperties(pigz) + +if(NOT pigz_POPULATED) + FetchContent_Populate(pigz) +endif() + +set(PIGZ_SRCS + ${pigz_SOURCE_DIR}/pigz.c + ${pigz_SOURCE_DIR}/try.c + ${pigz_SOURCE_DIR}/yarn.c) + +set(PIGZ_HDRS + ${pigz_SOURCE_DIR}/try.h + ${pigz_SOURCE_DIR}/yarn.h) + +add_executable(${PROJECT_NAME} ${PIGZ_SRCS} ${PIGZ_HDRS}) +add_definitions(-DNOZOPFLI) + +# Find and link against pthreads or pthreads4w +if(WIN32) + add_definitions(-D_TIMESPEC_DEFINED) + + if(DEFINED PTHREADS4W_ROOT) + set(CLEANUP_STYLE VC) + set(PTHREADS4W_VERSION 3) + + add_subdirectory(${PTHREADS4W_ROOT} ${PTHREADS4W_ROOT} EXCLUDE_FROM_ALL) + target_link_libraries(${PROJECT_NAME} pthreadVC3) + target_include_directories(${PROJECT_NAME} PRIVATE win ${PTHREADS4W_ROOT}) + else() + message(WARNING "Missing pthreads4w root directory, disabling threading") + add_definitions(-DNOTHREAD) + endif() +else() + find_package(Threads REQUIRED) + target_link_libraries(${PROJECT_NAME} Threads::Threads) + if(NOT APPLE) + target_link_libraries(${PROJECT_NAME} m) + endif() +endif() + +# Find and link against zlib +if(NOT DEFINED ZLIB_ROOT) + find_package(Zlib REQUIRED) +endif() + +set(ZLIB_COMPAT ON) +set(ZLIB_ENABLE_TESTS OFF) + +add_subdirectory(${ZLIB_ROOT} ${CMAKE_CURRENT_BINARY_DIR}/zlib EXCLUDE_FROM_ALL) + +if(NOT DEFINED BUILD_SHARED_LIBS OR NOT BUILD_SHARED_LIBS) + set(ZLIB_TARGET zlibstatic) +else() + set(ZLIB_TARGET zlib) +endif() + +target_include_directories(${PROJECT_NAME} PRIVATE ${ZLIB_ROOT} ${CMAKE_CURRENT_BINARY_DIR}/zlib) +target_link_libraries(${PROJECT_NAME} ${ZLIB_TARGET}) + +if(NOT SKIP_INSTALL_BINARIES AND NOT SKIP_INSTALL_ALL) + install(TARGETS ${PROJECT_NAME} DESTINATION "bin") +endif() + +# Add unit tests +if(PIGZ_ENABLE_TESTS) + enable_testing() + + set(PIGZ_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) + + macro(test_pigz name path) + # Construct compression arguments for pigz + set(compress_args -k -c) + foreach(extra_arg IN ITEMS "${ARGN}") + list(APPEND compress_args ${extra_arg}) + endforeach() + + # Create unique friendly string for test + string(REPLACE ";" "" arg_list "${ARGN}") + string(REPLACE " " "" arg_list "${arg_list}") + string(REPLACE "-" "" arg_list "${arg_list}") + + set(test_id pigz-${name}-${arg_list}) + + if(NOT TEST ${test_id}) + add_test(NAME ${test_id} + COMMAND ${CMAKE_COMMAND} + "-DTARGET=${PIGZ_COMMAND}" + "-DCOMPRESS_ARGS=${compress_args}" + "-DDECOMPRESS_ARGS=-d;-c" + -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/${path} + -DTEST_NAME=${test_id} + -P ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/test-compress.cmake) + endif() + endmacro() + + set(TEST_CONFIGS + -U # RLE compression + #-H # Z_HUFFMAN_ONLY (broken in 2.6) + -0 # No compression + -1 # Deflate quick + -4 # Deflate medium (lazy matches) + -6 # Deflate medium + -9 # Deflate slow + ) + + file(GLOB_RECURSE TEST_FILE_PATHS + LIST_DIRECTORIES false + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/../data/*) + + foreach(TEST_FILE_PATH ${TEST_FILE_PATHS}) + if("${TEST_FILE_PATH}" MATCHES ".gz$" OR "${TEST_FILE_PATH}" MATCHES ".out$" OR + "${TEST_FILE_PATH}" MATCHES "/.git/" OR "${TEST_FILE_PATH}" MATCHES ".md$") + continue() + endif() + foreach(TEST_CONFIG ${TEST_CONFIGS}) + get_filename_component(TEST_NAME ${TEST_FILE_PATH} NAME) + if (TEST_NAME STREQUAL "") + continue() + endif() + test_pigz(${TEST_NAME} ${TEST_FILE_PATH} ${TEST_CONFIG}) + endforeach() + endforeach() +endif() + +add_feature_info(WITH_CODE_COVERAGE WITH_CODE_COVERAGE "Enable code coverage reporting") +add_feature_info(PIGZ_ENABLE_TESTS PIGZ_ENABLE_TESTS "Build unit tests") + +FEATURE_SUMMARY(WHAT ALL INCLUDE_QUIET_PACKAGES)