]> git.ipfire.org Git - thirdparty/zlib-ng.git/commitdiff
Added CMake project for building pigz.
authorNathan Moinvaziri <nathan@nathanm.com>
Fri, 4 Jun 2021 01:02:03 +0000 (18:02 -0700)
committerHans Kristian Rosbach <hk-github@circlestorm.org>
Tue, 8 Jun 2021 18:52:56 +0000 (20:52 +0200)
Added GitHub Actions CI for testing pigz.

.github/workflows/pigz.yml [new file with mode: 0644]
test/pigz/CMakeLists.txt [new file with mode: 0644]

diff --git a/.github/workflows/pigz.yml b/.github/workflows/pigz.yml
new file mode 100644 (file)
index 0000000..5b1a335
--- /dev/null
@@ -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 (file)
index 0000000..a929820
--- /dev/null
@@ -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} $<TARGET_FILE:pigz>)
+
+    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)