CMakeLists.txt 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410
  1. cmake_minimum_required(VERSION 3.5.1)
  2. if(CMAKE_VERSION VERSION_LESS 3.12)
  3. cmake_policy(VERSION ${CMAKE_VERSION})
  4. else()
  5. cmake_policy(VERSION 3.5.1...3.29.0)
  6. endif()
  7. message(STATUS "Using CMake version ${CMAKE_VERSION}")
  8. # If not specified on the command line, enable C11 as the default
  9. # Configuration items that affect the global compiler environment standards
  10. # should be issued before the "project" command.
  11. if(NOT CMAKE_C_STANDARD)
  12. set(CMAKE_C_STANDARD 11) # The C standard whose features are requested to build this target
  13. endif()
  14. if(NOT CMAKE_C_STANDARD_REQUIRED)
  15. set(CMAKE_C_STANDARD_REQUIRED ON) # Boolean describing whether the value of C_STANDARD is a requirement
  16. endif()
  17. if(NOT CMAKE_C_EXTENSIONS)
  18. set(CMAKE_C_EXTENSIONS OFF) # Boolean specifying whether compiler specific extensions are requested
  19. endif()
  20. set(VALID_C_STANDARDS "99" "11")
  21. if(NOT CMAKE_C_STANDARD IN_LIST VALID_C_STANDARDS)
  22. MESSAGE(FATAL_ERROR "CMAKE_C_STANDARD:STRING=${CMAKE_C_STANDARD} not in known standards list\n ${VALID_C_STANDARDS}")
  23. endif()
  24. # Parse the full version number from zlib.h.in and include in ZLIB_FULL_VERSION
  25. file(READ ${CMAKE_CURRENT_SOURCE_DIR}/zlib.h.in _zlib_h_contents)
  26. string(REGEX REPLACE ".*#define[ \t]+ZLIB_VERSION[ \t]+\"([0-9]+.[0-9]+.[0-9]+).*\".*"
  27. "\\1" ZLIB_HEADER_VERSION ${_zlib_h_contents})
  28. string(REGEX REPLACE ".*#define[ \t]+ZLIBNG_VERSION[ \t]+\"([-0-9A-Za-z.]+)\".*"
  29. "\\1" ZLIBNG_HEADER_VERSION ${_zlib_h_contents})
  30. message(STATUS "ZLIB_HEADER_VERSION: ${ZLIB_HEADER_VERSION}")
  31. message(STATUS "ZLIBNG_HEADER_VERSION: ${ZLIBNG_HEADER_VERSION}")
  32. project(zlib VERSION ${ZLIB_HEADER_VERSION} LANGUAGES C)
  33. include(CheckTypeSize)
  34. include(CheckSymbolExists)
  35. include(CheckFunctionExists)
  36. include(CheckIncludeFile)
  37. include(CheckCSourceCompiles)
  38. include(CheckCSourceRuns)
  39. include(CheckCCompilerFlag)
  40. include(CMakeDependentOption)
  41. include(CMakePackageConfigHelpers)
  42. include(FeatureSummary)
  43. include(cmake/detect-arch.cmake)
  44. include(cmake/detect-install-dirs.cmake)
  45. include(cmake/detect-coverage.cmake)
  46. include(cmake/detect-intrinsics.cmake)
  47. include(cmake/detect-sanitizer.cmake)
  48. include(cmake/fallback-macros.cmake)
  49. if(CMAKE_TOOLCHAIN_FILE)
  50. message(STATUS "Using CMake toolchain: ${CMAKE_TOOLCHAIN_FILE}")
  51. endif()
  52. # Make sure we use an appropriate BUILD_TYPE by default, "Release" to be exact
  53. # this should select the maximum generic optimisation on the current platform (i.e. -O3 for gcc/clang)
  54. get_property(GENERATOR_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
  55. if(NOT GENERATOR_IS_MULTI_CONFIG)
  56. if(NOT CMAKE_BUILD_TYPE)
  57. set(CMAKE_BUILD_TYPE "Release" CACHE STRING
  58. "Choose the type of build, standard options are: Debug Release RelWithDebInfo MinSizeRel."
  59. FORCE)
  60. add_feature_info(CMAKE_BUILD_TYPE 1 "Build type: ${CMAKE_BUILD_TYPE} (default)")
  61. else()
  62. add_feature_info(CMAKE_BUILD_TYPE 1 "Build type: ${CMAKE_BUILD_TYPE} (selected)")
  63. endif()
  64. endif()
  65. #
  66. # Options parsing
  67. #
  68. option(WITH_GZFILEOP "Compile with support for gzFile related functions" ON)
  69. option(ZLIB_COMPAT "Compile with zlib compatible API" ON)
  70. option(ZLIB_ENABLE_TESTS "Build test binaries" OFF)
  71. option(ZLIBNG_ENABLE_TESTS "Test zlib-ng specific API" OFF)
  72. option(WITH_GTEST "Build gtest_zlib" OFF)
  73. option(WITH_FUZZERS "Build test/fuzz" OFF)
  74. option(WITH_BENCHMARKS "Build test/benchmarks" OFF)
  75. option(WITH_BENCHMARK_APPS "Build application benchmarks" OFF)
  76. option(WITH_OPTIM "Build with optimisation" ON)
  77. option(WITH_REDUCED_MEM "Reduced memory usage for special cases (reduces performance)" OFF)
  78. option(WITH_NEW_STRATEGIES "Use new strategies" ON)
  79. option(WITH_NATIVE_INSTRUCTIONS
  80. "Instruct the compiler to use the full instruction set on this host (gcc/clang -march=native)" OFF)
  81. option(WITH_RUNTIME_CPU_DETECTION "Build with runtime detection of CPU architecture" ON)
  82. option(WITH_MAINTAINER_WARNINGS "Build with project maintainer warnings" OFF)
  83. option(WITH_CODE_COVERAGE "Enable code coverage reporting" OFF)
  84. option(WITH_INFLATE_STRICT "Build with strict inflate distance checking" OFF)
  85. option(WITH_INFLATE_ALLOW_INVALID_DIST "Build with zero fill for inflate invalid distances" OFF)
  86. option(WITH_UNALIGNED "Support unaligned reads on platforms that support it" ON)
  87. set(ZLIB_SYMBOL_PREFIX "" CACHE STRING "Give this prefix to all publicly exported symbols.
  88. Useful when embedding into a larger library.
  89. Default is no prefix (empty prefix).")
  90. # Add multi-choice option
  91. set(WITH_SANITIZER AUTO CACHE STRING "Enable sanitizer support")
  92. set_property(CACHE WITH_SANITIZER PROPERTY STRINGS "Memory" "Address" "Undefined" "Thread")
  93. if(BASEARCH_ARM_FOUND)
  94. option(WITH_ACLE "Build with ACLE" ON)
  95. option(WITH_NEON "Build with NEON intrinsics" ON)
  96. cmake_dependent_option(WITH_ARMV6 "Build with ARMv6 SIMD" ON "NOT ARCH STREQUAL \"aarch64\"" OFF)
  97. elseif(BASEARCH_PPC_FOUND)
  98. option(WITH_ALTIVEC "Build with AltiVec (VMX) optimisations for PowerPC" ON)
  99. option(WITH_POWER8 "Build with optimisations for POWER8" ON)
  100. option(WITH_POWER9 "Build with optimisations for POWER9" ON)
  101. elseif(BASEARCH_RISCV_FOUND)
  102. option(WITH_RVV "Build with RVV intrinsics" ON)
  103. elseif(BASEARCH_S360_FOUND)
  104. option(WITH_DFLTCC_DEFLATE "Build with DFLTCC intrinsics for compression on IBM Z" OFF)
  105. option(WITH_DFLTCC_INFLATE "Build with DFLTCC intrinsics for decompression on IBM Z" OFF)
  106. option(WITH_CRC32_VX "Build with vectorized CRC32 on IBM Z" ON)
  107. elseif(BASEARCH_X86_FOUND)
  108. option(WITH_SSE2 "Build with SSE2" ON)
  109. cmake_dependent_option(WITH_SSSE3 "Build with SSSE3" ON "WITH_SSE2" OFF)
  110. cmake_dependent_option(WITH_SSE42 "Build with SSE42" ON "WITH_SSSE3" OFF)
  111. cmake_dependent_option(WITH_PCLMULQDQ "Build with PCLMULQDQ" ON "WITH_SSE42" OFF)
  112. cmake_dependent_option(WITH_AVX2 "Build with AVX2" ON "WITH_SSE42" OFF)
  113. cmake_dependent_option(WITH_AVX512 "Build with AVX512" ON "WITH_AVX2" OFF)
  114. cmake_dependent_option(WITH_AVX512VNNI "Build with AVX512 VNNI extensions" ON "WITH_AVX512" OFF)
  115. cmake_dependent_option(WITH_VPCLMULQDQ "Build with VPCLMULQDQ" ON "WITH_PCLMULQDQ;WITH_AVX512" OFF)
  116. endif()
  117. option(INSTALL_UTILS "Copy minigzip and minideflate during install" OFF)
  118. set(ZLIB_BUILD_SHARED_LIBS OFF)
  119. set(SKIP_INSTALL_ALL ON)
  120. ocv_warnings_disable(CMAKE_C_FLAGS -Wmissing-prototypes -Wmissing-declarations -Wundef -Wstrict-prototypes -Wtype-limits)
  121. ocv_warnings_disable(CMAKE_C_FLAGS /wd4819 /wd4244 /wd4334)
  122. mark_as_advanced(FORCE
  123. ZLIB_SYMBOL_PREFIX
  124. WITH_REDUCED_MEM
  125. WITH_ACLE WITH_NEON
  126. WITH_ARMV6
  127. WITH_DFLTCC_DEFLATE
  128. WITH_DFLTCC_INFLATE
  129. WITH_CRC32_VX
  130. WITH_AVX2 WITH_SSE2
  131. WITH_SSSE3 WITH_SSE42
  132. WITH_PCLMULQDQ
  133. WITH_ALTIVEC
  134. WITH_POWER8
  135. WITH_POWER9
  136. WITH_RVV
  137. WITH_INFLATE_STRICT
  138. WITH_INFLATE_ALLOW_INVALID_DIST
  139. WITH_UNALIGNED
  140. INSTALL_UTILS
  141. )
  142. if(ZLIB_COMPAT)
  143. add_definitions(-DZLIB_COMPAT)
  144. set(WITH_GZFILEOP ON)
  145. set(SUFFIX "")
  146. set(ZLIB_FULL_VERSION ${ZLIB_HEADER_VERSION}.zlib-ng)
  147. set(EXPORT_NAME ZLIB)
  148. else()
  149. set(SUFFIX "-ng")
  150. set(ZLIB_FULL_VERSION ${ZLIBNG_HEADER_VERSION})
  151. set(EXPORT_NAME zlib-ng)
  152. endif()
  153. if(WITH_GZFILEOP)
  154. add_definitions(-DWITH_GZFILEOP)
  155. endif()
  156. if(CMAKE_C_COMPILER_ID MATCHES "^Intel")
  157. if(CMAKE_HOST_UNIX)
  158. set(WARNFLAGS -Wall)
  159. set(WARNFLAGS_MAINTAINER -Wall -Wcheck -Wremarks)
  160. set(WARNFLAGS_DISABLE)
  161. else()
  162. set(WARNFLAGS /Wall)
  163. set(WARNFLAGS_MAINTAINER /W5)
  164. set(WARNFLAGS_DISABLE)
  165. endif()
  166. check_c_compiler_flag(-diag-disable=10441 HAVE_DIAG_10441)
  167. if(HAVE_DIAG_10441)
  168. list(APPEND WARNFLAGS_DISABLE "-diag-disable=10441")
  169. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -diag-disable=10441")
  170. set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -diag-disable=10441")
  171. endif()
  172. elseif(MSVC)
  173. # Minimum supported MSVC version is 1800 = Visual Studio 12.0/2013
  174. # See also https://cmake.org/cmake/help/latest/variable/MSVC_VERSION.html
  175. if(MSVC_VERSION VERSION_LESS 1800)
  176. message(SEND_ERROR "Unsupported Visual Studio compiler version (requires 2013 or later).")
  177. endif()
  178. # TODO. ICC can be used through MSVC. I'm not sure if we'd ever see that combination
  179. # (who'd use cmake from an IDE...) but checking for ICC before checking for MSVC should
  180. # avoid mistakes.
  181. # /Oi ?
  182. set(WARNFLAGS /W3)
  183. set(WARNFLAGS_MAINTAINER /W4)
  184. set(WARNFLAGS_DISABLE)
  185. if(BASEARCH_ARM_FOUND)
  186. add_definitions(-D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE)
  187. if(NOT "${ARCH}" MATCHES "aarch64")
  188. set(NEONFLAG "/arch:VFPv4")
  189. endif()
  190. endif()
  191. elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
  192. # Enable warnings in GCC and Clang
  193. set(WARNFLAGS -Wall)
  194. set(WARNFLAGS_MAINTAINER -Wextra)
  195. set(WARNFLAGS_DISABLE)
  196. # Check whether -fno-lto is available
  197. set(CMAKE_REQUIRED_FLAGS "-fno-lto")
  198. check_c_source_compiles(
  199. "int main() { return 0; }"
  200. FNO_LTO_AVAILABLE FAIL_REGEX "not supported")
  201. set(CMAKE_REQUIRED_FLAGS)
  202. if(FNO_LTO_AVAILABLE)
  203. set(ZNOLTOFLAG "-fno-lto")
  204. endif()
  205. if(NOT WITH_NATIVE_INSTRUCTIONS)
  206. if(BASEARCH_ARM_FOUND)
  207. if("${ARCH}" MATCHES "arm" AND NOT CMAKE_C_FLAGS MATCHES "-mfloat-abi")
  208. # Auto-detect support for ARM floating point ABI
  209. check_include_file(features.h HAVE_FEATURES_H)
  210. if(HAVE_FEATURES_H)
  211. set(CMAKE_REQUIRED_FLAGS -mfloat-abi=softfp)
  212. check_c_source_compiles(
  213. "#include <features.h>
  214. int main() { return 0; }"
  215. HAVE_FLOATABI_SOFTFP)
  216. if(HAVE_FLOATABI_SOFTFP)
  217. set(FLOATABI -mfloat-abi=softfp)
  218. else()
  219. set(CMAKE_REQUIRED_FLAGS -mfloat-abi=hard)
  220. check_c_source_compiles(
  221. "#include <features.h>
  222. int main() { return 0; }"
  223. HAVE_FLOATABI_HARD)
  224. if(HAVE_FLOATABI_HARD)
  225. set(FLOATABI -mfloat-abi=hard)
  226. endif()
  227. endif()
  228. set(CMAKE_REQUIRED_FLAGS)
  229. endif()
  230. if(FLOATABI)
  231. message(STATUS "ARM floating point arch: ${FLOATABI}")
  232. add_compile_options(${FLOATABI})
  233. else()
  234. message(STATUS "ARM floating point arch not auto-detected")
  235. endif()
  236. endif()
  237. endif()
  238. # Disable LTO unless Native Instructions are enabled
  239. if(FNO_LTO_AVAILABLE)
  240. set(NOLTOFLAG ${ZNOLTOFLAG})
  241. endif()
  242. endif()
  243. if(MINGW)
  244. # Add `-Wno-pedantic-ms-format` only if the toolchain supports it
  245. check_c_compiler_flag(-Wno-pedantic-ms-format HAVE_NO_PEDANTIC_MS_FORMAT)
  246. if(HAVE_NO_PEDANTIC_MS_FORMAT)
  247. list(APPEND WARNFLAGS_DISABLE -Wno-pedantic-ms-format)
  248. endif()
  249. endif()
  250. endif()
  251. # Set native march/mcpu
  252. if(WITH_NATIVE_INSTRUCTIONS)
  253. if(NATIVE_ARCH_OVERRIDE)
  254. message(STATUS "WARNING: WITH_NATIVE_INSTRUCTIONS enabled, but running with NATIVE_ARCH_OVERRIDE: ${NATIVE_ARCH_OVERRIDE}")
  255. set(NATIVEFLAG "${NATIVE_ARCH_OVERRIDE}")
  256. else()
  257. if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
  258. check_c_compiler_flag(-march=native HAVE_MARCH_NATIVE)
  259. if(HAVE_MARCH_NATIVE)
  260. set(NATIVEFLAG "-march=native")
  261. else()
  262. check_c_compiler_flag(-mcpu=native HAVE_MCPU_NATIVE)
  263. if(HAVE_MCPU_NATIVE)
  264. set(NATIVEFLAG "-mcpu=native")
  265. endif()
  266. endif()
  267. # Fall through
  268. endif()
  269. endif()
  270. if(NATIVEFLAG)
  271. # Apply flags to all source files and compilation checks
  272. if(WIN32)
  273. separate_arguments(NATIVEOPTIONS WINDOWS_COMMAND "${NATIVEFLAG}")
  274. else()
  275. separate_arguments(NATIVEOPTIONS UNIX_COMMAND "${NATIVEFLAG}")
  276. endif()
  277. add_compile_options(${NATIVEOPTIONS})
  278. set(WITH_RUNTIME_CPU_DETECTION OFF)
  279. else()
  280. message(STATUS "Ignoring WITH_NATIVE_INSTRUCTIONS; not implemented yet on this configuration")
  281. set(WITH_NATIVE_INSTRUCTIONS OFF)
  282. endif()
  283. endif()
  284. # Compile without functable or CPU detection
  285. if(NOT WITH_RUNTIME_CPU_DETECTION)
  286. if(MSVC AND BASEARCH_X86_FOUND)
  287. message(STATUS "WARNING: Microsoft Visual Studio does not support compile time detection of CPU features for \"/arch\" before \"AVX\"")
  288. # Workaround for MSVC. By default MSVC does not define the __SSE*__ macros.
  289. # Fix it if AVX is enabled.
  290. set(CMAKE_REQUIRED_FLAGS "${NATIVEFLAG}")
  291. check_c_source_compiles(
  292. "#ifndef __AVX__
  293. # error \"AVX is not enabled.\"
  294. #endif
  295. int main(void) { return 0; }"
  296. MSVC_IS_ENABLED_AVX
  297. )
  298. set(CMAKE_REQUIRED_FLAGS)
  299. if(MSVC_IS_ENABLED_AVX)
  300. add_definitions(
  301. -D__SSE__=1
  302. -D__SSE2__=1
  303. -D__SSE3__=1
  304. -D__SSSE3__=1
  305. -D__SSE4_1__=1
  306. -D__SSE4_2__=1
  307. -D__PCLMUL__=1
  308. )
  309. endif()
  310. endif()
  311. add_definitions(-DDISABLE_RUNTIME_CPU_DETECTION)
  312. endif()
  313. # Force disable LTO if WITH_NATIVE_INSTRUCTIONS is not active
  314. if(NOT WITH_NATIVE_INSTRUCTIONS)
  315. set(CMAKE_INTERPROCEDURAL_OPTIMIZATION OFF)
  316. foreach(_cfg_name IN LISTS CMAKE_CONFIGURATION_TYPES)
  317. string(TOUPPER "${_cfg_name}" _cfg_name_uc)
  318. set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_${_cfg_name_uc} OFF)
  319. endforeach()
  320. endif()
  321. # Set architecture alignment requirements
  322. if(NOT WITH_UNALIGNED)
  323. add_definitions(-DNO_UNALIGNED)
  324. message(STATUS "Unaligned reads manually disabled")
  325. endif()
  326. # Apply warning compiler flags
  327. if(WITH_MAINTAINER_WARNINGS)
  328. add_compile_options(${WARNFLAGS} ${WARNFLAGS_MAINTAINER} ${WARNFLAGS_DISABLE})
  329. else()
  330. add_compile_options(${WARNFLAGS} ${WARNFLAGS_DISABLE})
  331. endif()
  332. # Set code coverage compiler flags
  333. if(WITH_CODE_COVERAGE)
  334. add_code_coverage()
  335. endif()
  336. # Replace optimization level 3 added by default with level 2
  337. if(NOT WITH_CODE_COVERAGE AND NOT MSVC AND NOT CMAKE_C_FLAGS MATCHES "([\\/\\-]O)3")
  338. string(REGEX REPLACE "([\\/\\-]O)3" "\\12"
  339. CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
  340. endif()
  341. #
  342. # Check for standard/system includes
  343. #
  344. check_include_file(arm_acle.h HAVE_ARM_ACLE_H)
  345. if(HAVE_ARM_ACLE_H)
  346. add_definitions(-DHAVE_ARM_ACLE_H)
  347. endif()
  348. check_include_file(sys/auxv.h HAVE_SYS_AUXV_H)
  349. if(HAVE_SYS_AUXV_H)
  350. add_definitions(-DHAVE_SYS_AUXV_H)
  351. endif()
  352. check_include_file(sys/sdt.h HAVE_SYS_SDT_H)
  353. if(HAVE_SYS_SDT_H)
  354. add_definitions(-DHAVE_SYS_SDT_H)
  355. endif()
  356. check_include_file(unistd.h HAVE_UNISTD_H)
  357. #
  358. # Check for Linux includes
  359. #
  360. check_include_file(linux/auxvec.h HAVE_LINUX_AUXVEC_H)
  361. if(HAVE_LINUX_AUXVEC_H)
  362. add_definitions(-DHAVE_LINUX_AUXVEC_H)
  363. endif()
  364. #
  365. # Check to see if we have large file support
  366. #
  367. set(CMAKE_REQUIRED_DEFINITIONS -D_LARGEFILE64_SOURCE=1 -D__USE_LARGEFILE64)
  368. check_type_size(off64_t OFF64_T)
  369. if(HAVE_OFF64_T)
  370. add_definitions(-D_LARGEFILE64_SOURCE=1 -D__USE_LARGEFILE64)
  371. else()
  372. check_type_size(_off64_t _OFF64_T)
  373. if(HAVE__OFF64_T)
  374. add_definitions(-D_LARGEFILE64_SOURCE=1 -D__USE_LARGEFILE64)
  375. else()
  376. check_type_size(__off64_t __OFF64_T)
  377. endif()
  378. endif()
  379. set(CMAKE_REQUIRED_DEFINITIONS) # clear variable
  380. #
  381. # Check for fseeko and other optional functions
  382. #
  383. check_function_exists(fseeko HAVE_FSEEKO)
  384. if(NOT HAVE_FSEEKO)
  385. add_definitions(-DNO_FSEEKO)
  386. endif()
  387. check_function_exists(strerror HAVE_STRERROR)
  388. if(NOT HAVE_STRERROR)
  389. add_definitions(-DNO_STRERROR)
  390. endif()
  391. set(CMAKE_REQUIRED_DEFINITIONS -D_POSIX_C_SOURCE=200112L)
  392. check_symbol_exists(posix_memalign stdlib.h HAVE_POSIX_MEMALIGN)
  393. if(HAVE_POSIX_MEMALIGN)
  394. add_definitions(-DHAVE_POSIX_MEMALIGN)
  395. endif()
  396. set(CMAKE_REQUIRED_DEFINITIONS)
  397. set(CMAKE_REQUIRED_DEFINITIONS -D_ISOC11_SOURCE=1)
  398. check_symbol_exists(aligned_alloc stdlib.h HAVE_ALIGNED_ALLOC)
  399. if(HAVE_ALIGNED_ALLOC)
  400. add_definitions(-DHAVE_ALIGNED_ALLOC)
  401. endif()
  402. set(CMAKE_REQUIRED_DEFINITIONS)
  403. if(WITH_SANITIZER STREQUAL "Address")
  404. add_address_sanitizer()
  405. elseif(WITH_SANITIZER STREQUAL "Memory")
  406. add_memory_sanitizer()
  407. elseif(WITH_SANITIZER STREQUAL "Thread")
  408. add_thread_sanitizer()
  409. elseif(WITH_SANITIZER STREQUAL "Undefined")
  410. add_undefined_sanitizer()
  411. endif()
  412. #
  413. # Check whether compiler supports -fno-semantic-interposition parameter
  414. #
  415. check_c_compiler_flag(-fno-semantic-interposition HAVE_NO_INTERPOSITION)
  416. #
  417. # Check if we can hide zlib internal symbols that are linked between separate source files using hidden
  418. #
  419. check_c_source_compiles(
  420. "#define Z_INTERNAL __attribute__((visibility (\"hidden\")))
  421. int Z_INTERNAL foo;
  422. int main() {
  423. return 0;
  424. }"
  425. HAVE_ATTRIBUTE_VISIBILITY_HIDDEN FAIL_REGEX "visibility")
  426. if(HAVE_ATTRIBUTE_VISIBILITY_HIDDEN)
  427. add_definitions(-DHAVE_VISIBILITY_HIDDEN)
  428. endif()
  429. #
  430. # Check if we can hide zlib internal symbols that are linked between separate source files using internal
  431. #
  432. check_c_source_compiles(
  433. "#define Z_INTERNAL __attribute__((visibility (\"internal\")))
  434. int Z_INTERNAL foo;
  435. int main() {
  436. return 0;
  437. }"
  438. HAVE_ATTRIBUTE_VISIBILITY_INTERNAL FAIL_REGEX "visibility")
  439. if(HAVE_ATTRIBUTE_VISIBILITY_INTERNAL)
  440. add_definitions(-DHAVE_VISIBILITY_INTERNAL)
  441. endif()
  442. #
  443. # Check for __attribute__((aligned(x))) support in the compiler
  444. #
  445. check_c_source_compiles(
  446. "int main(void) {
  447. __attribute__((aligned(8))) int test = 0;
  448. (void)test;
  449. return 0;
  450. }"
  451. HAVE_ATTRIBUTE_ALIGNED FAIL_REGEX "aligned")
  452. if(HAVE_ATTRIBUTE_ALIGNED)
  453. add_definitions(-DHAVE_ATTRIBUTE_ALIGNED)
  454. endif()
  455. #
  456. # Check for __builtin_assume_aligned(x,n) support in the compiler
  457. #
  458. check_c_source_compiles(
  459. "char *test(char *buffer) {
  460. char *abuffer = __builtin_assume_aligned(buffer,64);
  461. return abuffer;
  462. }
  463. int main() {
  464. return 0;
  465. }"
  466. HAVE_BUILTIN_ASSUME_ALIGNED)
  467. if(HAVE_BUILTIN_ASSUME_ALIGNED)
  468. add_definitions(-DHAVE_BUILTIN_ASSUME_ALIGNED)
  469. endif()
  470. #
  471. # check for __builtin_ctz() support in the compiler
  472. #
  473. check_c_source_compiles(
  474. "int main(void) {
  475. unsigned int zero = 0;
  476. long test = __builtin_ctz(zero);
  477. (void)test;
  478. return 0;
  479. }"
  480. HAVE_BUILTIN_CTZ
  481. )
  482. if(HAVE_BUILTIN_CTZ)
  483. add_definitions(-DHAVE_BUILTIN_CTZ)
  484. endif()
  485. #
  486. # check for __builtin_ctzll() support in the compiler
  487. #
  488. check_c_source_compiles(
  489. "int main(void) {
  490. unsigned int zero = 0;
  491. long test = __builtin_ctzll(zero);
  492. (void)test;
  493. return 0;
  494. }"
  495. HAVE_BUILTIN_CTZLL
  496. )
  497. if(HAVE_BUILTIN_CTZLL)
  498. add_definitions(-DHAVE_BUILTIN_CTZLL)
  499. endif()
  500. #
  501. # check for ptrdiff_t support
  502. #
  503. check_c_source_compiles(
  504. "#include <stddef.h>
  505. int main() {
  506. ptrdiff_t *a;
  507. (void)a;
  508. return 0;
  509. }"
  510. HAVE_PTRDIFF_T
  511. )
  512. if(NOT HAVE_PTRDIFF_T)
  513. set(NEED_PTRDIFF_T 1)
  514. check_type_size("void *" SIZEOF_DATA_PTR)
  515. message(STATUS "sizeof(void *) is ${SIZEOF_DATA_PTR} bytes")
  516. if(${SIZEOF_DATA_PTR} MATCHES "4")
  517. set(PTRDIFF_TYPE "uint32_t")
  518. elseif(${SIZEOF_DATA_PTR} MATCHES "8")
  519. set(PTRDIFF_TYPE "uint64_t")
  520. else()
  521. message(FATAL_ERROR "sizeof(void *) is neither 32 nor 64 bit")
  522. endif()
  523. endif()
  524. add_compile_options($<$<CONFIG:Debug>:-DZLIB_DEBUG>)
  525. if(MSVC)
  526. set(CMAKE_DEBUG_POSTFIX "d")
  527. add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
  528. add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE)
  529. endif()
  530. if(BASEARCH_X86_FOUND)
  531. # FORCE_SSE2 option will only be shown if HAVE_SSE2_INTRIN is true
  532. if("${ARCH}" MATCHES "i[3-6]86")
  533. cmake_dependent_option(FORCE_SSE2 "Always assume CPU is SSE2 capable" OFF "HAVE_SSE2_INTRIN" OFF)
  534. endif()
  535. endif()
  536. #
  537. # Enable deflate_quick at level 1
  538. #
  539. if(NOT WITH_NEW_STRATEGIES)
  540. add_definitions(-DNO_QUICK_STRATEGY)
  541. endif()
  542. #
  543. # Enable deflate_medium at level 4-6
  544. #
  545. if(NOT WITH_NEW_STRATEGIES)
  546. add_definitions(-DNO_MEDIUM_STRATEGY)
  547. endif()
  548. #
  549. # Enable inflate compilation options
  550. #
  551. if(WITH_INFLATE_STRICT)
  552. add_definitions(-DINFLATE_STRICT)
  553. message(STATUS "Inflate strict distance checking enabled")
  554. endif()
  555. if(WITH_INFLATE_ALLOW_INVALID_DIST)
  556. add_definitions(-DINFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR)
  557. message(STATUS "Inflate zero data for invalid distances enabled")
  558. endif()
  559. #
  560. # Enable reduced memory configuration
  561. #
  562. if(WITH_REDUCED_MEM)
  563. add_definitions(-DHASH_SIZE=32768u -DGZBUFSIZE=8192 -DNO_LIT_MEM)
  564. message(STATUS "Configured for reduced memory environment")
  565. endif()
  566. set(GENERIC_ARCHDIR "arch/generic")
  567. set(ZLIB_ARCH_SRCS)
  568. set(ZLIB_ARCH_HDRS ${GENERIC_ARCHDIR}/generic_functions.h)
  569. if(BASEARCH_ARM_FOUND)
  570. set(ARCHDIR "arch/arm")
  571. elseif(BASEARCH_PPC_FOUND)
  572. set(ARCHDIR "arch/power")
  573. elseif(BASEARCH_RISCV_FOUND)
  574. set(ARCHDIR "arch/riscv")
  575. elseif(BASEARCH_S360_FOUND)
  576. set(ARCHDIR "arch/s390")
  577. elseif(BASEARCH_X86_FOUND)
  578. set(ARCHDIR "arch/x86")
  579. if(NOT ${ARCH} MATCHES "x86_64")
  580. add_feature_info(SSE2 1 "Support the SSE2 instruction set, using \"${SSE2FLAG}\"")
  581. endif()
  582. else()
  583. set(ARCHDIR ${GENERIC_ARCHDIR})
  584. message(STATUS "No optimized architecture: using ${ARCHDIR}")
  585. endif()
  586. if(WITH_OPTIM)
  587. if(BASEARCH_ARM_FOUND)
  588. add_definitions(-DARM_FEATURES)
  589. if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
  590. if("${ARCH}" MATCHES "aarch64")
  591. check_c_source_compiles(
  592. "#include <sys/auxv.h>
  593. int main() {
  594. return (getauxval(AT_HWCAP) & HWCAP_CRC32);
  595. }"
  596. ARM_AUXV_HAS_CRC32
  597. )
  598. if(ARM_AUXV_HAS_CRC32)
  599. add_definitions(-DARM_AUXV_HAS_CRC32)
  600. else()
  601. message(STATUS "HWCAP_CRC32 not present in sys/auxv.h; cannot detect support at runtime.")
  602. endif()
  603. else()
  604. check_c_source_compiles(
  605. "#include <sys/auxv.h>
  606. int main() {
  607. return (getauxval(AT_HWCAP2) & HWCAP2_CRC32);
  608. }"
  609. ARM_AUXV_HAS_CRC32
  610. )
  611. if(ARM_AUXV_HAS_CRC32)
  612. add_definitions(-DARM_AUXV_HAS_CRC32)
  613. else()
  614. check_c_source_compiles(
  615. "#include <sys/auxv.h>
  616. #include <asm/hwcap.h>
  617. int main() {
  618. return (getauxval(AT_HWCAP2) & HWCAP2_CRC32);
  619. }"
  620. ARM_HWCAP_HAS_CRC32
  621. )
  622. if (ARM_HWCAP_HAS_CRC32)
  623. add_definitions(-DARM_AUXV_HAS_CRC32 -DARM_ASM_HWCAP)
  624. else()
  625. message(STATUS "HWCAP2_CRC32 not present in sys/auxv.h; cannot detect support at runtime.")
  626. endif()
  627. endif()
  628. check_c_source_compiles(
  629. "#include <sys/auxv.h>
  630. int main() {
  631. return (getauxval(AT_HWCAP) & HWCAP_ARM_NEON);
  632. }"
  633. ARM_AUXV_HAS_NEON
  634. )
  635. if(ARM_AUXV_HAS_NEON)
  636. add_definitions(-DARM_AUXV_HAS_NEON)
  637. else()
  638. check_c_source_compiles(
  639. "#include <sys/auxv.h>
  640. int main() {
  641. return (getauxval(AT_HWCAP) & HWCAP_NEON);
  642. }"
  643. ARM_AUXV_HAS_NEON
  644. )
  645. if (ARM_AUXV_HAS_NEON)
  646. add_definitions(-DARM_AUXV_HAS_NEON)
  647. else()
  648. message(STATUS "Neither HWCAP_ARM_NEON or HWCAP_NEON present in sys/auxv.h; cannot detect support at runtime.")
  649. endif()
  650. endif()
  651. endif()
  652. endif()
  653. list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/arm_functions.h)
  654. if(WITH_RUNTIME_CPU_DETECTION)
  655. list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/arm_features.h)
  656. list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/arm_features.c)
  657. endif()
  658. if(WITH_ACLE)
  659. check_acle_compiler_flag()
  660. if(HAVE_ACLE_FLAG)
  661. add_definitions(-DARM_ACLE)
  662. set(ACLE_SRCS ${ARCHDIR}/crc32_acle.c)
  663. set_property(SOURCE ${ACLE_SRCS} PROPERTY COMPILE_FLAGS "${ACLEFLAG} ${NOLTOFLAG}")
  664. list(APPEND ZLIB_ARCH_SRCS ${ACLE_SRCS})
  665. add_feature_info(ACLE_CRC 1 "Support ACLE optimized CRC hash generation, using \"${ACLEFLAG}\"")
  666. else()
  667. set(WITH_ACLE OFF)
  668. endif()
  669. else()
  670. set(WITH_ACLE OFF)
  671. endif()
  672. if(WITH_NEON)
  673. check_neon_compiler_flag()
  674. if(NEON_AVAILABLE)
  675. add_definitions(-DARM_NEON)
  676. set(NEON_SRCS ${ARCHDIR}/adler32_neon.c ${ARCHDIR}/chunkset_neon.c
  677. ${ARCHDIR}/compare256_neon.c ${ARCHDIR}/slide_hash_neon.c)
  678. list(APPEND ZLIB_ARCH_SRCS ${NEON_SRCS})
  679. set_property(SOURCE ${NEON_SRCS} PROPERTY COMPILE_FLAGS "${NEONFLAG} ${NOLTOFLAG}")
  680. if(MSVC)
  681. add_definitions(-D__ARM_NEON__)
  682. endif()
  683. add_feature_info(NEON_ADLER32 1 "Support NEON instructions in adler32, using \"${NEONFLAG}\"")
  684. add_feature_info(NEON_SLIDEHASH 1 "Support NEON instructions in slide_hash, using \"${NEONFLAG}\"")
  685. check_neon_ld4_intrinsics()
  686. if(NEON_HAS_LD4)
  687. add_definitions(-DARM_NEON_HASLD4)
  688. endif()
  689. else()
  690. set(WITH_NEON OFF)
  691. endif()
  692. endif()
  693. if(WITH_ARMV6)
  694. check_armv6_compiler_flag()
  695. if(HAVE_ARMV6_INLINE_ASM OR HAVE_ARMV6_INTRIN)
  696. add_definitions(-DARM_SIMD)
  697. set(ARMV6_SRCS ${ARCHDIR}/slide_hash_armv6.c)
  698. set_property(SOURCE ${ARMV6_SRCS} PROPERTY COMPILE_FLAGS "${ARMV6FLAG} ${NOLTOFLAG}")
  699. list(APPEND ZLIB_ARCH_SRCS ${ARMV6_SRCS})
  700. add_feature_info(ARMV6 1 "Support ARMv6 SIMD instructions in slide_hash, using \"${ARMV6FLAG}\"")
  701. if(HAVE_ARMV6_INTRIN)
  702. add_definitions(-DARM_SIMD_INTRIN)
  703. endif()
  704. else()
  705. set(WITH_ARMV6 OFF)
  706. endif()
  707. else()
  708. set(WITH_ARMV6 OFF)
  709. endif()
  710. elseif(BASEARCH_PPC_FOUND)
  711. # Common arch detection code
  712. if(WITH_ALTIVEC)
  713. check_ppc_intrinsics()
  714. endif()
  715. if(WITH_POWER8)
  716. check_power8_intrinsics()
  717. endif()
  718. if(WITH_POWER9)
  719. check_power9_intrinsics()
  720. endif()
  721. if(POWER8_NEED_AUXVEC_H OR POWER9_NEED_AUXVEC_H)
  722. add_definitions(-DPOWER_NEED_AUXVEC_H)
  723. endif()
  724. if(HAVE_POWER8_INTRIN OR HAVE_POWER9_INTRIN)
  725. add_definitions(-DPOWER_FEATURES)
  726. endif()
  727. if(HAVE_VMX OR HAVE_POWER8_INTRIN OR HAVE_POWER9_INTRIN)
  728. list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/power_functions.h)
  729. if(WITH_RUNTIME_CPU_DETECTION)
  730. list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/power_features.h)
  731. list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/power_features.c)
  732. endif()
  733. endif()
  734. # VMX specific options and files
  735. if(WITH_ALTIVEC)
  736. if(HAVE_VMX)
  737. add_definitions(-DPPC_FEATURES)
  738. if(HAVE_ALTIVEC)
  739. add_definitions(-DPPC_VMX)
  740. set(PPC_SRCS ${ARCHDIR}/adler32_vmx.c ${ARCHDIR}/slide_hash_vmx.c)
  741. list(APPEND ZLIB_ARCH_SRCS ${PPC_SRCS})
  742. add_feature_info(ALTIVEC 1 "Support the AltiVec instruction set, using \"-maltivec\"")
  743. set_property(SOURCE ${PPC_SRCS} PROPERTY COMPILE_FLAGS "${PPCFLAGS}")
  744. else()
  745. set(WITH_ALTIVEC OFF)
  746. endif()
  747. endif()
  748. endif()
  749. # Power8 specific options and files
  750. if(WITH_POWER8)
  751. if(HAVE_POWER8_INTRIN)
  752. add_definitions(-DPOWER8_VSX)
  753. set(POWER8_SRCS ${ARCHDIR}/adler32_power8.c ${ARCHDIR}/chunkset_power8.c ${ARCHDIR}/slide_hash_power8.c)
  754. if("${ARCH}" MATCHES "powerpc64(le)?")
  755. add_definitions(-DPOWER8_VSX_CRC32)
  756. list(APPEND POWER8_SRCS ${ARCHDIR}/crc32_power8.c)
  757. endif()
  758. list(APPEND ZLIB_ARCH_SRCS ${POWER8_SRCS})
  759. set_property(SOURCE ${POWER8_SRCS} PROPERTY COMPILE_FLAGS "${POWER8FLAG} ${NOLTOFLAG}")
  760. else()
  761. set(WITH_POWER8 OFF)
  762. endif()
  763. endif()
  764. # Power9 specific options and files
  765. if(WITH_POWER9)
  766. if(HAVE_POWER9_INTRIN)
  767. add_definitions(-DPOWER9)
  768. set(POWER9_SRCS ${ARCHDIR}/compare256_power9.c)
  769. list(APPEND ZLIB_ARCH_SRCS ${POWER9_SRCS})
  770. set_property(SOURCE ${POWER9_SRCS} PROPERTY COMPILE_FLAGS "${POWER9FLAG} ${NOLTOFLAG}")
  771. else()
  772. set(WITH_POWER9 OFF)
  773. endif()
  774. endif()
  775. elseif(BASEARCH_RISCV_FOUND)
  776. if(WITH_RVV)
  777. check_rvv_intrinsics()
  778. if(HAVE_RVV_INTRIN)
  779. add_definitions(-DRISCV_FEATURES)
  780. add_definitions(-DRISCV_RVV)
  781. list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/riscv_functions.h)
  782. if(WITH_RUNTIME_CPU_DETECTION)
  783. list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/riscv_features.h)
  784. list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/riscv_features.c)
  785. endif()
  786. # FIXME: we will not set compile flags for riscv_features.c when
  787. # the kernels update hwcap or hwprobe for riscv
  788. set(RVV_SRCS ${ARCHDIR}/adler32_rvv.c ${ARCHDIR}/chunkset_rvv.c ${ARCHDIR}/compare256_rvv.c ${ARCHDIR}/slide_hash_rvv.c)
  789. if(WITH_RUNTIME_CPU_DETECTION)
  790. list(APPEND RVV_SRCS ${ARCHDIR}/riscv_features.c)
  791. endif()
  792. list(APPEND ZLIB_ARCH_SRCS ${RVV_SRCS})
  793. set_property(SOURCE ${RVV_SRCS} PROPERTY COMPILE_FLAGS "${RISCVFLAG} ${NOLTOFLAG}")
  794. else()
  795. set(WITH_RVV OFF)
  796. endif()
  797. endif()
  798. elseif(BASEARCH_S360_FOUND)
  799. check_s390_intrinsics()
  800. if(HAVE_S390_INTRIN)
  801. add_definitions(-DS390_FEATURES)
  802. list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/s390_functions.h)
  803. if(WITH_RUNTIME_CPU_DETECTION)
  804. list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/s390_features.h)
  805. list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/s390_features.c)
  806. endif()
  807. endif()
  808. if(WITH_DFLTCC_DEFLATE)
  809. add_definitions(-DS390_DFLTCC_DEFLATE)
  810. list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/dfltcc_deflate.c)
  811. endif()
  812. if(WITH_DFLTCC_INFLATE)
  813. add_definitions(-DS390_DFLTCC_INFLATE)
  814. list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/dfltcc_inflate.c)
  815. endif()
  816. if(WITH_CRC32_VX)
  817. check_vgfma_intrinsics()
  818. if(HAVE_VGFMA_INTRIN)
  819. add_definitions(-DS390_CRC32_VX)
  820. set(CRC32_VX_SRCS ${ARCHDIR}/crc32-vx.c)
  821. list(APPEND ZLIB_ARCH_SRCS ${CRC32_VX_SRCS})
  822. set_property(SOURCE ${CRC32_VX_SRCS} PROPERTY COMPILE_FLAGS "${VGFMAFLAG} ${NOLTOFLAG}")
  823. else()
  824. set(WITH_CRC32_VX OFF)
  825. endif()
  826. endif()
  827. elseif(BASEARCH_X86_FOUND)
  828. add_definitions(-DX86_FEATURES)
  829. list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/x86_functions.h)
  830. if(WITH_RUNTIME_CPU_DETECTION)
  831. list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/x86_features.h)
  832. list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/x86_features.c)
  833. endif()
  834. if(MSVC)
  835. list(APPEND ZLIB_ARCH_HDRS fallback_builtins.h)
  836. endif()
  837. check_xsave_intrinsics()
  838. if(HAVE_XSAVE_INTRIN)
  839. add_feature_info(XSAVE 1 "Support XSAVE intrinsics using \"${XSAVEFLAG}\"")
  840. if(WITH_RUNTIME_CPU_DETECTION)
  841. set_property(SOURCE ${ARCHDIR}/x86_features.c PROPERTY COMPILE_FLAGS "${XSAVEFLAG}")
  842. endif()
  843. if(NOT (CMAKE_C_COMPILER_ID MATCHES "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_LESS 8.2))
  844. add_definitions(-DX86_HAVE_XSAVE_INTRIN)
  845. endif()
  846. endif()
  847. if(WITH_SSE2)
  848. check_sse2_intrinsics()
  849. if(HAVE_SSE2_INTRIN)
  850. add_definitions(-DX86_SSE2)
  851. set(SSE2_SRCS ${ARCHDIR}/chunkset_sse2.c ${ARCHDIR}/compare256_sse2.c ${ARCHDIR}/slide_hash_sse2.c)
  852. list(APPEND ZLIB_ARCH_SRCS ${SSE2_SRCS})
  853. if(NOT ${ARCH} MATCHES "x86_64")
  854. set_property(SOURCE ${SSE2_SRCS} PROPERTY COMPILE_FLAGS "${SSE2FLAG} ${NOLTOFLAG}")
  855. add_feature_info(FORCE_SSE2 FORCE_SSE2 "Assume CPU is SSE2 capable")
  856. if(FORCE_SSE2)
  857. add_definitions(-DX86_NOCHECK_SSE2)
  858. endif()
  859. endif()
  860. else()
  861. set(WITH_SSE2 OFF)
  862. endif()
  863. endif()
  864. if(WITH_SSSE3)
  865. check_ssse3_intrinsics()
  866. if(HAVE_SSSE3_INTRIN AND WITH_SSE2)
  867. add_definitions(-DX86_SSSE3)
  868. set(SSSE3_SRCS ${ARCHDIR}/adler32_ssse3.c ${ARCHDIR}/chunkset_ssse3.c)
  869. add_feature_info(SSSE3_ADLER32 1 "Support SSSE3-accelerated adler32, using \"${SSSE3FLAG}\"")
  870. list(APPEND ZLIB_ARCH_SRCS ${SSSE3_SRCS})
  871. set_property(SOURCE ${SSSE3_SRCS} PROPERTY COMPILE_FLAGS "${SSSE3FLAG} ${NOLTOFLAG}")
  872. else()
  873. set(WITH_SSSE3 OFF)
  874. endif()
  875. endif()
  876. if(WITH_SSE42)
  877. check_sse42_intrinsics()
  878. if(HAVE_SSE42_INTRIN AND WITH_SSSE3)
  879. add_definitions(-DX86_SSE42)
  880. set(SSE42_SRCS ${ARCHDIR}/adler32_sse42.c)
  881. add_feature_info(SSE42_CRC 1 "Support SSE4.2 optimized adler32 hash generation, using \"${SSE42FLAG}\"")
  882. list(APPEND ZLIB_ARCH_SRCS ${SSE42_SRCS})
  883. set_property(SOURCE ${SSE42_SRCS} PROPERTY COMPILE_FLAGS "${SSE42FLAG} ${NOLTOFLAG}")
  884. else()
  885. set(WITH_SSE42 OFF)
  886. endif()
  887. endif()
  888. if(WITH_PCLMULQDQ)
  889. check_pclmulqdq_intrinsics()
  890. if(HAVE_PCLMULQDQ_INTRIN AND WITH_SSE42)
  891. add_definitions(-DX86_PCLMULQDQ_CRC)
  892. set(PCLMULQDQ_SRCS ${ARCHDIR}/crc32_pclmulqdq.c)
  893. add_feature_info(PCLMUL_CRC 1 "Support CRC hash generation using PCLMULQDQ, using \"${SSE42FLAG} ${PCLMULFLAG}\"")
  894. list(APPEND ZLIB_ARCH_SRCS ${PCLMULQDQ_SRCS})
  895. set_property(SOURCE ${PCLMULQDQ_SRCS} PROPERTY COMPILE_FLAGS "${SSE42FLAG} ${PCLMULFLAG} ${NOLTOFLAG}")
  896. else()
  897. set(WITH_PCLMULQDQ OFF)
  898. endif()
  899. endif()
  900. if(WITH_AVX2)
  901. check_avx2_intrinsics()
  902. if(HAVE_AVX2_INTRIN AND WITH_SSE42)
  903. add_definitions(-DX86_AVX2)
  904. set(AVX2_SRCS ${ARCHDIR}/slide_hash_avx2.c)
  905. add_feature_info(AVX2_SLIDEHASH 1 "Support AVX2 optimized slide_hash, using \"${AVX2FLAG}\"")
  906. list(APPEND AVX2_SRCS ${ARCHDIR}/chunkset_avx2.c)
  907. add_feature_info(AVX2_CHUNKSET 1 "Support AVX2 optimized chunkset, using \"${AVX2FLAG}\"")
  908. list(APPEND AVX2_SRCS ${ARCHDIR}/compare256_avx2.c)
  909. add_feature_info(AVX2_COMPARE256 1 "Support AVX2 optimized compare256, using \"${AVX2FLAG}\"")
  910. list(APPEND AVX2_SRCS ${ARCHDIR}/adler32_avx2.c)
  911. add_feature_info(AVX2_ADLER32 1 "Support AVX2-accelerated adler32, using \"${AVX2FLAG}\"")
  912. list(APPEND ZLIB_ARCH_SRCS ${AVX2_SRCS})
  913. set_property(SOURCE ${AVX2_SRCS} PROPERTY COMPILE_FLAGS "${AVX2FLAG} ${NOLTOFLAG}")
  914. else()
  915. set(WITH_AVX2 OFF)
  916. endif()
  917. endif()
  918. if(WITH_AVX512)
  919. check_avx512_intrinsics()
  920. if(HAVE_AVX512_INTRIN AND WITH_AVX2)
  921. add_definitions(-DX86_AVX512)
  922. list(APPEND AVX512_SRCS ${ARCHDIR}/adler32_avx512.c)
  923. add_feature_info(AVX512_ADLER32 1 "Support AVX512-accelerated adler32, using \"${AVX512FLAG}\"")
  924. list(APPEND ZLIB_ARCH_SRCS ${AVX512_SRCS})
  925. list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/adler32_avx512_p.h)
  926. set_property(SOURCE ${AVX512_SRCS} PROPERTY COMPILE_FLAGS "${AVX512FLAG} ${NOLTOFLAG}")
  927. else()
  928. set(WITH_AVX512 OFF)
  929. endif()
  930. endif()
  931. if(WITH_AVX512VNNI)
  932. check_avx512vnni_intrinsics()
  933. if(HAVE_AVX512VNNI_INTRIN AND WITH_AVX2)
  934. add_definitions(-DX86_AVX512VNNI)
  935. add_feature_info(AVX512VNNI_ADLER32 1 "Support AVX512VNNI adler32, using \"${AVX512VNNIFLAG}\"")
  936. list(APPEND AVX512VNNI_SRCS ${ARCHDIR}/adler32_avx512_vnni.c)
  937. list(APPEND ZLIB_ARCH_SRCS ${AVX512VNNI_SRCS})
  938. set_property(SOURCE ${AVX512VNNI_SRCS} PROPERTY COMPILE_FLAGS "${AVX512VNNIFLAG} ${NOLTOFLAG}")
  939. else()
  940. set(WITH_AVX512VNNI OFF)
  941. endif()
  942. endif()
  943. if(WITH_VPCLMULQDQ)
  944. check_vpclmulqdq_intrinsics()
  945. if(HAVE_VPCLMULQDQ_INTRIN AND WITH_PCLMULQDQ AND WITH_AVX512)
  946. add_definitions(-DX86_VPCLMULQDQ_CRC)
  947. set(VPCLMULQDQ_SRCS ${ARCHDIR}/crc32_vpclmulqdq.c)
  948. add_feature_info(VPCLMUL_CRC 1 "Support CRC hash generation using VPCLMULQDQ, using \"${PCLMULFLAG} ${VPCLMULFLAG} ${AVX512FLAG}\"")
  949. list(APPEND ZLIB_ARCH_SRCS ${VPCLMULQDQ_SRCS})
  950. set_property(SOURCE ${VPCLMULQDQ_SRCS} PROPERTY COMPILE_FLAGS "${PCLMULFLAG} ${VPCLMULFLAG} ${AVX512FLAG} ${NOLTOFLAG}")
  951. else()
  952. set(WITH_VPCLMULQDQ OFF)
  953. endif()
  954. endif()
  955. endif()
  956. endif()
  957. message(STATUS "Architecture-specific source files: ${ZLIB_ARCH_SRCS}")
  958. #============================================================================
  959. # zconf.h
  960. #============================================================================
  961. macro(generate_cmakein input output)
  962. file(REMOVE ${output})
  963. file(STRINGS ${input} _lines)
  964. foreach(_line IN LISTS _lines)
  965. string(REGEX REPLACE "#ifdef HAVE_UNISTD_H.*" "@ZCONF_UNISTD_LINE@" _line "${_line}")
  966. string(REGEX REPLACE "#ifdef NEED_PTRDIFF_T.*" "@ZCONF_PTRDIFF_LINE@" _line "${_line}")
  967. if(NEED_PTRDIFF_T)
  968. string(REGEX REPLACE "typedef PTRDIFF_TYPE" "typedef @PTRDIFF_TYPE@" _line "${_line}")
  969. endif()
  970. file(APPEND ${output} "${_line}\n")
  971. endforeach()
  972. endmacro(generate_cmakein)
  973. generate_cmakein( ${CMAKE_CURRENT_SOURCE_DIR}/zconf${SUFFIX}.h.in ${CMAKE_CURRENT_BINARY_DIR}/zconf${SUFFIX}.h.cmakein )
  974. if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
  975. # If we're doing an out of source build and the user has a zconf.h
  976. # in their source tree...
  977. if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/zconf${SUFFIX}.h)
  978. message(STATUS "Renaming")
  979. message(STATUS " ${CMAKE_CURRENT_SOURCE_DIR}/zconf${SUFFIX}.h")
  980. message(STATUS "to 'zconf${SUFFIX}.h.included' because this file is included with zlib")
  981. message(STATUS "but CMake generates it automatically in the build directory.")
  982. file(RENAME ${CMAKE_CURRENT_SOURCE_DIR}/zconf${SUFFIX}.h ${CMAKE_CURRENT_SOURCE_DIR}/zconf${SUFFIX}.h.included)
  983. endif()
  984. # If we're doing an out of source build and the user has a zconf.h.cmakein
  985. # in their source tree...
  986. if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/zconf${SUFFIX}.h.cmakein)
  987. message(STATUS "Renaming")
  988. message(STATUS " ${CMAKE_CURRENT_SOURCE_DIR}/zconf${SUFFIX}.h.cmakein")
  989. message(STATUS "to 'zconf${SUFFIX}.h.cmakeincluded' because this file is included with zlib")
  990. message(STATUS "but CMake generates it automatically in the build directory.")
  991. file(RENAME ${CMAKE_CURRENT_SOURCE_DIR}/zconf${SUFFIX}.h.cmakein ${CMAKE_CURRENT_SOURCE_DIR}/zconf${SUFFIX}.h.cmakeincluded)
  992. endif()
  993. endif()
  994. # The user is allowed (but discouraged) to set absolute CMAKE_INSTALL_*DIR paths.
  995. # If they do, we copy these non-relocatable paths into the pkg-config file.
  996. if(IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}")
  997. set(PC_INC_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}")
  998. else()
  999. set(PC_INC_INSTALL_DIR "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
  1000. endif()
  1001. if(IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}")
  1002. set(PC_LIB_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}")
  1003. else()
  1004. set(PC_LIB_INSTALL_DIR "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
  1005. endif()
  1006. #============================================================================
  1007. # zlib
  1008. #============================================================================
  1009. set(ZLIB_PUBLIC_HDRS
  1010. ${CMAKE_CURRENT_BINARY_DIR}/zconf${SUFFIX}.h
  1011. ${CMAKE_CURRENT_BINARY_DIR}/zlib_name_mangling${SUFFIX}.h
  1012. ${CMAKE_CURRENT_BINARY_DIR}/zlib${SUFFIX}.h
  1013. )
  1014. set(ZLIB_PRIVATE_HDRS
  1015. adler32_p.h
  1016. chunkset_tpl.h
  1017. compare256_rle.h
  1018. arch_functions.h
  1019. crc32_braid_p.h
  1020. crc32_braid_comb_p.h
  1021. crc32_braid_tbl.h
  1022. deflate.h
  1023. deflate_p.h
  1024. functable.h
  1025. inffast_tpl.h
  1026. inffixed_tbl.h
  1027. inflate.h
  1028. inflate_p.h
  1029. inftrees.h
  1030. insert_string_tpl.h
  1031. match_tpl.h
  1032. trees.h
  1033. trees_emit.h
  1034. trees_tbl.h
  1035. zbuild.h
  1036. zendian.h
  1037. zutil.h
  1038. )
  1039. set(ZLIB_SRCS
  1040. arch/generic/adler32_c.c
  1041. arch/generic/adler32_fold_c.c
  1042. arch/generic/chunkset_c.c
  1043. arch/generic/compare256_c.c
  1044. arch/generic/crc32_braid_c.c
  1045. arch/generic/crc32_fold_c.c
  1046. arch/generic/slide_hash_c.c
  1047. adler32.c
  1048. compress.c
  1049. crc32.c
  1050. crc32_braid_comb.c
  1051. deflate.c
  1052. deflate_fast.c
  1053. deflate_huff.c
  1054. deflate_medium.c
  1055. deflate_quick.c
  1056. deflate_rle.c
  1057. deflate_slow.c
  1058. deflate_stored.c
  1059. functable.c
  1060. infback.c
  1061. inflate.c
  1062. inftrees.c
  1063. insert_string.c
  1064. insert_string_roll.c
  1065. trees.c
  1066. uncompr.c
  1067. zutil.c
  1068. )
  1069. if(WITH_RUNTIME_CPU_DETECTION)
  1070. list(APPEND ZLIB_PRIVATE_HDRS cpu_features.h)
  1071. list(APPEND ZLIB_SRCS cpu_features.c)
  1072. endif()
  1073. set(ZLIB_GZFILE_PRIVATE_HDRS
  1074. gzguts.h
  1075. )
  1076. set(ZLIB_GZFILE_SRCS
  1077. gzlib.c
  1078. ${CMAKE_CURRENT_BINARY_DIR}/gzread.c
  1079. gzwrite.c
  1080. )
  1081. set(ZLIB_ALL_SRCS ${ZLIB_SRCS} ${ZLIB_ARCH_HDRS} ${ZLIB_ARCH_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
  1082. if(WITH_GZFILEOP)
  1083. list(APPEND ZLIB_ALL_SRCS ${ZLIB_GZFILE_PRIVATE_HDRS} ${ZLIB_GZFILE_SRCS})
  1084. endif()
  1085. if(NOT DEFINED ZLIB_BUILD_SHARED_LIBS OR ZLIB_BUILD_SHARED_LIBS)
  1086. set(ZLIB_DLL_SRCS win32/zlib${SUFFIX}1.rc)
  1087. endif()
  1088. if(NOT DEFINED ZLIB_BUILD_SHARED_LIBS)
  1089. add_library(zlib SHARED ${ZLIB_ALL_SRCS} ${ZLIB_DLL_SRCS})
  1090. add_library(zlibstatic STATIC ${ZLIB_ALL_SRCS})
  1091. set(ZLIB_INSTALL_LIBRARIES zlib zlibstatic)
  1092. else()
  1093. if(ZLIB_BUILD_SHARED_LIBS)
  1094. add_library(zlib SHARED ${ZLIB_ALL_SRCS} ${ZLIB_DLL_SRCS})
  1095. target_sources(zlib PRIVATE ${ZLIB_DLL_SRCS})
  1096. else()
  1097. add_library(zlib STATIC ${ZLIB_ALL_SRCS})
  1098. add_library(zlibstatic ALIAS zlib)
  1099. endif()
  1100. set(ZLIB_INSTALL_LIBRARIES zlib)
  1101. endif()
  1102. # INFO: Mimics official zlib CMake target
  1103. # Generates ZLIB.cmake in case ZLIB_COMPAT=ON and always exports the CMake target ZLIB::ZLIB
  1104. # In case ZLIB_COMPAT=OFF, the CMake target and file follows zlib-ng naming convention
  1105. if (ZLIB_COMPAT)
  1106. if (TARGET zlib)
  1107. set_target_properties(zlib PROPERTIES EXPORT_NAME ZLIB)
  1108. else()
  1109. set_target_properties(zlibstatic PROPERTIES EXPORT_NAME ZLIB)
  1110. endif()
  1111. endif()
  1112. include_directories(${CMAKE_CURRENT_SOURCE_DIR})
  1113. include_directories(${ARCHDIR})
  1114. include_directories(${CMAKE_CURRENT_SOURCE_DIR}/arch/generic)
  1115. foreach(ZLIB_INSTALL_LIBRARY ${ZLIB_INSTALL_LIBRARIES})
  1116. if(NOT ZLIB_COMPAT)
  1117. target_compile_definitions(${ZLIB_INSTALL_LIBRARY} PUBLIC ZLIBNG_NATIVE_API)
  1118. endif()
  1119. target_include_directories(${ZLIB_INSTALL_LIBRARY} PUBLIC
  1120. "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}$<SEMICOLON>${CMAKE_CURRENT_SOURCE_DIR}>"
  1121. "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
  1122. endforeach()
  1123. if(WIN32)
  1124. # Shared library
  1125. if(NOT DEFINED ZLIB_BUILD_SHARED_LIBS OR ZLIB_BUILD_SHARED_LIBS)
  1126. set_target_properties(zlib PROPERTIES OUTPUT_NAME zlib${SUFFIX})
  1127. endif()
  1128. # Static library
  1129. if(NOT DEFINED ZLIB_BUILD_SHARED_LIBS)
  1130. if(MSVC)
  1131. set_target_properties(zlibstatic PROPERTIES OUTPUT_NAME zlibstatic${SUFFIX})
  1132. else()
  1133. set_target_properties(zlibstatic PROPERTIES OUTPUT_NAME z${SUFFIX})
  1134. endif()
  1135. elseif(NOT ZLIB_BUILD_SHARED_LIBS)
  1136. if(MSVC)
  1137. set_target_properties(zlib PROPERTIES OUTPUT_NAME zlibstatic${SUFFIX})
  1138. else()
  1139. set_target_properties(zlib PROPERTIES OUTPUT_NAME z${SUFFIX})
  1140. endif()
  1141. endif()
  1142. else()
  1143. # On unix-like platforms the library is almost always called libz
  1144. set_target_properties(${ZLIB_INSTALL_LIBRARIES} PROPERTIES OUTPUT_NAME z${SUFFIX})
  1145. endif()
  1146. if(NOT DEFINED ZLIB_BUILD_SHARED_LIBS OR ZLIB_BUILD_SHARED_LIBS)
  1147. set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL)
  1148. if(ZLIB_COMPAT)
  1149. set_target_properties(zlib PROPERTIES SOVERSION 1)
  1150. else()
  1151. set_target_properties(zlib PROPERTIES SOVERSION 2)
  1152. endif()
  1153. if(NOT CYGWIN)
  1154. # This property causes shared libraries on Linux to have the full version
  1155. # encoded into their final filename. We disable this on Cygwin because
  1156. # it causes cygz-${ZLIB_FULL_VERSION}.dll to be created when cygz.dll
  1157. # seems to be the default.
  1158. #
  1159. # This has no effect with MSVC, on that platform the version info for
  1160. # the DLL comes from the resource file win32/zlib1.rc
  1161. set_target_properties(zlib PROPERTIES VERSION ${ZLIB_FULL_VERSION})
  1162. endif()
  1163. if(UNIX)
  1164. if(HAVE_NO_INTERPOSITION)
  1165. set_target_properties(zlib PROPERTIES COMPILE_FLAGS "-fno-semantic-interposition")
  1166. endif()
  1167. if(NOT APPLE AND NOT CMAKE_SYSTEM_NAME STREQUAL AIX)
  1168. if(NOT ZLIB_COMPAT)
  1169. add_definitions(-DHAVE_SYMVER)
  1170. endif()
  1171. set_target_properties(zlib PROPERTIES LINK_FLAGS
  1172. "-Wl,--version-script,\"${CMAKE_CURRENT_SOURCE_DIR}/zlib${SUFFIX}.map\"")
  1173. endif()
  1174. endif()
  1175. if(MSYS)
  1176. # Suppress version number from shared library name
  1177. set(CMAKE_SHARED_LIBRARY_NAME_WITH_VERSION 0)
  1178. elseif(WIN32)
  1179. # Creates zlib1.dll when building shared library version
  1180. if(ZLIB_COMPAT)
  1181. set_target_properties(zlib PROPERTIES SUFFIX "1.dll")
  1182. else()
  1183. set_target_properties(zlib PROPERTIES SUFFIX "2.dll")
  1184. endif()
  1185. endif()
  1186. endif()
  1187. if(HAVE_UNISTD_H)
  1188. SET(ZCONF_UNISTD_LINE "#if 1 /* was set to #if 1 by configure/cmake/etc */")
  1189. else()
  1190. SET(ZCONF_UNISTD_LINE "#if 0 /* was set to #if 0 by configure/cmake/etc */")
  1191. endif()
  1192. if(NEED_PTRDIFF_T)
  1193. SET(ZCONF_PTRDIFF_LINE "#if 1 /* was set to #if 1 by configure/cmake/etc */")
  1194. else()
  1195. SET(ZCONF_PTRDIFF_LINE "#ifdef NEED_PTRDIFF_T /* may be set to #if 1 by configure/cmake/etc */")
  1196. endif()
  1197. set(ZLIB_PC ${CMAKE_CURRENT_BINARY_DIR}/zlib${SUFFIX}.pc)
  1198. if(WITH_GZFILEOP)
  1199. set(PKG_CONFIG_CFLAGS "-DWITH_GZFILEOP")
  1200. endif()
  1201. configure_file(${CMAKE_CURRENT_BINARY_DIR}/zconf${SUFFIX}.h.cmakein
  1202. ${CMAKE_CURRENT_BINARY_DIR}/zconf${SUFFIX}.h @ONLY)
  1203. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/zlib${SUFFIX}.h.in
  1204. ${CMAKE_CURRENT_BINARY_DIR}/zlib${SUFFIX}.h @ONLY)
  1205. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/gzread.c.in
  1206. ${CMAKE_CURRENT_BINARY_DIR}/gzread.c @ONLY)
  1207. if (NOT ZLIB_SYMBOL_PREFIX STREQUAL "")
  1208. add_feature_info(ZLIB_SYMBOL_PREFIX ON "Publicly exported symbols have a custom prefix")
  1209. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/zlib_name_mangling${SUFFIX}.h.in
  1210. ${CMAKE_CURRENT_BINARY_DIR}/zlib_name_mangling${SUFFIX}.h @ONLY)
  1211. else()
  1212. add_feature_info(ZLIB_SYMBOL_PREFIX OFF "Publicly exported symbols DO NOT have a custom prefix")
  1213. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/zlib_name_mangling.h.empty
  1214. ${CMAKE_CURRENT_BINARY_DIR}/zlib_name_mangling${SUFFIX}.h COPYONLY)
  1215. endif()
  1216. # add_definitions(-DZLIB_SYMBOL_PREFIX=${ZLIB_SYMBOL_PREFIX}) # not needed
  1217. if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
  1218. install(TARGETS ${ZLIB_INSTALL_LIBRARIES}
  1219. EXPORT ${EXPORT_NAME}
  1220. RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
  1221. ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
  1222. LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}")
  1223. endif()
  1224. if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL)
  1225. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/zlib${SUFFIX}.h
  1226. DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" RENAME zlib${SUFFIX}.h)
  1227. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/zlib_name_mangling${SUFFIX}.h
  1228. DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" RENAME zlib_name_mangling${SUFFIX}.h)
  1229. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/zconf${SUFFIX}.h
  1230. DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" RENAME zconf${SUFFIX}.h)
  1231. endif()
  1232. if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL)
  1233. install(FILES ${ZLIB_PC} DESTINATION "${PKGCONFIG_INSTALL_DIR}")
  1234. install(EXPORT ${EXPORT_NAME}
  1235. DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${EXPORT_NAME}"
  1236. NAMESPACE ${EXPORT_NAME}::)
  1237. # Use GNU-style variable names
  1238. set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR})
  1239. set(LIB_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR})
  1240. if (ZLIB_COMPAT)
  1241. set(PACKAGE_CONFIGNAME zlib)
  1242. set(PACKAGE_VERSION ${ZLIB_HEADER_VERSION})
  1243. else()
  1244. set(PACKAGE_CONFIGNAME zlib-ng)
  1245. set(PACKAGE_VERSION ${ZLIBNG_HEADER_VERSION})
  1246. endif()
  1247. endif()
  1248. #============================================================================
  1249. # Example binaries
  1250. #============================================================================
  1251. if(ZLIB_ENABLE_TESTS)
  1252. enable_testing()
  1253. if(ZLIB_BUILD_SHARED_LIBS)
  1254. if(ZLIBNG_ENABLE_TESTS)
  1255. message(STATUS "Disabling zlib-ng tests because shared libraries are enabled")
  1256. set(ZLIBNG_ENABLE_TESTS OFF)
  1257. endif()
  1258. if(WITH_BENCHMARKS OR WITH_BENCHMARK_APPS)
  1259. message(STATUS "Disabling benchmarks because shared libraries are enabled")
  1260. set(WITH_BENCHMARKS OFF)
  1261. set(WITH_BENCHMARK_APPS OFF)
  1262. endif()
  1263. endif()
  1264. add_subdirectory(test)
  1265. endif()
  1266. add_feature_info(WITH_GZFILEOP WITH_GZFILEOP "Compile with support for gzFile related functions")
  1267. add_feature_info(ZLIB_COMPAT ZLIB_COMPAT "Compile with zlib compatible API")
  1268. add_feature_info(ZLIB_ENABLE_TESTS ZLIB_ENABLE_TESTS "Build test binaries")
  1269. add_feature_info(ZLIBNG_ENABLE_TESTS ZLIBNG_ENABLE_TESTS "Test zlib-ng specific API")
  1270. add_feature_info(WITH_SANITIZER WITH_SANITIZER "Enable sanitizer support")
  1271. add_feature_info(WITH_GTEST WITH_GTEST "Build gtest_zlib")
  1272. add_feature_info(WITH_FUZZERS WITH_FUZZERS "Build test/fuzz")
  1273. add_feature_info(WITH_BENCHMARKS WITH_BENCHMARKS "Build test/benchmarks")
  1274. add_feature_info(WITH_BENCHMARK_APPS WITH_BENCHMARK_APPS "Build application benchmarks")
  1275. add_feature_info(WITH_OPTIM WITH_OPTIM "Build with optimisation")
  1276. add_feature_info(WITH_NEW_STRATEGIES WITH_NEW_STRATEGIES "Use new strategies")
  1277. add_feature_info(WITH_NATIVE_INSTRUCTIONS WITH_NATIVE_INSTRUCTIONS
  1278. "Instruct the compiler to use the full instruction set on this host (gcc/clang -march=native)")
  1279. add_feature_info(WITH_RUNTIME_CPU_DETECTION WITH_RUNTIME_CPU_DETECTION "Build with runtime CPU detection")
  1280. add_feature_info(WITH_MAINTAINER_WARNINGS WITH_MAINTAINER_WARNINGS "Build with project maintainer warnings")
  1281. add_feature_info(WITH_CODE_COVERAGE WITH_CODE_COVERAGE "Enable code coverage reporting")
  1282. add_feature_info(WITH_INFLATE_STRICT WITH_INFLATE_STRICT "Build with strict inflate distance checking")
  1283. add_feature_info(WITH_INFLATE_ALLOW_INVALID_DIST WITH_INFLATE_ALLOW_INVALID_DIST "Build with zero fill for inflate invalid distances")
  1284. if(BASEARCH_ARM_FOUND)
  1285. add_feature_info(WITH_ACLE WITH_ACLE "Build with ACLE")
  1286. add_feature_info(WITH_NEON WITH_NEON "Build with NEON intrinsics")
  1287. add_feature_info(WITH_ARMV6 WITH_ARMV6 "Build with ARMv6 SIMD")
  1288. elseif(BASEARCH_PPC_FOUND)
  1289. add_feature_info(WITH_ALTIVEC WITH_ALTIVEC "Build with AltiVec optimisations")
  1290. add_feature_info(WITH_POWER8 WITH_POWER8 "Build with optimisations for POWER8")
  1291. add_feature_info(WITH_POWER9 WITH_POWER9 "Build with optimisations for POWER9")
  1292. elseif(BASEARCH_RISCV_FOUND)
  1293. add_feature_info(WITH_RVV WITH_RVV "Build with RVV intrinsics")
  1294. elseif(BASEARCH_S360_FOUND)
  1295. add_feature_info(WITH_DFLTCC_DEFLATE WITH_DFLTCC_DEFLATE "Build with DFLTCC intrinsics for compression on IBM Z")
  1296. add_feature_info(WITH_DFLTCC_INFLATE WITH_DFLTCC_INFLATE "Build with DFLTCC intrinsics for decompression on IBM Z")
  1297. add_feature_info(WITH_CRC32_VX WITH_CRC32_VX "Build with vectorized CRC32 on IBM Z")
  1298. elseif(BASEARCH_X86_FOUND)
  1299. add_feature_info(WITH_AVX2 WITH_AVX2 "Build with AVX2")
  1300. add_feature_info(WITH_AVX512 WITH_AVX512 "Build with AVX512")
  1301. add_feature_info(WITH_AVX512VNNI WITH_AVX512VNNI "Build with AVX512 VNNI")
  1302. add_feature_info(WITH_SSE2 WITH_SSE2 "Build with SSE2")
  1303. add_feature_info(WITH_SSSE3 WITH_SSSE3 "Build with SSSE3")
  1304. add_feature_info(WITH_SSE42 WITH_SSE42 "Build with SSE42")
  1305. add_feature_info(WITH_PCLMULQDQ WITH_PCLMULQDQ "Build with PCLMULQDQ")
  1306. add_feature_info(WITH_VPCLMULQDQ WITH_VPCLMULQDQ "Build with VPCLMULQDQ")
  1307. endif()
  1308. add_feature_info(INSTALL_UTILS INSTALL_UTILS "Copy minigzip and minideflate during install")
  1309. FEATURE_SUMMARY(WHAT ALL INCLUDE_QUIET_PACKAGES)
  1310. if(ENABLE_SOLUTION_FOLDERS)
  1311. set_target_properties(${ZLIB_INSTALL_LIBRARIES} PROPERTIES FOLDER "3rdparty")
  1312. endif()
  1313. if(NOT BUILD_SHARED_LIBS)
  1314. ocv_install_target(${ZLIB_INSTALL_LIBRARIES} EXPORT OpenCVModules ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT dev)
  1315. endif()
  1316. ocv_install_3rdparty_licenses(${ZLIB_INSTALL_LIBRARIES} LICENSE.md)