blob: 43082cf263d3f77a79b4e3ebc19979bdb93845ea (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
|
# 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.
# For compilation on Windows download and use shim:
# https://github.com/zlib-ng/pigzbench/tree/master/pigz/win
# Optional Variables
# WITH_CODE_COVERAGE - Enable code coverage reporting
# WITH_THREADS - Enable threading support
# 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(WITH_THREADS "Enable threading support" ON)
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(WIN32)
add_definitions(-D_TIMESPEC_DEFINED)
if(MSVC)
add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
endif()
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)
set(PIGZ_HDRS
${pigz_SOURCE_DIR}/try.h)
add_executable(${PROJECT_NAME} ${PIGZ_SRCS} ${PIGZ_HDRS})
add_definitions(-DNOZOPFLI)
if(WIN32)
target_include_directories(${PROJECT_NAME} PRIVATE win)
endif()
# Find and link against pthreads or pthreads4w
if(WITH_THREADS)
if(WIN32)
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 ${PTHREADS4W_ROOT})
else()
message(WARNING "Missing pthreads4w root directory")
set(WITH_THREADS OFF)
endif()
else()
find_package(Threads REQUIRED)
target_link_libraries(${PROJECT_NAME} Threads::Threads)
if(NOT APPLE)
target_link_libraries(${PROJECT_NAME} m)
endif()
endif()
endif()
# Disable threading support
if(NOT WITH_THREADS)
add_definitions(-DNOTHREAD)
else()
set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY SOURCES
${pigz_SOURCE_DIR}/yarn.c
${pigz_SOURCE_DIR}/yarn.h)
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()
set(GH979_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:pigz>
-d -k -f ${CMAKE_CURRENT_SOURCE_DIR}/../GH-979/pigz-2.6.tar.gz)
add_test(NAME GH-979 COMMAND ${GH979_COMMAND})
endif()
add_feature_info(WITH_CODE_COVERAGE WITH_CODE_COVERAGE "Enable code coverage reporting")
add_feature_info(WITH_THREADS WITH_THREADS "Enable threading support")
add_feature_info(PIGZ_ENABLE_TESTS PIGZ_ENABLE_TESTS "Build unit tests")
FEATURE_SUMMARY(WHAT ALL INCLUDE_QUIET_PACKAGES)
|