Mercurial > hgrepos > Python2 > PyMuPDF
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() |
