comparison mupdf-source/thirdparty/brotli/CMakeLists.txt @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
comparison
equal deleted inserted replaced
1:1d09e1dec1d9 2:b50eed0cc0ef
1 # Available CMake versions:
2 # - Ubuntu 20.04 LTS : 3.16.3
3 # - Solaris 11.4 SRU 15 : 3.15
4 cmake_minimum_required(VERSION 3.15)
5
6 # Since this project's version is loaded from other files, this policy
7 # will help suppress the warning generated by cmake.
8 # This policy is set because we can't provide "VERSION" in "project" command.
9 # Use `cmake --help-policy CMP0048` for more information.
10 cmake_policy(SET CMP0048 NEW)
11 project(brotli C)
12
13 option(BUILD_SHARED_LIBS "Build shared libraries" ON)
14 set(BROTLI_BUILD_TOOLS ON CACHE BOOL "Build/install CLI tools")
15
16 if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
17 message(STATUS "Setting build type to Release as none was specified.")
18 set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build" FORCE)
19 else()
20 message(STATUS "Build type is '${CMAKE_BUILD_TYPE}'")
21 endif()
22
23 include(CheckCSourceCompiles)
24 check_c_source_compiles(
25 "#if defined(__EMSCRIPTEN__)
26 int main() {return 0;}
27 #endif"
28 BROTLI_EMSCRIPTEN
29 )
30 if (BROTLI_EMSCRIPTEN)
31 message("-- Compiler is EMSCRIPTEN")
32 else()
33 message("-- Compiler is not EMSCRIPTEN")
34 endif()
35
36 # If Brotli is being bundled in another project, we don't want to
37 # install anything. However, we want to let people override this, so
38 # we'll use the BROTLI_BUNDLED_MODE variable to let them do that; just
39 # set it to OFF in your project before you add_subdirectory(brotli).
40 get_directory_property(BROTLI_PARENT_DIRECTORY PARENT_DIRECTORY)
41 if(NOT DEFINED BROTLI_BUNDLED_MODE)
42 # Bundled mode hasn't been set one way or the other, set the default
43 # depending on whether or not we are the top-level project.
44 if(BROTLI_PARENT_DIRECTORY)
45 set(BROTLI_BUNDLED_MODE ON)
46 else()
47 set(BROTLI_BUNDLED_MODE OFF)
48 endif()
49 endif()
50 mark_as_advanced(BROTLI_BUNDLED_MODE)
51
52 include(GNUInstallDirs)
53
54 # Reads macro from .h file; it is expected to be a single-line define.
55 function(read_macro PATH MACRO OUTPUT)
56 file(STRINGS ${PATH} _line REGEX "^#define +${MACRO} +(.+)$")
57 string(REGEX REPLACE "^#define +${MACRO} +(.+)$" "\\1" _val "${_line}")
58 set(${OUTPUT} ${_val} PARENT_SCOPE)
59 endfunction(read_macro)
60
61 # Version information
62 read_macro("c/common/version.h" "BROTLI_VERSION_MAJOR" BROTLI_VERSION_MAJOR)
63 read_macro("c/common/version.h" "BROTLI_VERSION_MINOR" BROTLI_VERSION_MINOR)
64 read_macro("c/common/version.h" "BROTLI_VERSION_PATCH" BROTLI_VERSION_PATCH)
65 set(BROTLI_VERSION "${BROTLI_VERSION_MAJOR}.${BROTLI_VERSION_MINOR}.${BROTLI_VERSION_PATCH}")
66 mark_as_advanced(BROTLI_VERSION BROTLI_VERSION_MAJOR BROTLI_VERSION_MINOR BROTLI_VERSION_PATCH)
67
68 # ABI Version information
69 read_macro("c/common/version.h" "BROTLI_ABI_CURRENT" BROTLI_ABI_CURRENT)
70 read_macro("c/common/version.h" "BROTLI_ABI_REVISION" BROTLI_ABI_REVISION)
71 read_macro("c/common/version.h" "BROTLI_ABI_AGE" BROTLI_ABI_AGE)
72 math(EXPR BROTLI_ABI_COMPATIBILITY "${BROTLI_ABI_CURRENT} - ${BROTLI_ABI_AGE}")
73 mark_as_advanced(BROTLI_ABI_CURRENT BROTLI_ABI_REVISION BROTLI_ABI_AGE BROTLI_ABI_COMPATIBILITY)
74
75 if (ENABLE_SANITIZER)
76 set(CMAKE_C_FLAGS " ${CMAKE_C_FLAGS} -fsanitize=${ENABLE_SANITIZER}")
77 set(CMAKE_CXX_FLAGS " ${CMAKE_CXX_FLAGS} -fsanitize=${ENABLE_SANITIZER}")
78 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=${ENABLE_SANITIZER}")
79 endif ()
80
81 include(CheckLibraryExists)
82 set(LIBM_LIBRARY)
83 CHECK_LIBRARY_EXISTS(m log2 "" HAVE_LIB_M)
84 if(HAVE_LIB_M)
85 set(LIBM_LIBRARY "m")
86 endif()
87
88 set(BROTLI_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/c/include")
89 mark_as_advanced(BROTLI_INCLUDE_DIRS)
90
91 set(BROTLI_LIBRARIES_CORE brotlienc brotlidec brotlicommon)
92 set(BROTLI_LIBRARIES ${BROTLI_LIBRARIES_CORE} ${LIBM_LIBRARY})
93 mark_as_advanced(BROTLI_LIBRARIES)
94
95 if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
96 add_definitions(-DOS_LINUX)
97 elseif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
98 add_definitions(-DOS_FREEBSD)
99 elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
100 add_definitions(-DOS_MACOSX)
101 set(CMAKE_MACOS_RPATH TRUE)
102 set(CMAKE_INSTALL_NAME_DIR "${CMAKE_INSTALL_FULL_LIBDIR}")
103 endif()
104
105 if(BROTLI_EMSCRIPTEN)
106 set(BUILD_SHARED_LIBS OFF)
107 endif()
108
109 file(GLOB_RECURSE BROTLI_COMMON_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} c/common/*.c)
110 add_library(brotlicommon ${BROTLI_COMMON_SOURCES})
111
112 file(GLOB_RECURSE BROTLI_DEC_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} c/dec/*.c)
113 add_library(brotlidec ${BROTLI_DEC_SOURCES})
114
115 file(GLOB_RECURSE BROTLI_ENC_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} c/enc/*.c)
116 add_library(brotlienc ${BROTLI_ENC_SOURCES})
117
118 # Older CMake versions does not understand INCLUDE_DIRECTORIES property.
119 include_directories(${BROTLI_INCLUDE_DIRS})
120
121 if(BUILD_SHARED_LIBS)
122 foreach(lib ${BROTLI_LIBRARIES_CORE})
123 target_compile_definitions(${lib} PUBLIC "BROTLI_SHARED_COMPILATION" )
124 string(TOUPPER "${lib}" LIB)
125 set_target_properties (${lib} PROPERTIES DEFINE_SYMBOL "${LIB}_SHARED_COMPILATION")
126 endforeach()
127 endif()
128
129 foreach(lib ${BROTLI_LIBRARIES_CORE})
130 target_link_libraries(${lib} ${LIBM_LIBRARY})
131 set_property(TARGET ${lib} APPEND PROPERTY INCLUDE_DIRECTORIES ${BROTLI_INCLUDE_DIRS})
132 set_target_properties(${lib} PROPERTIES
133 VERSION "${BROTLI_ABI_COMPATIBILITY}.${BROTLI_ABI_AGE}.${BROTLI_ABI_REVISION}"
134 SOVERSION "${BROTLI_ABI_COMPATIBILITY}")
135 if(NOT BROTLI_EMSCRIPTEN)
136 set_target_properties(${lib} PROPERTIES POSITION_INDEPENDENT_CODE TRUE)
137 endif()
138 set_property(TARGET ${lib} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${BROTLI_INCLUDE_DIRS}>")
139 endforeach()
140
141 if(NOT BROTLI_EMSCRIPTEN)
142 target_link_libraries(brotlidec brotlicommon)
143 target_link_libraries(brotlienc brotlicommon)
144 endif()
145
146 # For projects stuck on older versions of CMake, this will set the
147 # BROTLI_INCLUDE_DIRS and BROTLI_LIBRARIES variables so they still
148 # have a relatively easy way to use Brotli:
149 #
150 # include_directories(${BROTLI_INCLUDE_DIRS})
151 # target_link_libraries(foo ${BROTLI_LIBRARIES})
152 if(BROTLI_PARENT_DIRECTORY)
153 set(BROTLI_INCLUDE_DIRS "${BROTLI_INCLUDE_DIRS}" PARENT_SCOPE)
154 set(BROTLI_LIBRARIES "${BROTLI_LIBRARIES}" PARENT_SCOPE)
155 endif()
156
157 # Build the brotli executable
158 if(BROTLI_BUILD_TOOLS)
159 add_executable(brotli c/tools/brotli.c)
160 target_link_libraries(brotli ${BROTLI_LIBRARIES})
161 endif()
162
163 # Installation
164 if(NOT BROTLI_BUNDLED_MODE)
165 if (BROTLI_BUILD_TOOLS)
166 install(
167 TARGETS brotli
168 RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
169 )
170 endif()
171
172 install(
173 TARGETS ${BROTLI_LIBRARIES_CORE}
174 ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
175 LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
176 RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
177 )
178
179 install(
180 DIRECTORY ${BROTLI_INCLUDE_DIRS}/brotli
181 DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
182 )
183 endif() # BROTLI_BUNDLED_MODE
184
185 # Tests
186
187 # Integration tests, those depend on `brotli` binary
188 if(NOT BROTLI_DISABLE_TESTS AND BROTLI_BUILD_TOOLS)
189 # If we're targeting Windows but not running on Windows, we need Wine
190 # to run the tests...
191 if(WIN32 AND NOT CMAKE_HOST_WIN32)
192 find_program(BROTLI_WRAPPER NAMES wine)
193
194 if(NOT BROTLI_WRAPPER)
195 message(STATUS "wine not found, disabling tests")
196 set(BROTLI_DISABLE_TESTS TRUE)
197 endif()
198 endif()
199 # If our compiler is a cross-compiler that we know about (arm/aarch64),
200 # then we need to use qemu to execute the tests.
201 if ("${CMAKE_C_COMPILER}" MATCHES "^.*/arm-linux-gnueabihf-.*$")
202 message(STATUS "Detected arm-linux-gnueabihf cross-compilation")
203 set(BROTLI_WRAPPER "qemu-arm")
204 set(BROTLI_WRAPPER_LD_PREFIX "/usr/arm-linux-gnueabihf")
205 endif()
206
207 if ("${CMAKE_C_COMPILER}" MATCHES "^.*/arm-linux-gnueabi-.*$")
208 message(STATUS "Detected arm-linux-gnueabi cross-compilation")
209 set(BROTLI_WRAPPER "qemu-arm")
210 set(BROTLI_WRAPPER_LD_PREFIX "/usr/arm-linux-gnueabi")
211 endif()
212
213 if ("${CMAKE_C_COMPILER}" MATCHES "^.*/aarch64-linux-gnu-.*$")
214 message(STATUS "Detected aarch64-linux-gnu cross-compilation")
215 set(BROTLI_WRAPPER "qemu-aarch64")
216 set(BROTLI_WRAPPER_LD_PREFIX "/usr/aarch64-linux-gnu")
217 endif()
218
219 include(CTest)
220 enable_testing()
221
222 set(ROUNDTRIP_INPUTS
223 tests/testdata/alice29.txt
224 tests/testdata/asyoulik.txt
225 tests/testdata/lcet10.txt
226 tests/testdata/plrabn12.txt
227 c/enc/encode.c
228 c/common/dictionary.h
229 c/dec/decode.c)
230
231 foreach(INPUT ${ROUNDTRIP_INPUTS})
232 get_filename_component(OUTPUT_NAME "${INPUT}" NAME)
233
234 set(OUTPUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_NAME}")
235 set(INPUT_FILE "${CMAKE_CURRENT_SOURCE_DIR}/${INPUT}")
236
237 if (EXISTS "${INPUT_FILE}")
238 foreach(quality 1 6 9 11)
239 add_test(NAME "${BROTLI_TEST_PREFIX}roundtrip/${INPUT}/${quality}"
240 COMMAND "${CMAKE_COMMAND}"
241 -DBROTLI_WRAPPER=${BROTLI_WRAPPER}
242 -DBROTLI_WRAPPER_LD_PREFIX=${BROTLI_WRAPPER_LD_PREFIX}
243 -DBROTLI_CLI=$<TARGET_FILE:brotli>
244 -DQUALITY=${quality}
245 -DINPUT=${INPUT_FILE}
246 -DOUTPUT=${OUTPUT_FILE}.${quality}
247 -P ${CMAKE_CURRENT_SOURCE_DIR}/tests/run-roundtrip-test.cmake)
248 endforeach()
249 else()
250 message(NOTICE "Test file ${INPUT} does not exist; OK on tarball builds; consider running scripts/download_testdata.sh before configuring.")
251 endif()
252 endforeach()
253
254 file(GLOB_RECURSE
255 COMPATIBILITY_INPUTS
256 RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
257 tests/testdata/*.compressed*)
258
259 foreach(INPUT ${COMPATIBILITY_INPUTS})
260 add_test(NAME "${BROTLI_TEST_PREFIX}compatibility/${INPUT}"
261 COMMAND "${CMAKE_COMMAND}"
262 -DBROTLI_WRAPPER=${BROTLI_WRAPPER}
263 -DBROTLI_WRAPPER_LD_PREFIX=${BROTLI_WRAPPER_LD_PREFIX}
264 -DBROTLI_CLI=$<TARGET_FILE:brotli>
265 -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/${INPUT}
266 -P ${CMAKE_CURRENT_SOURCE_DIR}/tests/run-compatibility-test.cmake)
267 endforeach()
268 endif() # BROTLI_DISABLE_TESTS
269
270 # Generate a pkg-config files
271
272 function(generate_pkg_config_path outvar path)
273 string(LENGTH "${path}" path_length)
274
275 set(path_args ${ARGV})
276 list(REMOVE_AT path_args 0 1)
277 list(LENGTH path_args path_args_remaining)
278
279 set("${outvar}" "${path}")
280
281 while(path_args_remaining GREATER 1)
282 list(GET path_args 0 name)
283 list(GET path_args 1 value)
284
285 get_filename_component(value_full "${value}" ABSOLUTE)
286 string(LENGTH "${value}" value_length)
287
288 if(path_length EQUAL value_length AND path STREQUAL value)
289 set("${outvar}" "\${${name}}")
290 break()
291 elseif(path_length GREATER value_length)
292 # We might be in a subdirectory of the value, but we have to be
293 # careful about a prefix matching but not being a subdirectory
294 # (for example, /usr/lib64 is not a subdirectory of /usr/lib).
295 # We'll do this by making sure the next character is a directory
296 # separator.
297 string(SUBSTRING "${path}" ${value_length} 1 sep)
298 if(sep STREQUAL "/")
299 string(SUBSTRING "${path}" 0 ${value_length} s)
300 if(s STREQUAL value)
301 string(SUBSTRING "${path}" "${value_length}" -1 suffix)
302 set("${outvar}" "\${${name}}${suffix}")
303 break()
304 endif()
305 endif()
306 endif()
307
308 list(REMOVE_AT path_args 0 1)
309 list(LENGTH path_args path_args_remaining)
310 endwhile()
311
312 set("${outvar}" "${${outvar}}" PARENT_SCOPE)
313 endfunction(generate_pkg_config_path)
314
315 function(transform_pc_file INPUT_FILE OUTPUT_FILE VERSION)
316 file(READ ${INPUT_FILE} TEXT)
317
318 set(PREFIX "${CMAKE_INSTALL_PREFIX}")
319 string(REGEX REPLACE "@prefix@" "${PREFIX}" TEXT ${TEXT})
320 string(REGEX REPLACE "@exec_prefix@" "${PREFIX}" TEXT ${TEXT})
321
322 generate_pkg_config_path(LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}" prefix "${PREFIX}")
323 string(REGEX REPLACE "@libdir@" "${LIBDIR}" TEXT ${TEXT})
324
325 generate_pkg_config_path(INCLUDEDIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}" prefix "${PREFIX}")
326 string(REGEX REPLACE "@includedir@" "${INCLUDEDIR}" TEXT ${TEXT})
327
328 string(REGEX REPLACE "@PACKAGE_VERSION@" "${VERSION}" TEXT ${TEXT})
329
330 file(WRITE ${OUTPUT_FILE} ${TEXT})
331 endfunction()
332
333 transform_pc_file("scripts/libbrotlicommon.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libbrotlicommon.pc" "${BROTLI_VERSION}")
334
335 transform_pc_file("scripts/libbrotlidec.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libbrotlidec.pc" "${BROTLI_VERSION}")
336
337 transform_pc_file("scripts/libbrotlienc.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libbrotlienc.pc" "${BROTLI_VERSION}")
338
339 if(NOT BROTLI_BUNDLED_MODE)
340 install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libbrotlicommon.pc"
341 DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
342 install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libbrotlidec.pc"
343 DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
344 install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libbrotlienc.pc"
345 DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
346 endif() # BROTLI_BUNDLED_MODE
347
348 if (BROTLI_BUILD_TOOLS)
349 install(FILES "docs/brotli.1"
350 DESTINATION "${CMAKE_INSTALL_FULL_MANDIR}/man1")
351 endif()
352
353 install(FILES docs/constants.h.3 docs/decode.h.3 docs/encode.h.3 docs/types.h.3
354 DESTINATION "${CMAKE_INSTALL_FULL_MANDIR}/man3")
355
356 if (ENABLE_COVERAGE STREQUAL "yes")
357 setup_target_for_coverage(coverage test coverage)
358 endif()