Change dependency from openssl1.1 to openssl3
[platform/upstream/libzip.git] / CMakeLists.txt
1 cmake_minimum_required(VERSION 3.0.2)
2
3 list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
4 if (${CMAKE_VERSION} VERSION_LESS "3.17.0")
5   list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake-compat)
6 endif()
7
8 project(libzip
9   VERSION 1.9.2
10   LANGUAGES C)
11
12 option(ENABLE_COMMONCRYPTO "Enable use of CommonCrypto" ON)
13 option(ENABLE_GNUTLS "Enable use of GnuTLS" ON)
14 option(ENABLE_MBEDTLS "Enable use of mbed TLS" ON)
15 option(ENABLE_OPENSSL "Enable use of OpenSSL" ON)
16 option(ENABLE_WINDOWS_CRYPTO "Enable use of Windows cryptography libraries" ON)
17
18 option(ENABLE_BZIP2 "Enable use of BZip2" ON)
19 option(ENABLE_LZMA "Enable use of LZMA" ON)
20 option(ENABLE_ZSTD "Enable use of Zstandard" ON)
21
22 option(BUILD_TOOLS "Build tools in the src directory (zipcmp, zipmerge, ziptool)" ON)
23 option(BUILD_REGRESS "Build regression tests" ON)
24 option(BUILD_EXAMPLES "Build examples" ON)
25 option(BUILD_DOC "Build documentation" ON)
26
27 include(CheckFunctionExists)
28 include(CheckIncludeFiles)
29 include(CheckLibraryExists)
30 include(CheckSymbolExists)
31 include(CheckTypeSize)
32 include(CheckCSourceRuns)
33 include(CheckCSourceCompiles)
34 include(CheckStructHasMember)
35 include(TestBigEndian)
36 include(GNUInstallDirs)
37
38 if(ENABLE_COMMONCRYPTO)
39   check_include_files(CommonCrypto/CommonCrypto.h COMMONCRYPTO_FOUND)
40 endif()
41 if(ENABLE_GNUTLS)
42   find_package(Nettle 3.0)
43   find_package(GnuTLS)
44 endif()
45 if(ENABLE_MBEDTLS)
46   find_package(MbedTLS 1.0)
47 endif()
48 if(ENABLE_OPENSSL)
49   find_package(OpenSSL)
50 endif()
51 if(WIN32)
52   if(ENABLE_WINDOWS_CRYPTO)
53     set(WINDOWS_CRYPTO_FOUND TRUE)
54   endif()
55 endif()
56
57 option(BUILD_SHARED_LIBS "Build shared libraries" ON)
58 option(LIBZIP_DO_INSTALL "Install libzip and the related files" ON)
59
60 option(SHARED_LIB_VERSIONNING "Add SO version in .so build" ON)
61
62 find_program(MDOCTOOL NAMES mandoc groff)
63 if (MDOCTOOL)
64   set(DOCUMENTATION_FORMAT "mdoc" CACHE STRING "Documentation format")
65 else()
66   find_program(MANTOOL NAMES nroff)
67   if (MANTOOL)
68     set(DOCUMENTATION_FORMAT "man" CACHE STRING "Documentation format")
69   else()
70     set(DOCUMENTATION_FORMAT "html" CACHE STRING "Documentation format")
71   endif()
72 endif()
73
74 include(Dist)
75 Dist(${CMAKE_PROJECT_NAME}-${CMAKE_PROJECT_VERSION})
76
77 #ADD_CUSTOM_TARGET(uninstall
78 #  COMMAND cat ${PROJECT_BINARY_DIR}/install_manifest.txt | xargs rm
79 #  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
80 #  )
81
82 if(BUILD_SHARED_LIBS)
83   set(HAVE_SHARED TRUE)
84 else()
85   set(ZIP_STATIC TRUE)
86 endif()
87
88 # Checks
89
90 check_function_exists(_close HAVE__CLOSE)
91 check_function_exists(_dup HAVE__DUP)
92 check_function_exists(_fdopen HAVE__FDOPEN)
93 check_function_exists(_fileno HAVE__FILENO)
94 check_function_exists(_setmode HAVE__SETMODE)
95 check_symbol_exists(_snprintf stdio.h HAVE__SNPRINTF)
96 check_function_exists(_strdup HAVE__STRDUP)
97 check_symbol_exists(_stricmp string.h HAVE__STRICMP)
98 check_function_exists(_strtoi64 HAVE__STRTOI64)
99 check_function_exists(_strtoui64 HAVE__STRTOUI64)
100 check_function_exists(_unlink HAVE__UNLINK)
101 check_function_exists(arc4random HAVE_ARC4RANDOM)
102 check_function_exists(clonefile HAVE_CLONEFILE)
103 check_function_exists(explicit_bzero HAVE_EXPLICIT_BZERO)
104 check_function_exists(explicit_memset HAVE_EXPLICIT_MEMSET)
105 check_function_exists(fchmod HAVE_FCHMOD)
106 check_function_exists(fileno HAVE_FILENO)
107 check_function_exists(fseeko HAVE_FSEEKO)
108 check_function_exists(ftello HAVE_FTELLO)
109 check_function_exists(getprogname HAVE_GETPROGNAME)
110 check_function_exists(localtime_r HAVE_LOCALTIME_R)
111 check_function_exists(setmode HAVE_SETMODE)
112 check_symbol_exists(snprintf stdio.h HAVE_SNPRINTF)
113 check_symbol_exists(strcasecmp strings.h HAVE_STRCASECMP)
114 check_function_exists(strdup HAVE_STRDUP)
115 check_function_exists(stricmp HAVE_STRICMP)
116 check_function_exists(strtoll HAVE_STRTOLL)
117 check_function_exists(strtoull HAVE_STRTOULL)
118
119 check_include_files("sys/types.h;sys/stat.h;fts.h" HAVE_FTS_H)
120 # fts functions may be in external library
121 if(HAVE_FTS_H)
122   check_function_exists(fts_open HAVE_FTS_OPEN)
123   if(NOT HAVE_FTS_OPEN)
124     check_library_exists(fts fts_open "" HAVE_LIB_FTS)
125   else(NOT HAVE_FTS_OPEN)
126     set(HAVE_LIB_FTS "" CACHE INTERNAL "")
127   endif(NOT HAVE_FTS_OPEN)
128 else(HAVE_FTS_H)
129   set(HAVE_LIB_FTS "" CACHE INTERNAL "")
130 endif(HAVE_FTS_H)
131
132 if(HAVE_LIB_FTS)
133   set(FTS_LIB fts CACHE INTERNAL "")
134 else()
135   set(FTS_LIB "" CACHE INTERNAL "")
136 endif()
137
138 check_include_files(stdbool.h HAVE_STDBOOL_H)
139 check_include_files(strings.h HAVE_STRINGS_H)
140 check_include_files(unistd.h HAVE_UNISTD_H)
141
142 check_include_files(inttypes.h HAVE_INTTYPES_H_LIBZIP)
143 check_include_files(stdint.h HAVE_STDINT_H_LIBZIP)
144 check_include_files(sys/types.h HAVE_SYS_TYPES_H_LIBZIP)
145
146 # TODO: fix test
147 # this test does not find __progname even when it exists
148 #check_symbol_exists(__progname stdlib.h HAVE___PROGNAME)
149
150 check_type_size(__int8 __INT8_LIBZIP)
151 check_type_size(int8_t INT8_T_LIBZIP)
152 check_type_size(uint8_t UINT8_T_LIBZIP)
153 check_type_size(__int16 __INT16_LIBZIP)
154 check_type_size(int16_t INT16_T_LIBZIP)
155 check_type_size(uint16_t UINT16_T_LIBZIP)
156 check_type_size(__int32 __INT32_LIBZIP)
157 check_type_size(int32_t INT32_T_LIBZIP)
158 check_type_size(uint32_t UINT32_T_LIBZIP)
159 check_type_size(__int64 __INT64_LIBZIP)
160 check_type_size(int64_t INT64_T_LIBZIP)
161 check_type_size(uint64_t UINT64_T_LIBZIP)
162 check_type_size("short" SHORT_LIBZIP)
163 check_type_size("int" INT_LIBZIP)
164 check_type_size("long" LONG_LIBZIP)
165 check_type_size("long long" LONG_LONG_LIBZIP)
166 check_type_size("off_t" SIZEOF_OFF_T)
167 check_type_size("size_t" SIZEOF_SIZE_T)
168
169 check_c_source_compiles("#include <sys/ioctl.h>
170 #include <linux/fs.h>
171 int main(int argc, char *argv[]) { unsigned long x = FICLONERANGE; }" HAVE_FICLONERANGE)
172
173 check_c_source_compiles("
174 int foo(char * _Nullable bar);
175 int main(int argc, char *argv[]) { }" HAVE_NULLABLE)
176
177 test_big_endian(WORDS_BIGENDIAN)
178
179 find_package(ZLIB 1.1.2 REQUIRED)
180
181 if(ENABLE_BZIP2)
182   find_package(BZip2)
183   if(BZIP2_FOUND)
184     set(HAVE_LIBBZ2 1)
185   else()
186     message(WARNING "-- bzip2 library not found; bzip2 support disabled")
187   endif(BZIP2_FOUND)
188 endif(ENABLE_BZIP2)
189
190 if(ENABLE_LZMA)
191   find_package(LibLZMA 5.2)
192   if(LIBLZMA_FOUND)
193     set(HAVE_LIBLZMA 1)
194   else()
195     message(WARNING "-- lzma library not found; lzma/xz support disabled")
196   endif(LIBLZMA_FOUND)
197 endif(ENABLE_LZMA)
198
199 if(ENABLE_ZSTD)
200   find_package(Zstd 1.3.6)
201   if(Zstd_FOUND)
202     set(HAVE_LIBZSTD 1)
203   else()
204     message(WARNING "-- zstd library not found; zstandard support disabled")
205   endif(Zstd_FOUND)
206 endif(ENABLE_ZSTD)
207
208 if (COMMONCRYPTO_FOUND)
209   set(HAVE_CRYPTO 1)
210   set(HAVE_COMMONCRYPTO 1)
211 elseif (WINDOWS_CRYPTO_FOUND)
212   set(HAVE_CRYPTO 1)
213   set(HAVE_WINDOWS_CRYPTO 1)
214 elseif (GNUTLS_FOUND AND NETTLE_FOUND)
215   set(HAVE_CRYPTO 1)
216   set(HAVE_GNUTLS 1)
217 elseif (OPENSSL_FOUND)
218   set(HAVE_CRYPTO 1)
219   set(HAVE_OPENSSL 1)
220 elseif (MBEDTLS_FOUND)
221   set(HAVE_CRYPTO 1)
222   set(HAVE_MBEDTLS 1)
223 endif()
224
225 if ((ENABLE_COMMONCRYPTO OR ENABLE_GNUTLS OR ENABLE_MBEDTLS OR ENABLE_OPENSSL OR ENABLE_WINDOWS_CRYPTO) AND NOT HAVE_CRYPTO)
226   message(WARNING "-- neither Common Crypto, GnuTLS, mbed TLS, OpenSSL, nor Windows Cryptography found; AES support disabled")
227 endif()
228
229 if(MSVC)
230   add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
231   add_compile_definitions(_CRT_NONSTDC_NO_DEPRECATE)
232 endif(MSVC)
233
234 if(WIN32)
235   if(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore)
236     add_compile_definitions(MS_UWP)
237   endif(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore)
238 endif(WIN32)
239
240 # rpath handling: use rpath in installed binaries
241 if(NOT CMAKE_SYSTEM_NAME MATCHES Linux)
242   set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
243   set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
244 endif()
245
246 # for code completion frameworks
247 set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
248
249 # Testing
250 ENABLE_TESTING()
251
252 # Targets
253 ADD_SUBDIRECTORY(lib)
254
255 if(BUILD_DOC)
256   ADD_SUBDIRECTORY(man)
257 endif()
258
259 if(BUILD_TOOLS)
260   ADD_SUBDIRECTORY(src)
261 else(BUILD_TOOLS)
262   if(BUILD_REGRESS)
263     message(WARNING "-- tools build has been disabled, but they are needed for regression tests; regression testing disabled")
264     set(BUILD_REGRESS OFF)
265   endif(BUILD_REGRESS)
266 endif()
267
268 include(FindPerl)
269
270 if(BUILD_REGRESS AND NOT PERL_FOUND)
271   message(WARNING "-- perl not found, regression testing disabled")
272   set(BUILD_REGRESS OFF)
273 endif()
274
275 if(BUILD_REGRESS)
276   add_subdirectory(regress)
277 endif()
278
279 if(BUILD_EXAMPLES)
280   add_subdirectory(examples)
281 endif()
282
283
284 # pkgconfig file
285 file(RELATIVE_PATH pc_relative_bindir ${CMAKE_INSTALL_PREFIX} ${CMAKE_INSTALL_FULL_BINDIR})
286 set(bindir "\${prefix}/${pc_relative_bindir}")
287 file(RELATIVE_PATH pc_relative_libdir ${CMAKE_INSTALL_PREFIX} ${CMAKE_INSTALL_FULL_LIBDIR})
288 set(libdir "\${prefix}/${pc_relative_libdir}")
289 file(RELATIVE_PATH pc_relative_includedir ${CMAKE_INSTALL_PREFIX} ${CMAKE_INSTALL_FULL_INCLUDEDIR})
290 set(includedir "\${prefix}/${pc_relative_includedir}")
291 if(CMAKE_SYSTEM_NAME MATCHES BSD)
292   set(PKG_CONFIG_RPATH "-Wl,-R\${libdir}")
293 endif(CMAKE_SYSTEM_NAME MATCHES BSD)
294 get_target_property(LIBS_PRIVATE zip LINK_LIBRARIES)
295 foreach(LIB ${LIBS_PRIVATE})
296   if(LIB MATCHES "^/")
297     get_filename_component(LIB ${LIB} NAME_WE)
298     string(REGEX REPLACE "^lib" "" LIB ${LIB})
299   endif()
300   set(LIBS "${LIBS} -l${LIB}")
301 endforeach()
302 string(REGEX REPLACE "-lBZip2::BZip2" "-lbz2" LIBS ${LIBS})
303 string(REGEX REPLACE "-lLibLZMA::LibLZMA" "-llzma" LIBS ${LIBS})
304 string(REGEX REPLACE "-lZstd::Zstd" "-lzstd" LIBS ${LIBS})
305 string(REGEX REPLACE "-lOpenSSL::Crypto" "-lssl -lcrypto" LIBS ${LIBS})
306 string(REGEX REPLACE "-lZLIB::ZLIB" "-lz" LIBS ${LIBS})
307 string(REGEX REPLACE "-lGnuTLS::GnuTLS" "-lgnutls" LIBS ${LIBS})
308 string(REGEX REPLACE "-lNettle::Nettle" "-lnettle" LIBS ${LIBS})
309 configure_file(libzip.pc.in libzip.pc @ONLY)
310 if(LIBZIP_DO_INSTALL)
311   install(FILES ${PROJECT_BINARY_DIR}/libzip.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
312 endif()
313
314 # fixed size integral types
315
316 if(HAVE_INTTYPES_H_LIBZIP)
317   set(LIBZIP_TYPES_INCLUDE "#if !defined(__STDC_FORMAT_MACROS)
318 #define __STDC_FORMAT_MACROS 1
319 #endif
320 #include <inttypes.h>")
321 elseif(HAVE_STDINT_H_LIBZIP)
322   set(LIBZIP_TYPES_INCLUDE "#include <stdint.h>")
323 elseif(HAVE_SYS_TYPES_H_LIBZIP)
324   set(LIBZIP_TYPES_INCLUDE "#include <sys/types.h>")
325 endif()
326
327 if(HAVE_INT8_T_LIBZIP)
328   set(ZIP_INT8_T int8_t)
329 elseif(HAVE___INT8_LIBZIP)
330   set(ZIP_INT8_T __int8)
331 else()
332   set(ZIP_INT8_T "signed char")
333 endif()
334
335 if(HAVE_UINT8_T_LIBZIP)
336   set(ZIP_UINT8_T uint8_t)
337 elseif(HAVE___INT8_LIBZIP)
338   set(ZIP_UINT8_T "unsigned __int8")
339 else()
340   set(ZIP_UINT8_T "unsigned char")
341 endif()
342
343 if(HAVE_INT16_T_LIBZIP)
344   set(ZIP_INT16_T int16_t)
345 elseif(HAVE___INT16_LIBZIP)
346   set(INT16_T_LIBZIP __int16)
347 elseif(SHORT_LIBZIP EQUAL 2)
348   set(INT16_T_LIBZIP short)
349 endif()
350
351 if(HAVE_UINT16_T_LIBZIP)
352   set(ZIP_UINT16_T uint16_t)
353 elseif(HAVE___INT16_LIBZIP)
354   set(UINT16_T_LIBZIP "unsigned __int16")
355 elseif(SHORT_LIBZIP EQUAL 2)
356   set(UINT16_T_LIBZIP "unsigned short")
357 endif()
358
359 if(HAVE_INT32_T_LIBZIP)
360   set(ZIP_INT32_T int32_t)
361 elseif(HAVE___INT32_LIBZIP)
362   set(ZIP_INT32_T __int32)
363 elseif(INT_LIBZIP EQUAL 4)
364   set(ZIP_INT32_T int)
365 elseif(LONG_LIBZIP EQUAL 4)
366   set(ZIP_INT32_T long)
367 endif()
368
369 if(HAVE_UINT32_T_LIBZIP)
370   set(ZIP_UINT32_T uint32_t)
371 elseif(HAVE___INT32_LIBZIP)
372   set(ZIP_UINT32_T "unsigned __int32")
373 elseif(INT_LIBZIP EQUAL 4)
374   set(ZIP_UINT32_T "unsigned int")
375 elseif(LONG_LIBZIP EQUAL 4)
376   set(ZIP_UINT32_T "unsigned long")
377 endif()
378
379 if(HAVE_INT64_T_LIBZIP)
380   set(ZIP_INT64_T int64_t)
381 elseif(HAVE___INT64_LIBZIP)
382   set(ZIP_INT64_T __int64)
383 elseif(LONG_LIBZIP EQUAL 8)
384   set(ZIP_INT64_T long)
385 elseif(LONG_LONG_LIBZIP EQUAL 8)
386   set(ZIP_INT64_T "long long")
387 endif()
388
389 if(HAVE_UINT64_T_LIBZIP)
390   set(ZIP_UINT64_T uint64_t)
391 elseif(HAVE___INT64_LIBZIP)
392   set(ZIP_UINT64_T "unsigned __int64")
393 elseif(LONG_LIBZIP EQUAL 8)
394   set(ZIP_UINT64_T "unsigned long")
395 elseif(LONG_LONG_LIBZIP EQUAL 8)
396   set(ZIP_UINT64_T "unsigned long long")
397 endif()
398
399 if(HAVE_NULLABLE)
400   set(ZIP_NULLABLE_DEFINES)
401 else()
402   set(ZIP_NULLABLE_DEFINES "#define _Nullable
403 #define _Nonnull")
404 endif()
405
406 # write out config file
407 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake-config.h.in ${PROJECT_BINARY_DIR}/config.h)
408 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake-zipconf.h.in ${PROJECT_BINARY_DIR}/zipconf.h)
409
410 # for tests
411
412 set(srcdir ${CMAKE_CURRENT_SOURCE_DIR}/regress)
413 set(abs_srcdir ${CMAKE_CURRENT_SOURCE_DIR}/regress)
414 set(top_builddir ${PROJECT_BINARY_DIR}) # used to find config.h
415
416 configure_file(regress/nihtest.conf.in ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/nihtest.conf @ONLY)
417 file(COPY ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/nihtest.conf
418   DESTINATION ${PROJECT_BINARY_DIR}/regress
419   FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
420
421 configure_file(regress/runtest.in ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/runtest @ONLY)
422 file(COPY ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/runtest
423   DESTINATION ${PROJECT_BINARY_DIR}/regress
424   FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
425   )
426
427 # create package config file
428 include(CMakePackageConfigHelpers)
429 write_basic_package_version_file("${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake"
430   COMPATIBILITY AnyNewerVersion)
431
432 configure_package_config_file("${PROJECT_NAME}-config.cmake.in" "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake"
433   INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libzip)
434
435 if(LIBZIP_DO_INSTALL)
436   # Add targets to the build-tree export set
437   export(TARGETS zip
438     FILE "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-targets.cmake")
439
440   # installation
441   install(FILES ${PROJECT_BINARY_DIR}/zipconf.h DESTINATION include)
442   install(FILES ${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake ${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake
443     DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
444     )
445   install(EXPORT ${PROJECT_NAME}-targets NAMESPACE libzip:: FILE ${PROJECT_NAME}-targets.cmake
446     DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
447     )
448 endif()