Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Kitware
GitHub Repository: Kitware/CMake
Path: blob/master/Utilities/cmlibarchive/CMakeLists.txt
5040 views
1
#
2
IF(0) # CMake handles policy settings in its own build.
3
cmake_minimum_required(VERSION 3.17 FATAL_ERROR)
4
ENDIF()
5
6
PROJECT(libarchive C)
7
#
8
if(0) # XXX(cmake): not needed for build within cmake
9
# Include standard installation directories
10
include(GNUInstallDirs)
11
endif() # XXX(cmake): end
12
#
13
SET(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/build/cmake")
14
if(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
15
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${libarchive_BINARY_DIR}/bin)
16
endif()
17
IF(0) # CMake handles build type selection in its own build.
18
#
19
# Set the Build type for make based generators.
20
# You can choose following types:
21
# Debug : Debug build
22
# Release : Release build
23
# RelWithDebInfo : Release build with Debug Info
24
# MinSizeRel : Release Min Size build
25
# None : No build type
26
IF(NOT CMAKE_BUILD_TYPE)
27
SET(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build Type" FORCE)
28
ENDIF(NOT CMAKE_BUILD_TYPE)
29
# Set a value type to properly display CMAKE_BUILD_TYPE on GUI if the
30
# value type is "UNINITIALIZED".
31
GET_PROPERTY(cached_type CACHE CMAKE_BUILD_TYPE PROPERTY TYPE)
32
IF("${cached_type}" STREQUAL "UNINITIALIZED")
33
SET(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING "Build Type" FORCE)
34
ENDIF("${cached_type}" STREQUAL "UNINITIALIZED")
35
# Check the Build Type.
36
# Convert the CMAKE_BUILD_TYPE to uppercase to perform a case-insensitive comparison.
37
string(TOUPPER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_UPPER)
38
IF(NOT "${CMAKE_BUILD_TYPE_UPPER}"
39
MATCHES "^(DEBUG|RELEASE|RELWITHDEBINFO|MINSIZEREL|NONE)\$")
40
MESSAGE(FATAL_ERROR
41
"Unknown keyword for CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}\n"
42
"Acceptable keywords: Debug, Release, RelWithDebInfo, MinSizeRel, None")
43
ENDIF(NOT "${CMAKE_BUILD_TYPE_UPPER}"
44
MATCHES "^(DEBUG|RELEASE|RELWITHDEBINFO|MINSIZEREL|NONE)\$")
45
ENDIF()
46
47
# On MacOS, prefer MacPorts libraries to system libraries.
48
# I haven't come up with a compelling argument for this to be conditional.
49
list(APPEND CMAKE_PREFIX_PATH /opt/local)
50
# Enable @rpath in the install name.
51
# detail in "cmake --help-policy CMP0042"
52
SET(CMAKE_MACOSX_RPATH ON)
53
54
#
55
# Version - read from 'version' file.
56
#
57
FILE(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/build/version _version)
58
STRING(REGEX REPLACE
59
"^([0-9])[0-9][0-9][0-9][0-9][0-9][0-9][a-z]*$" "\\1" _major ${_version})
60
STRING(REGEX REPLACE
61
"^[0-9]([0-9][0-9][0-9])[0-9][0-9][0-9][a-z]*$" "\\1" _minor ${_version})
62
STRING(REGEX REPLACE
63
"^[0-9][0-9][0-9][0-9]([0-9][0-9][0-9])[a-z]*$" "\\1" _revision ${_version})
64
STRING(REGEX REPLACE
65
"^[0-9][0-9][0-9][0-9][0-9][0-9][0-9]([a-z]*)$" "\\1" _quality ${_version})
66
SET(_version_number ${_major}${_minor}${_revision})
67
STRING(REGEX REPLACE "[0]*([^0]*[0-9])$" "\\1" _trimmed_minor ${_minor})
68
STRING(REGEX REPLACE "[0]*([^0]*[0-9])$" "\\1" _trimmed_revision ${_revision})
69
#
70
SET(VERSION "${_major}.${_trimmed_minor}.${_trimmed_revision}${_quality}")
71
SET(BSDCPIO_VERSION_STRING "${VERSION}")
72
SET(BSDTAR_VERSION_STRING "${VERSION}")
73
SET(BSDCAT_VERSION_STRING "${VERSION}")
74
SET(BSDUNZIP_VERSION_STRING "${VERSION}")
75
SET(LIBARCHIVE_VERSION_NUMBER "${_version_number}")
76
SET(LIBARCHIVE_VERSION_STRING "${VERSION}")
77
78
# INTERFACE_VERSION increments with every release
79
# libarchive 2.7 == interface version 9 = 2 + 7
80
# libarchive 2.8 == interface version 10 = 2 + 8
81
# libarchive 2.9 == interface version 11 = 2 + 9
82
# libarchive 3.0 == interface version 12
83
# libarchive 3.1 == interface version 13
84
math(EXPR INTERFACE_VERSION "13 + ${_minor}")
85
86
# Set SOVERSION so it matches libtool's conventions
87
# libtool accepts a string "current:revision:age"; in libarchive, that's set to
88
# - current: ${INTERFACE_VERSION} = 13 + ${_minor}
89
# - revision: ${_revision}
90
# - age: ${_minor}
91
# Since libtool computes SOVERSION as "current - age", it's just '13' again
92
math(EXPR SOVERSION "${INTERFACE_VERSION} - ${_minor}")
93
set(SOVERSION_FULL "${SOVERSION}.${_trimmed_minor}.${_trimmed_revision}")
94
95
# Override CMake's default shared library versioning scheme, which uses SOVERSION and VERSION,
96
# to match libtool's conventions (see https://github.com/mesonbuild/meson/issues/1451)
97
# - compatibility version: current + 1 = ${INTERFACE_VERSION} + 1
98
# - current version: ${current + 1}.${revision}
99
math(EXPR MACHO_COMPATIBILITY_VERSION "${INTERFACE_VERSION} + 1")
100
set(MACHO_CURRENT_VERSION "${MACHO_COMPATIBILITY_VERSION}.${_revision}")
101
102
# Enable CMAKE_PUSH_CHECK_STATE() and CMAKE_POP_CHECK_STATE() macros
103
# saving and restoring the state of the variables.
104
INCLUDE(${CMake_SOURCE_DIR}/Modules/CMakePushCheckState.cmake)
105
106
if(0) # XXX(cmake): do not let pkg-config override our search paths
107
# Enable the pkg-config helpers.
108
INCLUDE(FindPkgConfig)
109
endif() # XXX(cmake): end
110
111
# Initialize the state of the variables. This initialization is not
112
# necessary but this shows you what value the variables initially have.
113
SET(CMAKE_REQUIRED_DEFINITIONS)
114
SET(CMAKE_REQUIRED_INCLUDES)
115
SET(CMAKE_REQUIRED_LIBRARIES)
116
SET(CMAKE_REQUIRED_FLAGS)
117
118
# Disable warnings to avoid changing 3rd party code.
119
IF(CMAKE_C_COMPILER_ID MATCHES
120
"^(GNU|LCC|Clang|AppleClang|IBMClang|XLClang|XL|VisualAge|SunPro|HP|Intel|IntelLLVM|NVHPC)$")
121
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w")
122
ELSEIF(CMAKE_C_COMPILER_ID STREQUAL "PathScale")
123
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -woffall")
124
ENDIF()
125
126
# Activate POSIX APIs.
127
if(CMAKE_SYSTEM_NAME MATCHES "^(Linux)$")
128
add_definitions(-D_DEFAULT_SOURCE -D_BSD_SOURCE)
129
string(APPEND CMAKE_REQUIRED_DEFINITIONS " -D_DEFAULT_SOURCE -D_BSD_SOURCE")
130
endif()
131
if(NOT CMAKE_SYSTEM_NAME MATCHES "BSD|Darwin|Windows")
132
add_definitions(-D_XOPEN_SOURCE=600)
133
string(APPEND CMAKE_REQUIRED_DEFINITIONS " -D_XOPEN_SOURCE=600")
134
endif()
135
136
IF(0) # CMake does not need flags specific to libarchive upstream development.
137
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
138
OPTION(ENABLE_WERROR "Treat warnings as errors - default is ON for Debug, OFF otherwise." ON)
139
else ()
140
OPTION(ENABLE_WERROR "Treat warnings as errors - default is ON for Debug, OFF otherwise." OFF)
141
endif ()
142
143
# Especially for early development, we want to be a little
144
# aggressive about diagnosing build problems; this can get
145
# relaxed somewhat in final shipping versions.
146
IF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR
147
CMAKE_C_COMPILER_ID MATCHES "^Clang$" AND NOT MSVC)
148
SET(CMAKE_REQUIRED_FLAGS "-Wall -Wformat -Wformat-security")
149
#################################################################
150
# Set compile flags for all build types.
151
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wformat -Wformat-security")
152
if (ENABLE_WERROR)
153
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
154
endif ()
155
#################################################################
156
# Set compile flags for debug build.
157
# This is added into CMAKE_C_FLAGS when CMAKE_BUILD_TYPE is "Debug"
158
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g")
159
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wextra")
160
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wunused")
161
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wshadow")
162
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wmissing-prototypes")
163
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wcast-qual")
164
# Ideally this will be a compile/link time check, yet there's no obvious way
165
# how considering how old our minimum required cmake version is. The official
166
# cmake.org side does not host the manual pages even. Normally we can use
167
# either of the following two, yet neither is supported as of 3.0.2
168
# - check_linker_flag - does not exist
169
# - try_compile - does not support linker flags
170
IF(CMAKE_SYSTEM_NAME MATCHES "Darwin")
171
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-dead_strip")
172
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-dead_strip")
173
ELSEIF(CMAKE_SYSTEM_NAME MATCHES "SunOS")
174
# SunOS linker doesn't support --gc-sections
175
ELSE()
176
# Place the functions and data into separate sections, allowing the linker
177
# to garbage collect the unused ones.
178
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections")
179
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections")
180
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gc-sections")
181
# Printing the discarded section is "too much", so enable on demand.
182
#SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -Wl,--print-gc-sections")
183
#SET(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} -Wl,--print-gc-sections")
184
ENDIF()
185
ENDIF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR
186
CMAKE_C_COMPILER_ID MATCHES "^Clang$" AND NOT MSVC)
187
IF (CMAKE_C_COMPILER_ID MATCHES "^XL$")
188
SET(CMAKE_C_COMPILER "xlc_r")
189
SET(CMAKE_REQUIRED_FLAGS "-qflag=e:e -qformat=sec")
190
#################################################################
191
# Set compile flags for all build types.
192
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -qflag=e:e -qformat=sec")
193
if (ENABLE_WERROR)
194
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -qhalt=w")
195
endif ()
196
#################################################################
197
# Set compile flags for debug build.
198
# This is added into CMAKE_C_FLAGS when CMAKE_BUILD_TYPE is "Debug"
199
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g")
200
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -qflag=w:w")
201
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -qinfo=pro:use")
202
ENDIF(CMAKE_C_COMPILER_ID MATCHES "^XL$")
203
IF (MSVC)
204
if (ENABLE_WERROR)
205
# /WX option is the same as gcc's -Werror option.
206
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /WX")
207
endif ()
208
#################################################################
209
# Set compile flags for debug build.
210
# This is added into CMAKE_C_FLAGS when CMAKE_BUILD_TYPE is "Debug"
211
# Enable level 4 C4062: The enumerate has no associated handler in a switch
212
# statement and there is no default that can catch it.
213
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14062")
214
# Enable level 4 C4254: A larger bit field was assigned to a smaller bit
215
# field.
216
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14254")
217
# Enable level 4 C4295: An array was initialized but the last character in
218
# the array is not a null; accessing the array may
219
# produce unexpected results.
220
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14295")
221
# Enable level 4 C4296: An unsigned variable was used in a comparison
222
# operation with zero.
223
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14296")
224
# Enable level 4 C4389: An operation involved signed and unsigned variables.
225
# This could result in a loss of data.
226
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14389")
227
# Enable level 4 C4505: The given function is local and not referenced in
228
# the body of the module; therefore, the function is
229
# dead code.
230
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14505")
231
# Enable level 4 C4514: The optimizer removed an inline function that is not
232
# called.
233
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14514")
234
# Enable level 4 C4702: Unreachable code.
235
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14702")
236
# Enable level 4 C4706: The test value in a conditional expression was the
237
# result of an assignment.
238
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14706")
239
# /Oi option enables built-in functions.
240
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /Oi")
241
#################################################################
242
# Set compile flags for release build.
243
SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Oi")
244
ENDIF (MSVC)
245
ENDIF()
246
247
# Enable CTest/CDash support
248
include(CTest)
249
250
option(BUILD_SHARED_LIBS "Build shared libraries" ON)
251
252
OPTION(ENABLE_MBEDTLS "Enable use of mbed TLS" OFF)
253
OPTION(ENABLE_NETTLE "Enable use of Nettle" OFF)
254
OPTION(ENABLE_OPENSSL "Enable use of OpenSSL" ON)
255
OPTION(ENABLE_LIBB2 "Enable the use of the system LIBB2 library if found" ON)
256
OPTION(ENABLE_LZ4 "Enable the use of the system LZ4 library if found" ON)
257
OPTION(ENABLE_LZO "Enable the use of the system LZO library if found" OFF)
258
OPTION(ENABLE_LZMA "Enable the use of the system LZMA library if found" ON)
259
OPTION(ENABLE_ZSTD "Enable the use of the system zstd library if found" ON)
260
261
OPTION(ENABLE_ZLIB "Enable the use of the system ZLIB library if found" ON)
262
OPTION(ENABLE_BZip2 "Enable the use of the system BZip2 library if found" ON)
263
OPTION(ENABLE_LIBXML2 "Enable the use of the system libxml2 library if found" ON)
264
OPTION(ENABLE_EXPAT "Enable the use of the system EXPAT library if found" ON)
265
OPTION(ENABLE_WIN32_XMLLITE "Enable the use of the Windows XmlLite library if found" ON)
266
OPTION(ENABLE_PCREPOSIX "Enable the use of the system PCREPOSIX library if found" ON)
267
OPTION(ENABLE_PCRE2POSIX "Enable the use of the system PCRE2POSIX library if found" ON)
268
OPTION(ENABLE_LIBGCC "Enable the use of the system LibGCC library if found" ON)
269
# CNG is used for encrypt/decrypt Zip archives on Windows.
270
OPTION(ENABLE_CNG "Enable the use of CNG(Crypto Next Generation)" ON)
271
272
OPTION(ENABLE_TAR "Enable tar building" ON)
273
OPTION(ENABLE_TAR_SHARED "Enable dynamic build of tar" FALSE)
274
OPTION(ENABLE_CPIO "Enable cpio building" ON)
275
OPTION(ENABLE_CPIO_SHARED "Enable dynamic build of cpio" FALSE)
276
OPTION(ENABLE_CAT "Enable cat building" ON)
277
OPTION(ENABLE_CAT_SHARED "Enable dynamic build of cat" FALSE)
278
IF(WIN32 AND NOT CYGWIN)
279
SET(ENABLE_UNZIP FALSE)
280
SET(ENABLE_UNZIP_SHARED FALSE)
281
ELSE()
282
OPTION(ENABLE_UNZIP "Enable unzip building" ON)
283
OPTION(ENABLE_UNZIP_SHARED "Enable dynamic build of unzip" FALSE)
284
ENDIF()
285
OPTION(ENABLE_XATTR "Enable extended attribute support" ON)
286
OPTION(ENABLE_ACL "Enable ACL support" ON)
287
OPTION(ENABLE_ICONV "Enable iconv support" ON)
288
OPTION(ENABLE_TEST "Enable unit and regression tests" ON)
289
OPTION(ENABLE_COVERAGE "Enable code coverage (GCC only, automatically sets ENABLE_TEST to ON)" FALSE)
290
OPTION(ENABLE_INSTALL "Enable installing of libraries" ON)
291
292
IF(WIN32 AND MSVC)
293
OPTION(MSVC_USE_STATIC_CRT "Use static CRT" OFF)
294
ENDIF()
295
296
SET(POSIX_REGEX_LIB "AUTO" CACHE STRING "Choose what library should provide POSIX regular expression support")
297
SET(ENABLE_SAFESEH "AUTO" CACHE STRING "Enable use of /SAFESEH linker flag (MSVC only)")
298
SET(WINDOWS_VERSION "WIN10" CACHE STRING "Set Windows version to use (Windows only)")
299
300
IF(ENABLE_COVERAGE)
301
include(LibarchiveCodeCoverage)
302
ENDIF(ENABLE_COVERAGE)
303
304
IF(ENABLE_TEST)
305
ENABLE_TESTING()
306
ENDIF(ENABLE_TEST)
307
308
IF(WIN32)
309
IF(WINDOWS_VERSION STREQUAL "WIN10")
310
SET(NTDDI_VERSION 0x0A000000)
311
SET(_WIN32_WINNT 0x0A00)
312
SET(WINVER 0x0A00)
313
ELSEIF(WINDOWS_VERSION STREQUAL "WIN8")
314
SET(NTDDI_VERSION 0x06020000)
315
SET(_WIN32_WINNT 0x0602)
316
SET(WINVER 0x0602)
317
ELSEIF(WINDOWS_VERSION STREQUAL "WIN7")
318
SET(NTDDI_VERSION 0x06010000)
319
SET(_WIN32_WINNT 0x0601)
320
SET(WINVER 0x0601)
321
ELSEIF(WINDOWS_VERSION STREQUAL "WS08")
322
SET(NTDDI_VERSION 0x06000100)
323
SET(_WIN32_WINNT 0x0600)
324
SET(WINVER 0x0600)
325
ELSE(WINDOWS_VERSION STREQUAL "WIN10")
326
# Default to Windows Server 2003 API if we don't recognize the specifier
327
SET(NTDDI_VERSION 0x05020000)
328
SET(_WIN32_WINNT 0x0502)
329
SET(WINVER 0x0502)
330
ENDIF(WINDOWS_VERSION STREQUAL "WIN10")
331
ENDIF(WIN32)
332
333
IF(MSVC)
334
IF(ENABLE_SAFESEH STREQUAL "YES")
335
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH")
336
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SAFESEH")
337
SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /SAFESEH")
338
SET(ENV{LDFLAGS} "$ENV{LDFLAGS} /SAFESEH")
339
ELSEIF(ENABLE_SAFESEH STREQUAL "NO")
340
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO")
341
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SAFESEH:NO")
342
SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /SAFESEH:NO")
343
SET(ENV{LDFLAGS} "$ENV{LDFLAGS} /SAFESEH:NO")
344
ENDIF(ENABLE_SAFESEH STREQUAL "YES")
345
ENDIF(MSVC)
346
347
IF("${CMAKE_C_PLATFORM_ID}" MATCHES "^(HP-UX)$")
348
ADD_DEFINITIONS(-D_XOPEN_SOURCE=500) # Ask wchar.h for mbstate_t
349
ENDIF()
350
351
IF(MINGW)
352
ADD_DEFINITIONS(-D__USE_MINGW_ANSI_STDIO)
353
ADD_DEFINITIONS(-D__MINGW_USE_VC2005_COMPAT)
354
ENDIF()
355
356
#
357
INCLUDE(CheckCSourceCompiles)
358
INCLUDE(CheckCSourceRuns)
359
INCLUDE(CheckFileOffsetBits)
360
INCLUDE(CheckFuncs)
361
INCLUDE(CheckHeaderDirent)
362
INCLUDE(CheckIncludeFile)
363
INCLUDE(CheckIncludeFiles)
364
INCLUDE(CheckLibraryExists)
365
INCLUDE(CheckStructHasMember)
366
INCLUDE(CheckSymbolExists)
367
INCLUDE(CheckTypeExists)
368
INCLUDE(CheckTypeSize)
369
370
#
371
# Generate list.h
372
#
373
MACRO (GENERATE_LIST_H _listfile _cmlist __list_sources)
374
SET(_argv ${ARGV})
375
# Remove _listfile and _cmlist from _argv
376
LIST(REMOVE_AT _argv 0 1)
377
IF (NOT EXISTS "${_listfile}" OR
378
${_cmlist} IS_NEWER_THAN "${_listfile}")
379
380
MESSAGE(STATUS "Generating ${_listfile}")
381
FILE(WRITE ${_listfile} "")
382
FOREACH (testfile ${_argv})
383
IF (testfile MATCHES "^test_[^/]+[.]c$")
384
FILE(STRINGS ${testfile} testvar REGEX "^DEFINE_TEST")
385
FOREACH (deftest ${testvar})
386
FILE(APPEND ${_listfile} "${deftest}\n")
387
ENDFOREACH (deftest)
388
ENDIF (testfile MATCHES "^test_[^/]+[.]c$")
389
ENDFOREACH (testfile)
390
391
ENDIF (NOT EXISTS "${_listfile}" OR
392
${_cmlist} IS_NEWER_THAN "${_listfile}")
393
ENDMACRO (GENERATE_LIST_H)
394
#
395
# Generate installation rules for man pages.
396
#
397
MACRO (INSTALL_MAN __mans)
398
IF(ENABLE_INSTALL)
399
FOREACH (_man ${ARGV})
400
STRING(REGEX REPLACE "^.+[.]([1-9])" "\\1" _mansect ${_man})
401
INSTALL(FILES ${_man} DESTINATION "share/man/man${_mansect}")
402
ENDFOREACH (_man)
403
ENDIF(ENABLE_INSTALL)
404
ENDMACRO (INSTALL_MAN __mans)
405
#
406
# Find out what macro is needed to use libraries on Windows.
407
#
408
MACRO (TRY_MACRO_FOR_LIBRARY INCLUDES LIBRARIES
409
TRY_TYPE SAMPLE_SOURCE MACRO_LIST)
410
IF(WIN32 AND NOT CYGWIN)
411
CMAKE_PUSH_CHECK_STATE() # Save the state of the variables
412
SET(CMAKE_REQUIRED_INCLUDES ${INCLUDES})
413
SET(CMAKE_REQUIRED_LIBRARIES ${LIBRARIES})
414
FOREACH(VAR ${MACRO_LIST})
415
# Clear ${VAR} from CACHE If the libraries which ${VAR} was
416
# checked with are changed.
417
SET(VAR_WITH_LIB "${VAR}_WITH_LIB")
418
GET_PROPERTY(PREV_VAR_WITH_LIB VARIABLE PROPERTY ${VAR_WITH_LIB})
419
IF(NOT "${PREV_VAR_WITH_LIB}" STREQUAL "${LIBRARIES}")
420
UNSET(${VAR} CACHE)
421
ENDIF(NOT "${PREV_VAR_WITH_LIB}" STREQUAL "${LIBRARIES}")
422
# Check if the library can be used with the macro.
423
IF("${TRY_TYPE}" MATCHES "COMPILES")
424
CHECK_C_SOURCE_COMPILES("${SAMPLE_SOURCE}" ${VAR})
425
ELSEIF("${TRY_TYPE}" MATCHES "RUNS")
426
IF(CMAKE_CROSSCOMPILING)
427
MESSAGE(WARNING "Cannot test run \"${VAR}\" when cross-compiling")
428
ELSE(CMAKE_CROSSCOMPILING)
429
CHECK_C_SOURCE_RUNS("${SAMPLE_SOURCE}" ${VAR})
430
ENDIF(CMAKE_CROSSCOMPILING)
431
ELSE("${TRY_TYPE}" MATCHES "COMPILES")
432
MESSAGE(FATAL_ERROR "UNKNOWN KEYWORD \"${TRY_TYPE}\" FOR TRY_TYPE")
433
ENDIF("${TRY_TYPE}" MATCHES "COMPILES")
434
# Save the libraries which ${VAR} is checked with.
435
SET(${VAR_WITH_LIB} "${LIBRARIES}" CACHE INTERNAL
436
"Macro ${VAR} is checked with")
437
ENDFOREACH(VAR)
438
CMAKE_POP_CHECK_STATE() # Restore the state of the variables
439
ENDIF(WIN32 AND NOT CYGWIN)
440
ENDMACRO (TRY_MACRO_FOR_LIBRARY)
441
#
442
# Check compress/decompress libraries
443
#
444
IF(WIN32 AND NOT CMAKE_CL_64 AND NOT CYGWIN)
445
# GnuWin32 is only for Win32, not Win64.
446
SET(__GNUWIN32PATH "C:/Program Files/GnuWin32")
447
ENDIF(WIN32 AND NOT CMAKE_CL_64 AND NOT CYGWIN)
448
IF(DEFINED __GNUWIN32PATH AND EXISTS "${__GNUWIN32PATH}")
449
# You have to add a path available DLL file into PATH environment variable.
450
# Maybe DLL path is "C:/Program Files/GnuWin32/bin".
451
# The zlib and the bzip2 Setup program have installed programs and DLLs into
452
# "C:/Program Files/GnuWin32" by default.
453
# This is convenience setting for Windows.
454
SET(CMAKE_PREFIX_PATH ${__GNUWIN32PATH} $(CMAKE_PREFIX_PATH))
455
#
456
# If you didn't use Setup program or installed into nonstandard path,
457
# cmake cannot find out your zlib or bzip2 libraries and include files,
458
# you should execute cmake with -DCMAKE_PREFIX_PATH option.
459
# e.g.
460
# cmake -DCMAKE_PREFIX_PATH=<your-GnuWin32-path> <path-to-source>
461
#
462
# If compiling error occurred in zconf.h, You may need patch to zconf.h.
463
#--- zconf.h.orig 2005-07-21 00:40:26.000000000
464
#+++ zconf.h 2009-01-19 11:39:10.093750000
465
#@@ -286,7 +286,7 @@
466
#
467
# #if 1 /* HAVE_UNISTD_H -- this line is updated by ./configure */
468
# # include <sys/types.h> /* for off_t */
469
#-# include <unistd.h> /* for SEEK_* and off_t */
470
#+# include <stdio.h> /* for SEEK_* and off_t */
471
# # ifdef VMS
472
# # include <unixio.h> /* for off_t */
473
# # endif
474
ENDIF(DEFINED __GNUWIN32PATH AND EXISTS "${__GNUWIN32PATH}")
475
476
SET(ADDITIONAL_LIBS "")
477
#
478
# Find ZLIB
479
#
480
IF(ENABLE_ZLIB)
481
FIND_PACKAGE(ZLIB)
482
SET(ZLIB_INCLUDE_DIR "")
483
SET(ZLIB_LIBRARIES ZLIB::ZLIB)
484
ELSE()
485
SET(ZLIB_FOUND FALSE) # Override cached value
486
ENDIF()
487
IF(ZLIB_FOUND)
488
SET(HAVE_LIBZ 1)
489
SET(HAVE_ZLIB_H 1)
490
INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR})
491
LIST(APPEND ADDITIONAL_LIBS ${ZLIB_LIBRARIES})
492
IF(WIN32 AND NOT CYGWIN)
493
#
494
# Test if ZLIB_WINAPI macro is needed to use.
495
#
496
TRY_MACRO_FOR_LIBRARY(
497
"${ZLIB_INCLUDE_DIR}" "${ZLIB_LIBRARIES}"
498
RUNS
499
"#include <zlib.h>\nint main() {uLong f = zlibCompileFlags(); return (f&(1U<<10))?0:-1; }"
500
ZLIB_WINAPI)
501
IF(ZLIB_WINAPI)
502
ADD_DEFINITIONS(-DZLIB_WINAPI)
503
ELSE(ZLIB_WINAPI)
504
# Test if a macro is needed for the library.
505
TRY_MACRO_FOR_LIBRARY(
506
"${ZLIB_INCLUDE_DIR}" "${ZLIB_LIBRARIES}"
507
COMPILES
508
"#include <zlib.h>\nint main() {return zlibVersion()?1:0; }"
509
"ZLIB_DLL;WITHOUT_ZLIB_DLL")
510
IF(ZLIB_DLL)
511
ADD_DEFINITIONS(-DZLIB_DLL)
512
ENDIF(ZLIB_DLL)
513
ENDIF(ZLIB_WINAPI)
514
ENDIF(WIN32 AND NOT CYGWIN)
515
ELSE(ZLIB_FOUND)
516
MESSAGE(FATAL_ERROR "CMake requires zlib to be available to libarchive")
517
ENDIF(ZLIB_FOUND)
518
#
519
# Find BZip2
520
#
521
IF(ENABLE_BZip2)
522
FIND_PACKAGE(BZip2)
523
ELSE()
524
SET(BZIP2_FOUND FALSE) # Override cached value
525
ENDIF()
526
IF(BZIP2_FOUND)
527
SET(HAVE_LIBBZ2 1)
528
SET(HAVE_BZLIB_H 1)
529
INCLUDE_DIRECTORIES(${BZIP2_INCLUDE_DIR})
530
LIST(APPEND ADDITIONAL_LIBS ${BZIP2_LIBRARIES})
531
# Test if a macro is needed for the library.
532
TRY_MACRO_FOR_LIBRARY(
533
"${BZIP2_INCLUDE_DIR}" "${BZIP2_LIBRARIES}"
534
COMPILES
535
"#include <bzlib.h>\nint main() {return BZ2_bzlibVersion()?1:0; }"
536
"USE_BZIP2_DLL;USE_BZIP2_STATIC")
537
IF(USE_BZIP2_DLL)
538
ADD_DEFINITIONS(-DUSE_BZIP2_DLL)
539
ELSEIF(USE_BZIP2_STATIC)
540
ADD_DEFINITIONS(-DUSE_BZIP2_STATIC)
541
ENDIF(USE_BZIP2_DLL)
542
ENDIF(BZIP2_FOUND)
543
544
545
#
546
# Find LZMA
547
#
548
IF(ENABLE_LZMA)
549
FIND_PACKAGE(LibLZMA)
550
ELSE()
551
SET(LIBLZMA_FOUND FALSE) # Override cached value
552
ENDIF()
553
554
IF(LIBLZMA_FOUND)
555
SET(HAVE_LIBLZMA 1)
556
SET(HAVE_LZMA_H 1)
557
CMAKE_PUSH_CHECK_STATE()
558
SET(CMAKE_REQUIRED_INCLUDES ${LIBLZMA_INCLUDE_DIR})
559
SET(CMAKE_REQUIRED_LIBRARIES ${LIBLZMA_LIBRARIES})
560
INCLUDE_DIRECTORIES(${LIBLZMA_INCLUDE_DIRS})
561
LIST(APPEND ADDITIONAL_LIBS ${LIBLZMA_LIBRARIES})
562
IF(CMAKE_USE_SYSTEM_LIBLZMA)
563
# Test if a macro is needed for the library.
564
TRY_MACRO_FOR_LIBRARY(
565
"${LIBLZMA_INCLUDE_DIRS}" "${LIBLZMA_LIBRARIES}"
566
COMPILES
567
"#include <lzma.h>\nint main() {return (int)lzma_version_number(); }"
568
"WITHOUT_LZMA_API_STATIC;LZMA_API_STATIC")
569
CHECK_C_SOURCE_COMPILES(
570
"#include <lzma.h>\n#if LZMA_VERSION < 50020000\n#error unsupported\n#endif\nint main(void){int ignored __attribute__((unused)); ignored = lzma_stream_encoder_mt(0, 0); return 0;}"
571
HAVE_LZMA_STREAM_ENCODER_MT)
572
IF(NOT WITHOUT_LZMA_API_STATIC AND LZMA_API_STATIC)
573
ADD_DEFINITIONS(-DLZMA_API_STATIC)
574
ENDIF()
575
ELSE()
576
ADD_DEFINITIONS(-DLZMA_API_STATIC)
577
ENDIF()
578
CMAKE_POP_CHECK_STATE()
579
ELSE(LIBLZMA_FOUND)
580
# LZMA not found and will not be used.
581
SET(HAVE_LZMA_STREAM_ENCODER_MT 0)
582
ENDIF(LIBLZMA_FOUND)
583
#
584
# Find LZO2
585
#
586
IF(ENABLE_LZO)
587
IF (LZO2_INCLUDE_DIR)
588
# Already in cache, be silent
589
SET(LZO2_FIND_QUIETLY TRUE)
590
ENDIF (LZO2_INCLUDE_DIR)
591
592
FIND_PATH(LZO2_INCLUDE_DIR lzo/lzoconf.h)
593
FIND_LIBRARY(LZO2_LIBRARY NAMES lzo2 liblzo2)
594
INCLUDE(FindPackageHandleStandardArgs)
595
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LZO2 DEFAULT_MSG LZO2_LIBRARY LZO2_INCLUDE_DIR)
596
ELSE(ENABLE_LZO)
597
SET(LZO2_FOUND FALSE) # Override cached value
598
ENDIF(ENABLE_LZO)
599
IF(LZO2_FOUND)
600
SET(HAVE_LIBLZO2 1)
601
SET(HAVE_LZO_LZOCONF_H 1)
602
SET(HAVE_LZO_LZO1X_H 1)
603
INCLUDE_DIRECTORIES(${LZO2_INCLUDE_DIR})
604
LIST(APPEND ADDITIONAL_LIBS ${LZO2_LIBRARY})
605
#
606
# TODO: test for static library.
607
#
608
ENDIF(LZO2_FOUND)
609
#
610
# Find libb2
611
#
612
IF(ENABLE_LIBB2)
613
IF (LIBB2_INCLUDE_DIR)
614
# Already in cache, be silent
615
SET(LIBB2_FIND_QUIETLY TRUE)
616
ENDIF (LIBB2_INCLUDE_DIR)
617
618
FIND_PATH(LIBB2_INCLUDE_DIR blake2.h)
619
FIND_LIBRARY(LIBB2_LIBRARY NAMES b2 libb2)
620
INCLUDE(FindPackageHandleStandardArgs)
621
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LIBB2 DEFAULT_MSG LIBB2_LIBRARY LIBB2_INCLUDE_DIR)
622
ELSE(ENABLE_LIBB2)
623
SET(LIBB2_FOUND FALSE) # Override cached value
624
UNSET(LIBB2_PKGCONFIG_VERSION CACHE)
625
ENDIF(ENABLE_LIBB2)
626
IF(LIBB2_FOUND)
627
SET(HAVE_LIBB2 1)
628
SET(HAVE_BLAKE2_H 1)
629
SET(ARCHIVE_BLAKE2 FALSE)
630
LIST(APPEND ADDITIONAL_LIBS ${LIBB2_LIBRARY})
631
INCLUDE_DIRECTORIES(${LIBB2_INCLUDE_DIR})
632
CMAKE_PUSH_CHECK_STATE()
633
SET(CMAKE_REQUIRED_LIBRARIES ${LIBB2_LIBRARY})
634
SET(CMAKE_REQUIRED_INCLUDES ${LIBB2_INCLUDE_DIR})
635
CHECK_FUNCTION_EXISTS(blake2sp_init HAVE_LIBB2)
636
CMAKE_POP_CHECK_STATE()
637
pkg_check_modules(LIBB2 libb2)
638
IF(LIBB2_VERSION)
639
SET(LIBB2_PKGCONFIG_VERSION LIBB2_VERSION)
640
ENDIF(LIBB2_VERSION)
641
ELSE(LIBB2_FOUND)
642
SET(ARCHIVE_BLAKE2 TRUE)
643
UNSET(LIBB2_PKGCONFIG_VERSION CACHE)
644
ENDIF(LIBB2_FOUND)
645
#
646
# Find LZ4
647
#
648
IF(ENABLE_LZ4)
649
IF (LZ4_INCLUDE_DIR)
650
# Already in cache, be silent
651
SET(LZ4_FIND_QUIETLY TRUE)
652
ENDIF (LZ4_INCLUDE_DIR)
653
654
FIND_PATH(LZ4_INCLUDE_DIR lz4.h)
655
FIND_LIBRARY(LZ4_LIBRARY NAMES lz4 liblz4)
656
INCLUDE(FindPackageHandleStandardArgs)
657
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LZ4 DEFAULT_MSG LZ4_LIBRARY LZ4_INCLUDE_DIR)
658
ELSE(ENABLE_LZ4)
659
SET(LZ4_FOUND FALSE) # Override cached value
660
ENDIF(ENABLE_LZ4)
661
IF(LZ4_FOUND)
662
SET(HAVE_LIBLZ4 1)
663
SET(HAVE_LZ4_H 1)
664
CMAKE_PUSH_CHECK_STATE() # Save the state of the variables
665
SET(CMAKE_REQUIRED_INCLUDES ${LZ4_INCLUDE_DIR})
666
CHECK_INCLUDE_FILES("lz4hc.h" HAVE_LZ4HC_H)
667
CMAKE_POP_CHECK_STATE() # Restore the state of the variables
668
INCLUDE_DIRECTORIES(${LZ4_INCLUDE_DIR})
669
LIST(APPEND ADDITIONAL_LIBS ${LZ4_LIBRARY})
670
#
671
# TODO: test for static library.
672
#
673
ENDIF(LZ4_FOUND)
674
#
675
# Find Zstd
676
#
677
IF(ENABLE_ZSTD)
678
IF (ZSTD_INCLUDE_DIR)
679
# Already in cache, be silent
680
SET(ZSTD_FIND_QUIETLY TRUE)
681
ENDIF (ZSTD_INCLUDE_DIR)
682
683
IF(0) # CMake does not let pkg-config override its search paths.
684
IF(UNIX)
685
FIND_PACKAGE(PkgConfig QUIET)
686
PKG_SEARCH_MODULE(PC_ZSTD libzstd)
687
ENDIF()
688
ENDIF()
689
690
FIND_PATH(ZSTD_INCLUDE_DIR zstd.h HINTS ${PC_ZSTD_INCLUDEDIR} ${PC_ZSTD_INCLUDE_DIRS})
691
FIND_LIBRARY(ZSTD_LIBRARY NAMES zstd libzstd HINTS ${PC_ZSTD_LIBDIR} ${PC_ZSTD_LIBRARY_DIRS})
692
INCLUDE(FindPackageHandleStandardArgs)
693
FIND_PACKAGE_HANDLE_STANDARD_ARGS(ZSTD DEFAULT_MSG ZSTD_LIBRARY ZSTD_INCLUDE_DIR)
694
ELSE(ENABLE_ZSTD)
695
SET(ZSTD_FOUND FALSE) # Override cached value
696
ENDIF(ENABLE_ZSTD)
697
IF(ZSTD_FOUND)
698
SET(HAVE_ZSTD_H 1)
699
INCLUDE_DIRECTORIES(${ZSTD_INCLUDE_DIR})
700
LIST(APPEND ADDITIONAL_LIBS ${ZSTD_LIBRARY})
701
SET(HAVE_LIBZSTD 1)
702
SET(HAVE_ZSTD_compressStream 1)
703
IF(0) # CMake expects the zstd library to work.
704
CMAKE_PUSH_CHECK_STATE()
705
SET(CMAKE_REQUIRED_LIBRARIES ${ZSTD_LIBRARY})
706
SET(CMAKE_REQUIRED_INCLUDES ${ZSTD_INCLUDE_DIR})
707
CHECK_FUNCTION_EXISTS(ZSTD_decompressStream HAVE_LIBZSTD)
708
CHECK_FUNCTION_EXISTS(ZSTD_compressStream HAVE_ZSTD_compressStream)
709
CHECK_FUNCTION_EXISTS(ZSTD_minCLevel HAVE_ZSTD_minCLevel)
710
#
711
# TODO: test for static library.
712
#
713
CMAKE_POP_CHECK_STATE()
714
ENDIF()
715
ENDIF(ZSTD_FOUND)
716
MARK_AS_ADVANCED(CLEAR ZSTD_INCLUDE_DIR)
717
MARK_AS_ADVANCED(CLEAR ZSTD_LIBRARY)
718
719
#
720
# Check headers
721
#
722
CHECK_HEADER_DIRENT()
723
724
SET(INCLUDES "")
725
MACRO (LA_CHECK_INCLUDE_FILE header var)
726
CHECK_INCLUDE_FILES("${INCLUDES};${header}" ${var})
727
IF (${var})
728
SET(INCLUDES ${INCLUDES} ${header})
729
ENDIF (${var})
730
ENDMACRO (LA_CHECK_INCLUDE_FILE)
731
732
# Some FreeBSD headers assume sys/types.h was already included.
733
LA_CHECK_INCLUDE_FILE("sys/types.h" HAVE_SYS_TYPES_H)
734
735
# Alphabetize the rest unless there's a compelling reason
736
IF(ENABLE_ACL)
737
LA_CHECK_INCLUDE_FILE("acl/libacl.h" HAVE_ACL_LIBACL_H)
738
LA_CHECK_INCLUDE_FILE("attr/xattr.h" HAVE_ATTR_XATTR_H)
739
ELSE()
740
SET(HAVE_ACL_LIBACL_H FALSE)
741
SET(HAVE_ATTR_XATTR_H FALSE)
742
ENDIF()
743
LA_CHECK_INCLUDE_FILE("ctype.h" HAVE_CTYPE_H)
744
LA_CHECK_INCLUDE_FILE("copyfile.h" HAVE_COPYFILE_H)
745
LA_CHECK_INCLUDE_FILE("direct.h" HAVE_DIRECT_H)
746
LA_CHECK_INCLUDE_FILE("dlfcn.h" HAVE_DLFCN_H)
747
LA_CHECK_INCLUDE_FILE("errno.h" HAVE_ERRNO_H)
748
LA_CHECK_INCLUDE_FILE("ext2fs/ext2_fs.h" HAVE_EXT2FS_EXT2_FS_H)
749
750
CHECK_C_SOURCE_COMPILES("#include <sys/ioctl.h>
751
#include <ext2fs/ext2_fs.h>
752
int main(void) { return EXT2_IOC_GETFLAGS; }" HAVE_WORKING_EXT2_IOC_GETFLAGS)
753
754
LA_CHECK_INCLUDE_FILE("fcntl.h" HAVE_FCNTL_H)
755
LA_CHECK_INCLUDE_FILE("fnmatch.h" HAVE_FNMATCH_H)
756
LA_CHECK_INCLUDE_FILE("grp.h" HAVE_GRP_H)
757
LA_CHECK_INCLUDE_FILE("io.h" HAVE_IO_H)
758
LA_CHECK_INCLUDE_FILE("langinfo.h" HAVE_LANGINFO_H)
759
LA_CHECK_INCLUDE_FILE("limits.h" HAVE_LIMITS_H)
760
LA_CHECK_INCLUDE_FILE("linux/types.h" HAVE_LINUX_TYPES_H)
761
LA_CHECK_INCLUDE_FILE("linux/fiemap.h" HAVE_LINUX_FIEMAP_H)
762
LA_CHECK_INCLUDE_FILE("linux/fs.h" HAVE_LINUX_FS_H)
763
764
CHECK_C_SOURCE_COMPILES("#include <sys/ioctl.h>
765
#include <linux/fs.h>
766
int main(void) { return FS_IOC_GETFLAGS; }" HAVE_WORKING_FS_IOC_GETFLAGS)
767
768
LA_CHECK_INCLUDE_FILE("linux/magic.h" HAVE_LINUX_MAGIC_H)
769
LA_CHECK_INCLUDE_FILE("locale.h" HAVE_LOCALE_H)
770
LA_CHECK_INCLUDE_FILE("membership.h" HAVE_MEMBERSHIP_H)
771
LA_CHECK_INCLUDE_FILE("memory.h" HAVE_MEMORY_H)
772
LA_CHECK_INCLUDE_FILE("paths.h" HAVE_PATHS_H)
773
LA_CHECK_INCLUDE_FILE("poll.h" HAVE_POLL_H)
774
LA_CHECK_INCLUDE_FILE("process.h" HAVE_PROCESS_H)
775
LA_CHECK_INCLUDE_FILE("pthread.h" HAVE_PTHREAD_H)
776
LA_CHECK_INCLUDE_FILE("pwd.h" HAVE_PWD_H)
777
LA_CHECK_INCLUDE_FILE("readpassphrase.h" HAVE_READPASSPHRASE_H)
778
LA_CHECK_INCLUDE_FILE("regex.h" HAVE_REGEX_H)
779
LA_CHECK_INCLUDE_FILE("signal.h" HAVE_SIGNAL_H)
780
LA_CHECK_INCLUDE_FILE("spawn.h" HAVE_SPAWN_H)
781
LA_CHECK_INCLUDE_FILE("stdarg.h" HAVE_STDARG_H)
782
LA_CHECK_INCLUDE_FILE("stdlib.h" HAVE_STDLIB_H)
783
LA_CHECK_INCLUDE_FILE("string.h" HAVE_STRING_H)
784
LA_CHECK_INCLUDE_FILE("strings.h" HAVE_STRINGS_H)
785
LA_CHECK_INCLUDE_FILE("sys/acl.h" HAVE_SYS_ACL_H)
786
LA_CHECK_INCLUDE_FILE("sys/cdefs.h" HAVE_SYS_CDEFS_H)
787
LA_CHECK_INCLUDE_FILE("sys/extattr.h" HAVE_SYS_EXTATTR_H)
788
LA_CHECK_INCLUDE_FILE("sys/ioctl.h" HAVE_SYS_IOCTL_H)
789
LA_CHECK_INCLUDE_FILE("sys/mkdev.h" HAVE_SYS_MKDEV_H)
790
LA_CHECK_INCLUDE_FILE("sys/mount.h" HAVE_SYS_MOUNT_H)
791
LA_CHECK_INCLUDE_FILE("sys/param.h" HAVE_SYS_PARAM_H)
792
LA_CHECK_INCLUDE_FILE("sys/poll.h" HAVE_SYS_POLL_H)
793
LA_CHECK_INCLUDE_FILE("sys/richacl.h" HAVE_SYS_RICHACL_H)
794
LA_CHECK_INCLUDE_FILE("sys/select.h" HAVE_SYS_SELECT_H)
795
LA_CHECK_INCLUDE_FILE("sys/stat.h" HAVE_SYS_STAT_H)
796
LA_CHECK_INCLUDE_FILE("sys/statfs.h" HAVE_SYS_STATFS_H)
797
LA_CHECK_INCLUDE_FILE("sys/statvfs.h" HAVE_SYS_STATVFS_H)
798
LA_CHECK_INCLUDE_FILE("sys/sysmacros.h" HAVE_SYS_SYSMACROS_H)
799
LA_CHECK_INCLUDE_FILE("sys/time.h" HAVE_SYS_TIME_H)
800
LA_CHECK_INCLUDE_FILE("sys/utime.h" HAVE_SYS_UTIME_H)
801
LA_CHECK_INCLUDE_FILE("sys/utsname.h" HAVE_SYS_UTSNAME_H)
802
LA_CHECK_INCLUDE_FILE("sys/vfs.h" HAVE_SYS_VFS_H)
803
LA_CHECK_INCLUDE_FILE("sys/wait.h" HAVE_SYS_WAIT_H)
804
LA_CHECK_INCLUDE_FILE("sys/xattr.h" HAVE_SYS_XATTR_H)
805
LA_CHECK_INCLUDE_FILE("time.h" HAVE_TIME_H)
806
LA_CHECK_INCLUDE_FILE("unistd.h" HAVE_UNISTD_H)
807
LA_CHECK_INCLUDE_FILE("utime.h" HAVE_UTIME_H)
808
LA_CHECK_INCLUDE_FILE("wchar.h" HAVE_WCHAR_H)
809
LA_CHECK_INCLUDE_FILE("wctype.h" HAVE_WCTYPE_H)
810
LA_CHECK_INCLUDE_FILE("windows.h" HAVE_WINDOWS_H)
811
IF(ENABLE_CNG)
812
LA_CHECK_INCLUDE_FILE("bcrypt.h" HAVE_BCRYPT_H)
813
IF(HAVE_BCRYPT_H)
814
LIST(APPEND ADDITIONAL_LIBS "bcrypt")
815
ENDIF(HAVE_BCRYPT_H)
816
ELSE(ENABLE_CNG)
817
UNSET(HAVE_BCRYPT_H CACHE)
818
ENDIF(ENABLE_CNG)
819
# Following files need windows.h, so we should test it after windows.h test.
820
LA_CHECK_INCLUDE_FILE("wincrypt.h" HAVE_WINCRYPT_H)
821
LA_CHECK_INCLUDE_FILE("winioctl.h" HAVE_WINIOCTL_H)
822
823
#
824
# Check whether use of __EXTENSIONS__ is safe.
825
# We need some macro such as _GNU_SOURCE to use extension functions.
826
#
827
SET(_INCLUDE_FILES)
828
FOREACH (it ${_HEADER})
829
SET(_INCLUDE_FILES "${_INCLUDE_FILES}#include <${it}>\n")
830
ENDFOREACH (it)
831
832
CHECK_C_SOURCE_COMPILES(
833
"#define __EXTENSIONS__ 1
834
${_INCLUDE_FILES}
835
int main() { return 0;}"
836
SAFE_TO_DEFINE_EXTENSIONS)
837
838
#
839
# Find mbed TLS
840
#
841
IF(ENABLE_MBEDTLS)
842
FIND_PACKAGE(MbedTLS)
843
IF(MBEDTLS_FOUND)
844
SET(HAVE_LIBMBEDCRYPTO 1)
845
LIST(APPEND ADDITIONAL_LIBS ${MBEDCRYPTO_LIBRARY})
846
INCLUDE_DIRECTORIES(${MBEDTLS_INCLUDE_DIRS})
847
848
LIST(APPEND CMAKE_REQUIRED_INCLUDES ${MBEDTLS_INCLUDE_DIRS})
849
LA_CHECK_INCLUDE_FILE("mbedtls/aes.h" HAVE_MBEDTLS_AES_H)
850
LA_CHECK_INCLUDE_FILE("mbedtls/md.h" HAVE_MBEDTLS_MD_H)
851
LA_CHECK_INCLUDE_FILE("mbedtls/pkcs5.h" HAVE_MBEDTLS_PKCS5_H)
852
LA_CHECK_INCLUDE_FILE("mbedtls/version.h" HAVE_MBEDTLS_VERSION_H)
853
ENDIF(MBEDTLS_FOUND)
854
MARK_AS_ADVANCED(CLEAR MBEDTLS_INCLUDE_DIRS)
855
MARK_AS_ADVANCED(CLEAR MBEDCRYPTO_LIBRARY)
856
ENDIF(ENABLE_MBEDTLS)
857
858
#
859
# Find Nettle
860
#
861
IF(ENABLE_NETTLE)
862
FIND_PACKAGE(Nettle)
863
IF(NETTLE_FOUND)
864
SET(HAVE_LIBNETTLE 1)
865
LIST(APPEND ADDITIONAL_LIBS ${NETTLE_LIBRARIES})
866
INCLUDE_DIRECTORIES(${NETTLE_INCLUDE_DIR})
867
868
LIST(APPEND CMAKE_REQUIRED_INCLUDES ${NETTLE_INCLUDE_DIR})
869
LA_CHECK_INCLUDE_FILE("nettle/aes.h" HAVE_NETTLE_AES_H)
870
LA_CHECK_INCLUDE_FILE("nettle/hmac.h" HAVE_NETTLE_HMAC_H)
871
LA_CHECK_INCLUDE_FILE("nettle/md5.h" HAVE_NETTLE_MD5_H)
872
LA_CHECK_INCLUDE_FILE("nettle/pbkdf2.h" HAVE_NETTLE_PBKDF2_H)
873
LA_CHECK_INCLUDE_FILE("nettle/ripemd160.h" HAVE_NETTLE_RIPEMD160_H)
874
LA_CHECK_INCLUDE_FILE("nettle/sha.h" HAVE_NETTLE_SHA_H)
875
LA_CHECK_INCLUDE_FILE("nettle/version.h" HAVE_NETTLE_VERSION_H)
876
ENDIF(NETTLE_FOUND)
877
MARK_AS_ADVANCED(CLEAR NETTLE_INCLUDE_DIR)
878
MARK_AS_ADVANCED(CLEAR NETTLE_LIBRARIES)
879
ENDIF(ENABLE_NETTLE)
880
881
#
882
# Find OpenSSL
883
# (Except on Mac, where OpenSSL is deprecated.)
884
#
885
IF(ENABLE_OPENSSL AND NOT CMAKE_SYSTEM_NAME MATCHES "Darwin")
886
FIND_PACKAGE(OpenSSL)
887
IF(OPENSSL_FOUND)
888
SET(HAVE_LIBCRYPTO 1)
889
INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR})
890
list(APPEND ADDITIONAL_LIBS OpenSSL::Crypto)
891
set(CMAKE_REQUIRED_LIBRARIES OpenSSL::Crypto)
892
SET(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
893
LA_CHECK_INCLUDE_FILE("openssl/evp.h" HAVE_OPENSSL_EVP_H)
894
LA_CHECK_INCLUDE_FILE("openssl/opensslv.h" HAVE_OPENSSL_OPENSSLV_H)
895
CHECK_FUNCTION_EXISTS(PKCS5_PBKDF2_HMAC_SHA1 HAVE_PKCS5_PBKDF2_HMAC_SHA1)
896
ENDIF(OPENSSL_FOUND)
897
ELSE()
898
SET(OPENSSL_FOUND FALSE) # Override cached value
899
ENDIF()
900
901
# FreeBSD libmd
902
IF(NOT OPENSSL_FOUND)
903
CHECK_LIBRARY_EXISTS(md "MD5Init" "" LIBMD_FOUND)
904
IF(LIBMD_FOUND)
905
CMAKE_PUSH_CHECK_STATE() # Save the state of the variables
906
SET(CMAKE_REQUIRED_LIBRARIES "md")
907
FIND_LIBRARY(LIBMD_LIBRARY NAMES md)
908
LIST(APPEND ADDITIONAL_LIBS ${LIBMD_LIBRARY})
909
CMAKE_POP_CHECK_STATE() # Restore the state of the variables
910
ENDIF(LIBMD_FOUND)
911
ENDIF(NOT OPENSSL_FOUND)
912
913
# libbsd for readpassphrase on Haiku
914
IF("${CMAKE_SYSTEM_NAME}" MATCHES "Haiku")
915
MESSAGE(STATUS "Adding libbsd for Haiku")
916
SET(CMAKE_REQUIRED_LIBRARIES "bsd")
917
FIND_LIBRARY(LIBBSD_LIBRARY NAMES bsd)
918
LIST(APPEND ADDITIONAL_LIBS ${LIBBSD_LIBRARY})
919
ENDIF("${CMAKE_SYSTEM_NAME}" MATCHES "Haiku")
920
921
#
922
# How to prove that CRYPTO functions, which have several names on various
923
# platforms, just see if archive_digest.c can compile and link against
924
# required libraries.
925
#
926
MACRO(CHECK_CRYPTO ALGORITHMS IMPLEMENTATION)
927
FOREACH(ALGORITHM ${ALGORITHMS})
928
IF(NOT ARCHIVE_CRYPTO_${ALGORITHM})
929
STRING(TOLOWER "${ALGORITHM}" lower_algorithm)
930
STRING(TOUPPER "${ALGORITHM}" algorithm)
931
IF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND NOT OPENSSL_FOUND)
932
SET(ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} FALSE)
933
ELSEIF("${IMPLEMENTATION}" MATCHES "^MBEDTLS$" AND NOT MBEDTLS_FOUND)
934
SET(ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} FALSE)
935
ELSEIF("${IMPLEMENTATION}" MATCHES "^NETTLE$" AND NOT NETTLE_FOUND)
936
SET(ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} FALSE)
937
ENDIF("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND NOT OPENSSL_FOUND)
938
939
IF(NOT DEFINED ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
940
# Probe the local implementation for whether this
941
# crypto implementation is available on this platform.
942
SET(TRY_CRYPTO_REQUIRED_INCLUDES
943
"-DINCLUDE_DIRECTORIES:STRING=${CMAKE_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}/libarchive;${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp")
944
LIST(APPEND TRY_CRYPTO_REQUIRED_INCLUDES "${CMake_SOURCE_DIR}/Utilities" "${CMake_BINARY_DIR}/Utilities") # for KWIML inside CMake
945
946
SET(TRY_CRYPTO_REQUIRED_LIBS)
947
IF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)
948
SET(TRY_CRYPTO_REQUIRED_INCLUDES
949
"${TRY_CRYPTO_REQUIRED_INCLUDES};${OPENSSL_INCLUDE_DIR}")
950
SET(TRY_CRYPTO_REQUIRED_LIBS
951
"-DLINK_LIBRARIES:STRING=${OPENSSL_LIBRARIES}")
952
ELSEIF("${IMPLEMENTATION}" MATCHES "^MBEDTLS$" AND MBEDTLS_FOUND)
953
SET(TRY_CRYPTO_REQUIRED_INCLUDES
954
"${TRY_CRYPTO_REQUIRED_INCLUDES};${MBEDTLS_INCLUDE_DIRS}")
955
SET(TRY_CRYPTO_REQUIRED_LIBS
956
"-DLINK_LIBRARIES:STRING=${MBEDCRYPTO_LIBRARY}")
957
ELSEIF("${IMPLEMENTATION}" MATCHES "^NETTLE$" AND NETTLE_FOUND)
958
SET(TRY_CRYPTO_REQUIRED_INCLUDES
959
"${TRY_CRYPTO_REQUIRED_INCLUDES};${NETTLE_INCLUDE_DIR}")
960
SET(TRY_CRYPTO_REQUIRED_LIBS
961
"-DLINK_LIBRARIES:STRING=${NETTLE_LIBRARY}")
962
ELSEIF("${IMPLEMENTATION}" MATCHES "^LIBMD$" AND LIBMD_FOUND)
963
SET(TRY_CRYPTO_REQUIRED_LIBS
964
"-DLINK_LIBRARIES:STRING=${LIBMD_LIBRARY}")
965
ENDIF("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)
966
967
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/build/cmake/config.h.in
968
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/confdefs.h)
969
FILE(READ "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/confdefs.h"
970
CONFDEFS_H)
971
FILE(READ "${CMAKE_CURRENT_SOURCE_DIR}/libarchive/archive_digest.c"
972
ARCHIVE_CRYPTO_C)
973
974
SET(SOURCE "${CONFDEFS_H}
975
976
#define ARCHIVE_${algorithm}_COMPILE_TEST
977
#define ARCHIVE_CRYPTO_${algorithm}_${IMPLEMENTATION}
978
#define PLATFORM_CONFIG_H \"check_crypto_md.h\"
979
980
${ARCHIVE_CRYPTO_C}
981
982
int
983
main(int argc, char **argv)
984
{
985
archive_${lower_algorithm}_ctx ctx;
986
archive_${lower_algorithm}_init(&ctx);
987
archive_${lower_algorithm}_update(&ctx, *argv, argc);
988
archive_${lower_algorithm}_final(&ctx, NULL);
989
return 0;
990
}
991
")
992
993
FILE(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_crypto_md.h" "")
994
FILE(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_crypto_md.c" "${SOURCE}")
995
MESSAGE(STATUS "Checking support for ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION}")
996
997
TRY_COMPILE(ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION}
998
${CMAKE_BINARY_DIR}
999
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_crypto_md.c
1000
CMAKE_FLAGS
1001
"${TRY_CRYPTO_REQUIRED_LIBS}"
1002
"${TRY_CRYPTO_REQUIRED_INCLUDES}"
1003
OUTPUT_VARIABLE OUTPUT)
1004
1005
# Inform user whether or not we found it; if not, log why we didn't.
1006
IF (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
1007
MESSAGE(STATUS "Checking support for ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} -- found")
1008
SET(ARCHIVE_CRYPTO_${ALGORITHM} 1)
1009
ELSE (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
1010
MESSAGE(STATUS "Checking support for ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} -- not found")
1011
FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
1012
"Checking support for ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} failed with the following output:\n"
1013
"${OUTPUT}\n"
1014
"Source file was:\n${SOURCE}\n")
1015
ENDIF (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
1016
ENDIF(NOT DEFINED ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
1017
1018
# Add appropriate libs/includes depending on whether the implementation
1019
# was found on this platform.
1020
IF (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
1021
IF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)
1022
LIST(APPEND ADDITIONAL_LIBS OpenSSL::Crypto)
1023
LIST(REMOVE_DUPLICATES ADDITIONAL_LIBS)
1024
ENDIF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)
1025
ENDIF (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
1026
ENDIF(NOT ARCHIVE_CRYPTO_${ALGORITHM})
1027
ENDFOREACH(ALGORITHM ${ALGORITHMS})
1028
ENDMACRO(CHECK_CRYPTO ALGORITHMS IMPLEMENTATION)
1029
1030
#
1031
# CRYPTO functions on Windows is defined at archive_windows.c, thus we do not
1032
# need the test what the functions can be mapped to archive_{crypto name}_init,
1033
# archive_{crypto name}_update and archive_{crypto name}_final.
1034
# The functions on Windows use CALG_{crypto name} macro to create a crypt object
1035
# and then we need to know what CALG_{crypto name} macros is available to show
1036
# ARCHIVE_CRYPTO_{crypto name}_WIN macros because Windows 2000 and earlier version
1037
# of Windows XP do not support SHA256, SHA384 and SHA512.
1038
#
1039
MACRO(CHECK_CRYPTO_WIN CRYPTO_LIST)
1040
IF(WIN32 AND NOT CYGWIN)
1041
FOREACH(CRYPTO ${CRYPTO_LIST})
1042
IF(NOT ARCHIVE_CRYPTO_${CRYPTO})
1043
IF(NOT DEFINED ARCHIVE_CRYPTO_${CRYPTO}_WIN)
1044
STRING(TOUPPER "${CRYPTO}" crypto)
1045
SET(ALGID "")
1046
IF ("${CRYPTO}" MATCHES "^MD5$")
1047
SET(ALGID "CALG_MD5")
1048
ENDIF ("${CRYPTO}" MATCHES "^MD5$")
1049
IF ("${CRYPTO}" MATCHES "^SHA1$")
1050
SET(ALGID "CALG_SHA1")
1051
ENDIF ("${CRYPTO}" MATCHES "^SHA1$")
1052
IF ("${CRYPTO}" MATCHES "^SHA256$")
1053
SET(ALGID "CALG_SHA_256")
1054
ENDIF ("${CRYPTO}" MATCHES "^SHA256$")
1055
IF ("${CRYPTO}" MATCHES "^SHA384$")
1056
SET(ALGID "CALG_SHA_384")
1057
ENDIF ("${CRYPTO}" MATCHES "^SHA384$")
1058
IF ("${CRYPTO}" MATCHES "^SHA512$")
1059
SET(ALGID "CALG_SHA_512")
1060
ENDIF ("${CRYPTO}" MATCHES "^SHA512$")
1061
1062
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/build/cmake/config.h.in
1063
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/confdefs.h)
1064
FILE(READ "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/confdefs.h"
1065
CONFDEFS_H)
1066
1067
SET(SOURCE "${CONFDEFS_H}
1068
1069
#define ${crypto}_COMPILE_TEST
1070
#include <windows.h>
1071
#include <wincrypt.h>
1072
1073
int
1074
main(int argc, char **argv)
1075
{
1076
return ${ALGID};
1077
}
1078
")
1079
SET(SOURCE_FILE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_crypto_win.c")
1080
1081
FILE(WRITE "${SOURCE_FILE}" "${SOURCE}")
1082
MESSAGE(STATUS "Checking support for ARCHIVE_CRYPTO_${CRYPTO}_WIN")
1083
1084
TRY_COMPILE(ARCHIVE_CRYPTO_${CRYPTO}_WIN
1085
${CMAKE_BINARY_DIR}
1086
${SOURCE_FILE}
1087
CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}/libarchive"
1088
OUTPUT_VARIABLE OUTPUT)
1089
1090
IF (ARCHIVE_CRYPTO_${CRYPTO}_WIN)
1091
MESSAGE(STATUS
1092
"Checking support for ARCHIVE_CRYPTO_${CRYPTO}_WIN -- found")
1093
SET(ARCHIVE_CRYPTO_${CRYPTO} 1)
1094
ELSE (ARCHIVE_CRYPTO_${CRYPTO}_WIN)
1095
MESSAGE(STATUS
1096
"Checking support for ARCHIVE_CRYPTO_${CRYPTO}_WIN -- not found")
1097
FILE(APPEND
1098
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
1099
"Checking support for ARCHIVE_CRYPTO_${CRYPTO}_WIN failed with the following output:\n"
1100
"${OUTPUT}\n"
1101
"Source file was:\n${SOURCE}\n")
1102
ENDIF (ARCHIVE_CRYPTO_${CRYPTO}_WIN)
1103
ENDIF(NOT DEFINED ARCHIVE_CRYPTO_${CRYPTO}_WIN)
1104
ENDIF(NOT ARCHIVE_CRYPTO_${CRYPTO})
1105
ENDFOREACH(CRYPTO)
1106
ENDIF(WIN32 AND NOT CYGWIN)
1107
ENDMACRO(CHECK_CRYPTO_WIN CRYPTO_LIST)
1108
1109
#
1110
# Find iconv
1111
# POSIX defines the second arg as const char **
1112
# and requires it to be in libc. But we can accept
1113
# a non-const argument here and can support iconv()
1114
# being in libiconv.
1115
#
1116
MACRO(CHECK_ICONV LIB TRY_ICONV_CONST)
1117
IF(NOT HAVE_ICONV)
1118
CMAKE_PUSH_CHECK_STATE() # Save the state of the variables
1119
IF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR CMAKE_C_COMPILER_ID MATCHES "^LCC$" OR
1120
CMAKE_C_COMPILER_ID MATCHES "^Clang$")
1121
#
1122
# During checking iconv proto type, we should use -Werror to avoid the
1123
# success of iconv detection with a warning, which would be a false
1124
# positive. So this is needed for all build modes, even in release mode.
1125
#
1126
SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Werror")
1127
ENDIF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR CMAKE_C_COMPILER_ID MATCHES "^LCC$" OR
1128
CMAKE_C_COMPILER_ID MATCHES "^Clang$")
1129
IF (CMAKE_C_COMPILER_ID MATCHES "^XL$")
1130
SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -qhalt=w -qflag=w:w")
1131
ENDIF (CMAKE_C_COMPILER_ID MATCHES "^XL$")
1132
IF (MSVC)
1133
# NOTE: /WX option is the same as gcc's -Werror option.
1134
SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} /WX")
1135
ENDIF (MSVC)
1136
#
1137
CHECK_C_SOURCE_COMPILES(
1138
"#include <stdlib.h>
1139
#include <iconv.h>
1140
int main() {
1141
${TRY_ICONV_CONST} char *ccp;
1142
iconv_t cd = iconv_open(\"\", \"\");
1143
iconv(cd, &ccp, (size_t *)0, (char **)0, (size_t *)0);
1144
iconv_close(cd);
1145
return 0;
1146
}"
1147
HAVE_ICONV_${LIB}_${TRY_ICONV_CONST})
1148
IF(HAVE_ICONV_${LIB}_${TRY_ICONV_CONST})
1149
SET(HAVE_ICONV true)
1150
SET(ICONV_CONST ${TRY_ICONV_CONST})
1151
ENDIF(HAVE_ICONV_${LIB}_${TRY_ICONV_CONST})
1152
CMAKE_POP_CHECK_STATE() # Restore the state of the variables
1153
ENDIF(NOT HAVE_ICONV)
1154
ENDMACRO(CHECK_ICONV TRY_ICONV_CONST)
1155
1156
IF(ENABLE_ICONV)
1157
CMAKE_PUSH_CHECK_STATE() # Save the state of the variables
1158
FIND_PATH(ICONV_INCLUDE_DIR iconv.h)
1159
MARK_AS_ADVANCED(ICONV_INCLUDE_DIR)
1160
IF(ICONV_INCLUDE_DIR)
1161
#SET(INCLUDES ${INCLUDES} "iconv.h")
1162
SET(HAVE_ICONV_H 1)
1163
INCLUDE_DIRECTORIES(${ICONV_INCLUDE_DIR})
1164
SET(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR})
1165
CHECK_ICONV("libc" "const")
1166
CHECK_ICONV("libc" "")
1167
1168
# If iconv isn't in libc and we have a libiconv, try that.
1169
FIND_LIBRARY(LIBICONV_PATH NAMES iconv libiconv)
1170
IF(NOT HAVE_ICONV AND LIBICONV_PATH)
1171
LIST(APPEND CMAKE_REQUIRED_LIBRARIES ${LIBICONV_PATH})
1172
# Test if a macro is needed for the library.
1173
TRY_MACRO_FOR_LIBRARY(
1174
"${ICONV_INCLUDE_DIR}" "${LIBICONV_PATH}"
1175
COMPILES
1176
"#include <iconv.h>\nint main() {return iconv_close((iconv_t)0);}"
1177
"WITHOUT_LIBICONV_STATIC;LIBICONV_STATIC")
1178
IF(NOT WITHOUT_LIBICONV_STATIC AND LIBICONV_STATIC)
1179
ADD_DEFINITIONS(-DLIBICONV_STATIC)
1180
ENDIF(NOT WITHOUT_LIBICONV_STATIC AND LIBICONV_STATIC)
1181
#
1182
# Set up CMAKE_REQUIRED_* for CHECK_ICONV
1183
#
1184
SET(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR})
1185
SET(CMAKE_REQUIRED_LIBRARIES ${LIBICONV_PATH})
1186
IF(LIBICONV_STATIC)
1187
# LIBICONV_STATIC is necessary for the success of CHECK_ICONV
1188
# on Windows.
1189
SET(CMAKE_REQUIRED_DEFINITIONS "-DLIBICONV_STATIC")
1190
ELSE(LIBICONV_STATIC)
1191
SET(CMAKE_REQUIRED_DEFINITIONS)
1192
ENDIF(LIBICONV_STATIC)
1193
CHECK_ICONV("libiconv" "const")
1194
CHECK_ICONV("libiconv" "")
1195
IF (HAVE_ICONV)
1196
SET(HAVE_LIBICONV 1)
1197
LIST(APPEND ADDITIONAL_LIBS ${LIBICONV_PATH})
1198
ENDIF(HAVE_ICONV)
1199
ENDIF(NOT HAVE_ICONV AND LIBICONV_PATH)
1200
ENDIF(ICONV_INCLUDE_DIR)
1201
#
1202
# Find locale_charset() for libiconv.
1203
#
1204
IF(LIBICONV_PATH)
1205
SET(CMAKE_REQUIRED_DEFINITIONS)
1206
SET(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR})
1207
SET(CMAKE_REQUIRED_LIBRARIES)
1208
CHECK_INCLUDE_FILES("localcharset.h" HAVE_LOCALCHARSET_H)
1209
FIND_LIBRARY(LIBCHARSET_PATH NAMES charset libcharset)
1210
IF(LIBCHARSET_PATH)
1211
SET(CMAKE_REQUIRED_LIBRARIES ${LIBCHARSET_PATH})
1212
IF(WIN32 AND NOT CYGWIN)
1213
# Test if a macro is needed for the library.
1214
TRY_MACRO_FOR_LIBRARY(
1215
"${ICONV_INCLUDE_DIR}" "${LIBCHARSET_PATH}"
1216
COMPILES
1217
"#include <localcharset.h>\nint main() {return locale_charset()?1:0;}"
1218
"WITHOUT_LIBCHARSET_STATIC;LIBCHARSET_STATIC")
1219
IF(NOT WITHOUT_LIBCHARSET_STATIC AND LIBCHARSET_STATIC)
1220
ADD_DEFINITIONS(-DLIBCHARSET_STATIC)
1221
ENDIF(NOT WITHOUT_LIBCHARSET_STATIC AND LIBCHARSET_STATIC)
1222
IF(WITHOUT_LIBCHARSET_STATIC OR LIBCHARSET_STATIC)
1223
SET(HAVE_LOCALE_CHARSET ON CACHE INTERNAL
1224
"Have function locale_charset")
1225
ENDIF(WITHOUT_LIBCHARSET_STATIC OR LIBCHARSET_STATIC)
1226
ELSE(WIN32 AND NOT CYGWIN)
1227
CHECK_FUNCTION_EXISTS_GLIBC(locale_charset HAVE_LOCALE_CHARSET)
1228
ENDIF(WIN32 AND NOT CYGWIN)
1229
IF(HAVE_LOCALE_CHARSET)
1230
LIST(APPEND ADDITIONAL_LIBS ${LIBCHARSET_PATH})
1231
ENDIF(HAVE_LOCALE_CHARSET)
1232
ENDIF(LIBCHARSET_PATH)
1233
ENDIF(LIBICONV_PATH)
1234
CMAKE_POP_CHECK_STATE() # Restore the state of the variables
1235
ELSE(ENABLE_ICONV)
1236
# Make sure ICONV variables are not in CACHE after ENABLE_ICONV disabled
1237
# (once enabled).
1238
UNSET(HAVE_LOCALE_CHARSET CACHE)
1239
UNSET(HAVE_ICONV CACHE)
1240
UNSET(HAVE_LIBICONV CACHE)
1241
UNSET(HAVE_ICONV_libc_ CACHE)
1242
UNSET(HAVE_ICONV_libc_const CACHE)
1243
UNSET(HAVE_ICONV_libiconv_ CACHE)
1244
UNSET(HAVE_ICONV_libiconv_const CACHE)
1245
UNSET(ICONV_INCLUDE_DIR CACHE)
1246
UNSET(LIBICONV_PATH CACHE)
1247
UNSET(LIBICONV_DLL CACHE)
1248
UNSET(LIBICONV_STATIC CACHE)
1249
UNSET(LIBCHARSET_DLL CACHE)
1250
UNSET(LIBCHARSET_STATIC CACHE)
1251
ENDIF(ENABLE_ICONV)
1252
1253
#
1254
# Find Libxml2
1255
#
1256
IF(ENABLE_LIBXML2 AND HAVE_ICONV)
1257
FIND_PACKAGE(LibXml2)
1258
ELSE()
1259
SET(LIBXML2_FOUND FALSE)
1260
ENDIF()
1261
IF(LIBXML2_FOUND)
1262
CMAKE_PUSH_CHECK_STATE() # Save the state of the variables
1263
INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR})
1264
LIST(APPEND ADDITIONAL_LIBS ${LIBXML2_LIBRARIES})
1265
SET(HAVE_LIBXML2 1)
1266
# libxml2's include files use iconv.h
1267
SET(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR} ${LIBXML2_INCLUDE_DIR})
1268
CHECK_INCLUDE_FILES("libxml/xmlreader.h" HAVE_LIBXML_XMLREADER_H)
1269
CHECK_INCLUDE_FILES("libxml/xmlwriter.h" HAVE_LIBXML_XMLWRITER_H)
1270
CHECK_INCLUDE_FILES("libxml/xmlversion.h" HAVE_LIBXML_XMLVERSION_H)
1271
# Test if a macro is needed for the library.
1272
TRY_MACRO_FOR_LIBRARY(
1273
"${ICONV_INCLUDE_DIR};${LIBXML2_INCLUDE_DIR}"
1274
"ws2_32.lib;${ZLIB_LIBRARIES};${LIBICONV_PATH};${LIBXML2_LIBRARIES}"
1275
COMPILES
1276
"#include <stddef.h>\n#include <libxml/xmlreader.h>\nint main() {return xmlTextReaderRead((xmlTextReaderPtr)(void *)0);}"
1277
"WITHOUT_LIBXML_STATIC;LIBXML_STATIC")
1278
IF(NOT WITHOUT_LIBXML_STATIC AND LIBXML_STATIC)
1279
ADD_DEFINITIONS(-DLIBXML_STATIC)
1280
ENDIF(NOT WITHOUT_LIBXML_STATIC AND LIBXML_STATIC)
1281
CMAKE_POP_CHECK_STATE() # Restore the state of the variables
1282
ELSE(LIBXML2_FOUND)
1283
#
1284
# Find Expat
1285
#
1286
IF(ENABLE_EXPAT)
1287
FIND_PACKAGE(EXPAT)
1288
ELSE()
1289
SET(EXPAT_FOUND FALSE)
1290
ENDIF()
1291
IF(EXPAT_FOUND)
1292
CMAKE_PUSH_CHECK_STATE() # Save the state of the variables
1293
INCLUDE_DIRECTORIES(${EXPAT_INCLUDE_DIR})
1294
LIST(APPEND ADDITIONAL_LIBS ${EXPAT_LIBRARIES})
1295
SET(HAVE_LIBEXPAT 1)
1296
LA_CHECK_INCLUDE_FILE("expat.h" HAVE_EXPAT_H)
1297
CMAKE_POP_CHECK_STATE() # Restore the state of the variables
1298
ELSE(EXPAT_FOUND)
1299
IF(WIN32 AND ENABLE_WIN32_XMLLITE)
1300
# Check linkage as well; versions of mingw-w64 before v11.0.0
1301
# do not contain an import library for xmllite.
1302
cmake_push_check_state()
1303
SET(CMAKE_REQUIRED_LIBRARIES "xmllite" "uuid")
1304
check_c_source_compiles("
1305
#include <initguid.h>
1306
#include <xmllite.h>
1307
int main() {
1308
return CreateXmlReader(&IID_IXmlReader, NULL, NULL);
1309
}
1310
" HAVE_XMLLITE_H)
1311
cmake_pop_check_state()
1312
IF(HAVE_XMLLITE_H)
1313
SET(XMLLITE_FOUND TRUE)
1314
LIST(APPEND ADDITIONAL_LIBS "xmllite" "uuid")
1315
ENDIF()
1316
ENDIF()
1317
ENDIF(EXPAT_FOUND)
1318
ENDIF(LIBXML2_FOUND)
1319
1320
#
1321
# POSIX Regular Expression support
1322
#
1323
IF(POSIX_REGEX_LIB MATCHES "^(AUTO|LIBC|LIBREGEX)$")
1324
#
1325
# If PCREPOSIX is not found or not requested, try using regex
1326
# from libc or libregex
1327
#
1328
FIND_PATH(REGEX_INCLUDE_DIR regex.h)
1329
IF(REGEX_INCLUDE_DIR)
1330
CHECK_FUNCTION_EXISTS_GLIBC(regcomp HAVE_REGCOMP_LIBC)
1331
#
1332
# If libc does not provide regex, find libregex.
1333
#
1334
IF(NOT HAVE_REGCOMP_LIBC)
1335
CMAKE_PUSH_CHECK_STATE() # Save the state of the variables
1336
FIND_LIBRARY(REGEX_LIBRARY regex)
1337
IF(REGEX_LIBRARY)
1338
SET(CMAKE_REQUIRED_LIBRARIES ${REGEX_LIBRARY})
1339
CHECK_FUNCTION_EXISTS_GLIBC(regcomp HAVE_REGCOMP_LIBREGEX)
1340
IF(HAVE_REGCOMP_LIBREGEX)
1341
LIST(APPEND ADDITIONAL_LIBS ${REGEX_LIBRARY})
1342
#
1343
# If regex.h is not found, retry looking for regex.h at
1344
# REGEX_INCLUDE_DIR
1345
#
1346
IF(NOT HAVE_REGEX_H)
1347
UNSET(HAVE_REGEX_H CACHE)
1348
INCLUDE_DIRECTORIES(${REGEX_INCLUDE_DIR})
1349
SET(CMAKE_REQUIRED_INCLUDES ${REGEX_INCLUDE_DIR})
1350
LA_CHECK_INCLUDE_FILE("regex.h" HAVE_REGEX_H)
1351
ENDIF(NOT HAVE_REGEX_H)
1352
# Test if a macro is needed for the library.
1353
TRY_MACRO_FOR_LIBRARY(
1354
"${REGEX_INCLUDE_DIR}" "${REGEX_LIBRARY}"
1355
COMPILES
1356
"#include <stddef.h>\n#include <regex.h>\nint main() {regex_t r;return regcomp(&r, \"\", 0);}"
1357
"USE_REGEX_DLL;USE_REGEX_STATIC")
1358
IF(USE_REGEX_DLL)
1359
ADD_DEFINITIONS(-DUSE_REGEX_DLL)
1360
ELSEIF(USE_REGEX_STATIC)
1361
ADD_DEFINITIONS(-DUSE_REGEX_STATIC)
1362
ENDIF(USE_REGEX_DLL)
1363
ENDIF(HAVE_REGCOMP_LIBREGEX)
1364
ENDIF(REGEX_LIBRARY)
1365
CMAKE_POP_CHECK_STATE() # Restore the state of the variables
1366
ENDIF(NOT HAVE_REGCOMP_LIBC)
1367
ENDIF(REGEX_INCLUDE_DIR)
1368
IF(HAVE_REGCOMP_LIBC OR HAVE_REGCOMP_LIBREGEX)
1369
SET(FOUND_POSIX_REGEX_LIB 1)
1370
ENDIF(HAVE_REGCOMP_LIBC OR HAVE_REGCOMP_LIBREGEX)
1371
ENDIF(POSIX_REGEX_LIB MATCHES "^(AUTO|LIBC|LIBREGEX)$")
1372
1373
IF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCREPOSIX)$")
1374
#
1375
# If requested, try finding library for PCREPOSIX
1376
#
1377
IF(ENABLE_LIBGCC)
1378
FIND_PACKAGE(LIBGCC)
1379
ELSE()
1380
MESSAGE(FATAL_ERROR "libgcc not found.")
1381
SET(LIBGCC_FOUND FALSE) # Override cached value
1382
ENDIF()
1383
IF(ENABLE_PCREPOSIX)
1384
FIND_PACKAGE(PCREPOSIX)
1385
ELSE()
1386
SET(PCREPOSIX_FOUND FALSE) # Override cached value
1387
ENDIF()
1388
IF(PCREPOSIX_FOUND)
1389
INCLUDE_DIRECTORIES(${PCRE_INCLUDE_DIR})
1390
LIST(APPEND ADDITIONAL_LIBS ${PCREPOSIX_LIBRARIES})
1391
# Test if a macro is needed for the library.
1392
TRY_MACRO_FOR_LIBRARY(
1393
"${PCRE_INCLUDE_DIR}" "${PCREPOSIX_LIBRARIES}"
1394
COMPILES
1395
"#include <pcreposix.h>\nint main() {regex_t r;return regcomp(&r, \"\", 0);}"
1396
"WITHOUT_PCRE_STATIC;PCRE_STATIC")
1397
IF(NOT WITHOUT_PCRE_STATIC AND PCRE_STATIC)
1398
ADD_DEFINITIONS(-DPCRE_STATIC)
1399
ELSEIF(NOT WITHOUT_PCRE_STATIC AND NOT PCRE_STATIC AND PCRE_FOUND)
1400
# Determine if pcre static libraries are to be used.
1401
LIST(APPEND ADDITIONAL_LIBS ${PCRE_LIBRARIES})
1402
SET(TMP_LIBRARIES ${PCREPOSIX_LIBRARIES} ${PCRE_LIBRARIES})
1403
MESSAGE(STATUS "trying again with -lpcre included")
1404
TRY_MACRO_FOR_LIBRARY(
1405
"${PCRE_INCLUDE_DIR}" "${TMP_LIBRARIES}"
1406
COMPILES
1407
"#include <pcreposix.h>\nint main() {regex_t r;return regcomp(&r, \"\", 0);}"
1408
"WITHOUT_PCRE_STATIC;PCRE_STATIC")
1409
IF(NOT WITHOUT_PCRE_STATIC AND PCRE_STATIC)
1410
ADD_DEFINITIONS(-DPCRE_STATIC)
1411
ELSEIF(NOT WITHOUT_PCRE_STATIC AND NOT PCRE_STATIC AND MSVC AND LIBGCC_FOUND)
1412
# When doing a Visual Studio build using pcre static libraries
1413
# built using the mingw toolchain, -lgcc is needed to resolve
1414
# ___chkstk_ms.
1415
MESSAGE(STATUS "Visual Studio build detected, trying again with -lgcc included")
1416
LIST(APPEND ADDITIONAL_LIBS ${LIBGCC_LIBRARIES})
1417
SET(TMP_LIBRARIES ${PCREPOSIX_LIBRARIES} ${PCRE_LIBRARIES} ${LIBGCC_LIBRARIES})
1418
TRY_MACRO_FOR_LIBRARY(
1419
"${PCRE_INCLUDE_DIR}" "${TMP_LIBRARIES}"
1420
COMPILES
1421
"#include <pcreposix.h>\nint main() {regex_t r;return regcomp(&r, \"\", 0);}"
1422
"WITHOUT_PCRE_STATIC;PCRE_STATIC")
1423
IF(NOT WITHOUT_PCRE_STATIC AND PCRE_STATIC)
1424
ADD_DEFINITIONS(-DPCRE_STATIC)
1425
ENDIF(NOT WITHOUT_PCRE_STATIC AND PCRE_STATIC)
1426
ENDIF(NOT WITHOUT_PCRE_STATIC AND PCRE_STATIC)
1427
ENDIF(NOT WITHOUT_PCRE_STATIC AND PCRE_STATIC)
1428
ENDIF(PCREPOSIX_FOUND)
1429
MARK_AS_ADVANCED(CLEAR PCRE_INCLUDE_DIR)
1430
MARK_AS_ADVANCED(CLEAR PCREPOSIX_LIBRARIES)
1431
MARK_AS_ADVANCED(CLEAR PCRE_LIBRARIES)
1432
MARK_AS_ADVANCED(CLEAR LIBGCC_LIBRARIES)
1433
ENDIF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCREPOSIX)$")
1434
1435
IF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCRE2POSIX)$")
1436
#
1437
# If requested, try finding library for PCRE2POSIX
1438
#
1439
IF(ENABLE_LIBGCC)
1440
FIND_PACKAGE(LIBGCC)
1441
ELSE()
1442
MESSAGE(FATAL_ERROR "libgcc not found.")
1443
SET(LIBGCC_FOUND FALSE) # Override cached value
1444
ENDIF()
1445
IF(ENABLE_PCRE2POSIX)
1446
FIND_PACKAGE(PCRE2POSIX)
1447
ELSE()
1448
SET(PCRE2POSIX_FOUND FALSE) # Override cached value
1449
ENDIF()
1450
IF(PCRE2POSIX_FOUND)
1451
INCLUDE_DIRECTORIES(${PCRE2_INCLUDE_DIR})
1452
LIST(APPEND ADDITIONAL_LIBS ${PCRE2POSIX_LIBRARIES})
1453
# Test if a macro is needed for the library.
1454
TRY_MACRO_FOR_LIBRARY(
1455
"${PCRE2_INCLUDE_DIR}" "${PCRE2POSIX_LIBRARIES}"
1456
COMPILES
1457
"#include <pcre2posix.h>\nint main() {regex_t r;return pcre2_regcomp(&r, \"\", 0);}"
1458
"WITHOUT_PCRE2_STATIC;PCRE2_STATIC")
1459
IF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC)
1460
ADD_DEFINITIONS(-DPCRE2_STATIC)
1461
ELSEIF(NOT WITHOUT_PCRE2_STATIC AND NOT PCRE2_STATIC AND PCRE2_FOUND)
1462
# Determine if pcre2 static libraries are to be used.
1463
LIST(APPEND ADDITIONAL_LIBS ${PCRE2_LIBRARIES})
1464
SET(TMP_LIBRARIES ${PCRE2POSIX_LIBRARIES} ${PCRE2_LIBRARIES})
1465
MESSAGE(STATUS "trying again with -lpcre2-8 included")
1466
TRY_MACRO_FOR_LIBRARY(
1467
"${PCRE2_INCLUDE_DIR}" "${TMP_LIBRARIES}"
1468
COMPILES
1469
"#include <pcre2posix.h>\nint main() {regex_t r;return pcre2_regcomp(&r, \"\", 0);}"
1470
"WITHOUT_PCRE2_STATIC;PCRE2_STATIC")
1471
IF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC)
1472
ADD_DEFINITIONS(-DPCRE2_STATIC)
1473
ELSEIF(NOT WITHOUT_PCRE2_STATIC AND NOT PCRE2_STATIC AND MSVC AND LIBGCC_FOUND)
1474
# When doing a Visual Studio build using pcre2 static libraries
1475
# built using the mingw toolchain, -lgcc is needed to resolve
1476
# ___chkstk_ms.
1477
MESSAGE(STATUS "Visual Studio build detected, trying again with -lgcc included")
1478
LIST(APPEND ADDITIONAL_LIBS ${LIBGCC_LIBRARIES})
1479
SET(TMP_LIBRARIES ${PCRE2POSIX_LIBRARIES} ${PCRE2_LIBRARIES} ${LIBGCC_LIBRARIES})
1480
TRY_MACRO_FOR_LIBRARY(
1481
"${PCRE2_INCLUDE_DIR}" "${TMP_LIBRARIES}"
1482
COMPILES
1483
"#include <pcre2posix.h>\nint main() {regex_t r;return pcre2_regcomp(&r, \"\", 0);}"
1484
"WITHOUT_PCRE2_STATIC;PCRE2_STATIC")
1485
IF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC)
1486
ADD_DEFINITIONS(-DPCRE2_STATIC)
1487
ENDIF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC)
1488
ENDIF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC)
1489
ENDIF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC)
1490
ENDIF(PCRE2POSIX_FOUND)
1491
MARK_AS_ADVANCED(CLEAR PCRE2_INCLUDE_DIR)
1492
MARK_AS_ADVANCED(CLEAR PCRE2POSIX_LIBRARIES)
1493
MARK_AS_ADVANCED(CLEAR PCRE2_LIBRARIES)
1494
MARK_AS_ADVANCED(CLEAR LIBGCC_LIBRARIES)
1495
ENDIF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCRE2POSIX)$")
1496
1497
#
1498
# Check functions
1499
#
1500
CMAKE_PUSH_CHECK_STATE() # Save the state of the variables
1501
IF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR CMAKE_C_COMPILER_ID MATCHES "^LCC$" OR
1502
CMAKE_C_COMPILER_ID MATCHES "^Clang$")
1503
#
1504
# During checking functions, we should use -fno-builtin to avoid the
1505
# failure of function detection which failure is an error "conflicting
1506
# types for built-in function" caused by using -Werror option.
1507
#
1508
SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fno-builtin")
1509
ENDIF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR CMAKE_C_COMPILER_ID MATCHES "^LCC$" OR
1510
CMAKE_C_COMPILER_ID MATCHES "^Clang$")
1511
CHECK_SYMBOL_EXISTS(_CrtSetReportMode "crtdbg.h" HAVE__CrtSetReportMode)
1512
CHECK_FUNCTION_EXISTS_GLIBC(arc4random_buf HAVE_ARC4RANDOM_BUF)
1513
CHECK_FUNCTION_EXISTS_GLIBC(chflags HAVE_CHFLAGS)
1514
CHECK_FUNCTION_EXISTS_GLIBC(chown HAVE_CHOWN)
1515
CHECK_FUNCTION_EXISTS_GLIBC(chroot HAVE_CHROOT)
1516
CHECK_FUNCTION_EXISTS_GLIBC(closefrom HAVE_CLOSEFROM)
1517
CHECK_FUNCTION_EXISTS_GLIBC(close_range HAVE_CLOSE_RANGE)
1518
CHECK_FUNCTION_EXISTS_GLIBC(ctime_r HAVE_CTIME_R)
1519
CHECK_FUNCTION_EXISTS_GLIBC(fchdir HAVE_FCHDIR)
1520
CHECK_FUNCTION_EXISTS_GLIBC(fchflags HAVE_FCHFLAGS)
1521
CHECK_FUNCTION_EXISTS_GLIBC(fchmod HAVE_FCHMOD)
1522
CHECK_FUNCTION_EXISTS_GLIBC(fchown HAVE_FCHOWN)
1523
CHECK_FUNCTION_EXISTS_GLIBC(fcntl HAVE_FCNTL)
1524
CHECK_FUNCTION_EXISTS_GLIBC(fdopendir HAVE_FDOPENDIR)
1525
CHECK_FUNCTION_EXISTS_GLIBC(fnmatch HAVE_FNMATCH)
1526
CHECK_FUNCTION_EXISTS_GLIBC(fork HAVE_FORK)
1527
CHECK_FUNCTION_EXISTS_GLIBC(fstat HAVE_FSTAT)
1528
CHECK_FUNCTION_EXISTS_GLIBC(fstatat HAVE_FSTATAT)
1529
CHECK_FUNCTION_EXISTS_GLIBC(fstatfs HAVE_FSTATFS)
1530
CHECK_FUNCTION_EXISTS_GLIBC(fstatvfs HAVE_FSTATVFS)
1531
CHECK_FUNCTION_EXISTS_GLIBC(ftruncate HAVE_FTRUNCATE)
1532
CHECK_FUNCTION_EXISTS_GLIBC(futimens HAVE_FUTIMENS)
1533
CHECK_FUNCTION_EXISTS_GLIBC(futimes HAVE_FUTIMES)
1534
CHECK_FUNCTION_EXISTS_GLIBC(futimesat HAVE_FUTIMESAT)
1535
CHECK_FUNCTION_EXISTS_GLIBC(getegid HAVE_GETEGID)
1536
CHECK_FUNCTION_EXISTS_GLIBC(geteuid HAVE_GETEUID)
1537
CHECK_FUNCTION_EXISTS_GLIBC(getgrgid_r HAVE_GETGRGID_R)
1538
CHECK_FUNCTION_EXISTS_GLIBC(getgrnam_r HAVE_GETGRNAM_R)
1539
CHECK_FUNCTION_EXISTS_GLIBC(getline HAVE_GETLINE)
1540
CHECK_FUNCTION_EXISTS_GLIBC(getpid HAVE_GETPID)
1541
CHECK_FUNCTION_EXISTS_GLIBC(getpwnam_r HAVE_GETPWNAM_R)
1542
CHECK_FUNCTION_EXISTS_GLIBC(getpwuid_r HAVE_GETPWUID_R)
1543
CHECK_FUNCTION_EXISTS_GLIBC(getresgid HAVE_GETRESGID)
1544
CHECK_FUNCTION_EXISTS_GLIBC(getresuid HAVE_GETRESUID)
1545
CHECK_FUNCTION_EXISTS_GLIBC(getvfsbyname HAVE_GETVFSBYNAME)
1546
CHECK_FUNCTION_EXISTS_GLIBC(gmtime_r HAVE_GMTIME_R)
1547
CHECK_FUNCTION_EXISTS_GLIBC(issetugid HAVE_ISSETUGID)
1548
CHECK_FUNCTION_EXISTS_GLIBC(lchflags HAVE_LCHFLAGS)
1549
if(NOT CMAKE_C_COMPILER_ID STREQUAL "LCC" OR NOT CMAKE_C_COMPILER_VERSION VERSION_LESS_EQUAL "1.23")
1550
CHECK_FUNCTION_EXISTS_GLIBC(lchmod HAVE_LCHMOD)
1551
endif()
1552
CHECK_FUNCTION_EXISTS_GLIBC(lchown HAVE_LCHOWN)
1553
CHECK_FUNCTION_EXISTS_GLIBC(link HAVE_LINK)
1554
CHECK_FUNCTION_EXISTS_GLIBC(linkat HAVE_LINKAT)
1555
CHECK_FUNCTION_EXISTS_GLIBC(localtime_r HAVE_LOCALTIME_R)
1556
CHECK_FUNCTION_EXISTS_GLIBC(lstat HAVE_LSTAT)
1557
CHECK_FUNCTION_EXISTS_GLIBC(lutimes HAVE_LUTIMES)
1558
CHECK_FUNCTION_EXISTS_GLIBC(mbrtowc HAVE_MBRTOWC)
1559
CHECK_FUNCTION_EXISTS_GLIBC(memmove HAVE_MEMMOVE)
1560
CHECK_FUNCTION_EXISTS_GLIBC(mkdir HAVE_MKDIR)
1561
CHECK_FUNCTION_EXISTS_GLIBC(mkfifo HAVE_MKFIFO)
1562
CHECK_FUNCTION_EXISTS_GLIBC(mknod HAVE_MKNOD)
1563
CHECK_FUNCTION_EXISTS_GLIBC(mkstemp HAVE_MKSTEMP)
1564
CHECK_FUNCTION_EXISTS_GLIBC(nl_langinfo HAVE_NL_LANGINFO)
1565
CHECK_FUNCTION_EXISTS_GLIBC(openat HAVE_OPENAT)
1566
CHECK_FUNCTION_EXISTS_GLIBC(pipe HAVE_PIPE)
1567
CHECK_FUNCTION_EXISTS_GLIBC(poll HAVE_POLL)
1568
CHECK_FUNCTION_EXISTS_GLIBC(posix_spawn HAVE_POSIX_SPAWN)
1569
CHECK_FUNCTION_EXISTS_GLIBC(posix_spawnp HAVE_POSIX_SPAWNP)
1570
CHECK_FUNCTION_EXISTS_GLIBC(readlink HAVE_READLINK)
1571
CHECK_FUNCTION_EXISTS_GLIBC(readpassphrase HAVE_READPASSPHRASE)
1572
CHECK_FUNCTION_EXISTS_GLIBC(select HAVE_SELECT)
1573
CHECK_FUNCTION_EXISTS_GLIBC(setenv HAVE_SETENV)
1574
CHECK_FUNCTION_EXISTS_GLIBC(setlocale HAVE_SETLOCALE)
1575
CHECK_FUNCTION_EXISTS_GLIBC(sigaction HAVE_SIGACTION)
1576
CHECK_FUNCTION_EXISTS_GLIBC(statfs HAVE_STATFS)
1577
CHECK_FUNCTION_EXISTS_GLIBC(statvfs HAVE_STATVFS)
1578
CHECK_FUNCTION_EXISTS_GLIBC(strchr HAVE_STRCHR)
1579
CHECK_FUNCTION_EXISTS_GLIBC(strdup HAVE_STRDUP)
1580
CHECK_FUNCTION_EXISTS_GLIBC(strerror HAVE_STRERROR)
1581
CHECK_FUNCTION_EXISTS_GLIBC(strncpy_s HAVE_STRNCPY_S)
1582
CHECK_FUNCTION_EXISTS_GLIBC(strnlen HAVE_STRNLEN)
1583
CHECK_FUNCTION_EXISTS_GLIBC(strrchr HAVE_STRRCHR)
1584
CHECK_FUNCTION_EXISTS_GLIBC(symlink HAVE_SYMLINK)
1585
CHECK_FUNCTION_EXISTS_GLIBC(sysconf HAVE_SYSCONF)
1586
CHECK_FUNCTION_EXISTS_GLIBC(tcgetattr HAVE_TCGETATTR)
1587
CHECK_FUNCTION_EXISTS_GLIBC(tcsetattr HAVE_TCSETATTR)
1588
CHECK_FUNCTION_EXISTS_GLIBC(timegm HAVE_TIMEGM)
1589
CHECK_FUNCTION_EXISTS_GLIBC(tzset HAVE_TZSET)
1590
CHECK_FUNCTION_EXISTS_GLIBC(unlinkat HAVE_UNLINKAT)
1591
CHECK_FUNCTION_EXISTS_GLIBC(unsetenv HAVE_UNSETENV)
1592
CHECK_FUNCTION_EXISTS_GLIBC(utime HAVE_UTIME)
1593
CHECK_FUNCTION_EXISTS_GLIBC(utimes HAVE_UTIMES)
1594
CHECK_FUNCTION_EXISTS_GLIBC(utimensat HAVE_UTIMENSAT)
1595
CHECK_FUNCTION_EXISTS_GLIBC(vfork HAVE_VFORK)
1596
CHECK_FUNCTION_EXISTS_GLIBC(wcrtomb HAVE_WCRTOMB)
1597
check_symbol_exists(wcscmp wchar.h HAVE_WCSCMP)
1598
check_symbol_exists(wcscpy wchar.h HAVE_WCSCPY)
1599
check_symbol_exists(wcslen wchar.h HAVE_WCSLEN)
1600
CHECK_FUNCTION_EXISTS_GLIBC(wctomb HAVE_WCTOMB)
1601
CHECK_FUNCTION_EXISTS_GLIBC(_fseeki64 HAVE__FSEEKI64)
1602
CHECK_FUNCTION_EXISTS_GLIBC(_get_timezone HAVE__GET_TIMEZONE)
1603
CHECK_SYMBOL_EXISTS(ctime_s "time.h" HAVE_CTIME_S)
1604
CHECK_SYMBOL_EXISTS(gmtime_s "time.h" HAVE_GMTIME_S)
1605
CHECK_SYMBOL_EXISTS(localtime_s "time.h" HAVE_LOCALTIME_S)
1606
CHECK_SYMBOL_EXISTS(_mkgmtime "time.h" HAVE__MKGMTIME)
1607
1608
SET(CMAKE_REQUIRED_LIBRARIES "")
1609
CHECK_FUNCTION_EXISTS(cygwin_conv_path HAVE_CYGWIN_CONV_PATH)
1610
CHECK_FUNCTION_EXISTS(fseeko HAVE_FSEEKO)
1611
CHECK_FUNCTION_EXISTS(strerror_r HAVE_STRERROR_R)
1612
CHECK_FUNCTION_EXISTS(strftime HAVE_STRFTIME)
1613
CHECK_FUNCTION_EXISTS(vprintf HAVE_VPRINTF)
1614
CHECK_FUNCTION_EXISTS(wmemcmp HAVE_WMEMCMP)
1615
CHECK_FUNCTION_EXISTS(wmemcpy HAVE_WMEMCPY)
1616
CHECK_FUNCTION_EXISTS(wmemmove HAVE_WMEMMOVE)
1617
1618
CMAKE_POP_CHECK_STATE() # Restore the state of the variables
1619
1620
CHECK_C_SOURCE_COMPILES(
1621
"#include <sys/types.h>\n#include <sys/mount.h>\nint main(void) { struct vfsconf v; return sizeof(v);}"
1622
HAVE_STRUCT_VFSCONF)
1623
1624
CHECK_C_SOURCE_COMPILES(
1625
"#include <sys/types.h>\n#include <sys/mount.h>\nint main(void) { struct xvfsconf v; return sizeof(v);}"
1626
HAVE_STRUCT_XVFSCONF)
1627
1628
CHECK_C_SOURCE_COMPILES(
1629
"#include <sys/types.h>\n#include <sys/mount.h>\nint main(void) { struct statfs s; return sizeof(s);}"
1630
HAVE_STRUCT_STATFS)
1631
1632
# dirfd can be either a function or a macro.
1633
CHECK_C_SOURCE_COMPILES(
1634
"#include <dirent.h>\nint main() {DIR *d = opendir(\".\"); return dirfd(d);}"
1635
HAVE_DIRFD)
1636
1637
# Only detect readlinkat() if we also have AT_FDCWD in unistd.h.
1638
# NOTE: linux requires fcntl.h for AT_FDCWD.
1639
CHECK_C_SOURCE_COMPILES(
1640
"#include <fcntl.h>\n#include <unistd.h>\nint main() {char buf[10]; return readlinkat(AT_FDCWD, \"\", buf, 0);}"
1641
HAVE_READLINKAT)
1642
1643
# To verify major(), we need to both include the header
1644
# of interest and verify that the result can be linked.
1645
# CHECK_FUNCTION_EXISTS doesn't accept a header argument,
1646
# CHECK_SYMBOL_EXISTS doesn't test linkage.
1647
CHECK_C_SOURCE_COMPILES(
1648
"#include <sys/mkdev.h>\nint main() { return major(256); }"
1649
MAJOR_IN_MKDEV)
1650
CHECK_C_SOURCE_COMPILES(
1651
"#include <sys/sysmacros.h>\nint main() { return major(256); }"
1652
MAJOR_IN_SYSMACROS)
1653
1654
IF(HAVE_STRERROR_R)
1655
SET(HAVE_DECL_STRERROR_R 1)
1656
ENDIF(HAVE_STRERROR_R)
1657
1658
#
1659
# Check defines
1660
#
1661
CHECK_SYMBOL_EXISTS(EFTYPE "errno.h" HAVE_EFTYPE)
1662
CHECK_SYMBOL_EXISTS(EILSEQ "errno.h" HAVE_EILSEQ)
1663
CHECK_SYMBOL_EXISTS(D_MD_ORDER "langinfo.h" HAVE_D_MD_ORDER)
1664
1665
#
1666
# Check struct members
1667
#
1668
# Check for tm_gmtoff in struct tm
1669
CHECK_STRUCT_HAS_MEMBER("struct tm" tm_gmtoff
1670
"time.h" HAVE_STRUCT_TM_TM_GMTOFF)
1671
CHECK_STRUCT_HAS_MEMBER("struct tm" __tm_gmtoff
1672
"time.h" HAVE_STRUCT_TM___TM_GMTOFF)
1673
1674
IF(HAVE_STRUCT_STATFS)
1675
# Check for f_namemax in struct statfs
1676
CHECK_STRUCT_HAS_MEMBER("struct statfs" f_namemax
1677
"sys/param.h;sys/mount.h" HAVE_STRUCT_STATFS_F_NAMEMAX)
1678
# Check for f_iosize in struct statfs
1679
CHECK_STRUCT_HAS_MEMBER("struct statfs" f_iosize
1680
"sys/param.h;sys/mount.h" HAVE_STRUCT_STATFS_F_IOSIZE)
1681
ENDIF(HAVE_STRUCT_STATFS)
1682
1683
# Check for birthtime in struct stat
1684
CHECK_STRUCT_HAS_MEMBER("struct stat" st_birthtime
1685
"sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_BIRTHTIME)
1686
1687
# Check for high-resolution timestamps in struct stat
1688
CHECK_STRUCT_HAS_MEMBER("struct stat" st_birthtimespec.tv_nsec
1689
"sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC)
1690
CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtimespec.tv_nsec
1691
"sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC)
1692
CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtim.tv_nsec
1693
"sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC)
1694
CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtime_n
1695
"sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIME_N)
1696
CHECK_STRUCT_HAS_MEMBER("struct stat" st_umtime
1697
"sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_UMTIME)
1698
CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtime_usec
1699
"sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIME_USEC)
1700
# Check for block size support in struct stat
1701
CHECK_STRUCT_HAS_MEMBER("struct stat" st_blksize
1702
"sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_BLKSIZE)
1703
# Check for st_flags in struct stat (BSD fflags)
1704
CHECK_STRUCT_HAS_MEMBER("struct stat" st_flags
1705
"sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_FLAGS)
1706
1707
IF(HAVE_SYS_STATVFS_H)
1708
CHECK_STRUCT_HAS_MEMBER("struct statvfs" f_iosize
1709
"sys/types.h;sys/statvfs.h" HAVE_STRUCT_STATVFS_F_IOSIZE)
1710
ENDIF()
1711
1712
#
1713
#
1714
CHECK_STRUCT_HAS_MEMBER("struct tm" tm_sec
1715
"sys/types.h;sys/time.h;time.h" HAVE_SYS_TIME_H)
1716
1717
CHECK_TYPE_SIZE(dev_t DEV_T)
1718
IF(NOT HAVE_DEV_T)
1719
IF(MSVC)
1720
SET(dev_t "unsigned int")
1721
ENDIF(MSVC)
1722
ENDIF(NOT HAVE_DEV_T)
1723
#
1724
CHECK_TYPE_SIZE(gid_t GID_T)
1725
IF(NOT HAVE_GID_T)
1726
IF(WIN32)
1727
SET(gid_t "short")
1728
ELSE(WIN32)
1729
SET(gid_t "unsigned int")
1730
ENDIF(WIN32)
1731
ENDIF(NOT HAVE_GID_T)
1732
#
1733
CHECK_TYPE_SIZE(id_t ID_T)
1734
IF(NOT HAVE_ID_T)
1735
IF(WIN32)
1736
SET(id_t "short")
1737
ELSE(WIN32)
1738
SET(id_t "unsigned int")
1739
ENDIF(WIN32)
1740
ENDIF(NOT HAVE_ID_T)
1741
#
1742
CHECK_TYPE_SIZE(mode_t MODE_T)
1743
IF(NOT HAVE_MODE_T)
1744
IF(WIN32)
1745
SET(mode_t "unsigned short")
1746
ELSE(WIN32)
1747
SET(mode_t "int")
1748
ENDIF(WIN32)
1749
ENDIF(NOT HAVE_MODE_T)
1750
#
1751
CHECK_TYPE_SIZE(off_t OFF_T)
1752
IF(NOT HAVE_OFF_T)
1753
SET(off_t "__int64")
1754
ENDIF(NOT HAVE_OFF_T)
1755
#
1756
CHECK_TYPE_SIZE(size_t SIZE_T)
1757
IF(NOT HAVE_SIZE_T)
1758
IF("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
1759
SET(size_t "uint64_t")
1760
ELSE("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
1761
SET(size_t "uint32_t")
1762
ENDIF("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
1763
ENDIF(NOT HAVE_SIZE_T)
1764
#
1765
CHECK_TYPE_SIZE(ssize_t SSIZE_T)
1766
IF(NOT HAVE_SSIZE_T)
1767
IF("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
1768
SET(ssize_t "int64_t")
1769
ELSE("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
1770
SET(ssize_t "long")
1771
ENDIF("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
1772
ENDIF(NOT HAVE_SSIZE_T)
1773
#
1774
CHECK_TYPE_SIZE(uid_t UID_T)
1775
IF(NOT HAVE_UID_T)
1776
IF(WIN32)
1777
SET(uid_t "short")
1778
ELSE(WIN32)
1779
SET(uid_t "unsigned int")
1780
ENDIF(WIN32)
1781
ENDIF(NOT HAVE_UID_T)
1782
#
1783
CHECK_TYPE_SIZE(pid_t PID_T)
1784
IF(NOT HAVE_PID_T)
1785
IF(WIN32)
1786
SET(pid_t "int")
1787
ELSE(WIN32)
1788
MESSAGE(FATAL_ERROR "pid_t doesn't exist on this platform?")
1789
ENDIF(WIN32)
1790
ENDIF(NOT HAVE_PID_T)
1791
#
1792
CHECK_TYPE_SIZE(wchar_t SIZEOF_WCHAR_T)
1793
IF(HAVE_SIZEOF_WCHAR_T)
1794
SET(HAVE_WCHAR_T 1)
1795
ENDIF(HAVE_SIZEOF_WCHAR_T)
1796
#
1797
# Check if _FILE_OFFSET_BITS macro needed for large files
1798
#
1799
CHECK_FILE_OFFSET_BITS()
1800
1801
#
1802
# Check for Extended Attribute libraries, headers, and functions
1803
#
1804
IF(ENABLE_XATTR)
1805
CHECK_LIBRARY_EXISTS(attr "setxattr" "" HAVE_LIBATTR)
1806
IF(HAVE_LIBATTR)
1807
SET(CMAKE_REQUIRED_LIBRARIES "attr")
1808
pkg_check_modules(LIBATTR libattr)
1809
IF(LIBATTR_VERSION)
1810
SET(LIBATTR_PKGCONFIG_VERSION ${LIBATTR_VERSION})
1811
ENDIF(LIBATTR_VERSION)
1812
ELSE(HAVE_LIBATTR)
1813
CHECK_LIBRARY_EXISTS(gnu "setxattr" "" HAVE_LIBATTR_GNU)
1814
IF(HAVE_LIBATTR_GNU)
1815
SET(CMAKE_REQUIRED_LIBRARIES "gnu")
1816
ENDIF()
1817
UNSET(LIBATTR_PKGCONFIG_VERSION CACHE)
1818
ENDIF(HAVE_LIBATTR)
1819
CHECK_SYMBOL_EXISTS(EXTATTR_NAMESPACE_USER "sys/types.h;sys/extattr.h" HAVE_DECL_EXTATTR_NAMESPACE_USER)
1820
CHECK_SYMBOL_EXISTS(XATTR_NOFOLLOW "sys/xattr.h" HAVE_DECL_XATTR_NOFOLLOW)
1821
IF(HAVE_SYS_XATTR_H AND HAVE_DECL_XATTR_NOFOLLOW)
1822
CHECK_FUNCTION_EXISTS(fgetxattr HAVE_FGETXATTR)
1823
CHECK_FUNCTION_EXISTS(flistxattr HAVE_FLISTXATTR)
1824
CHECK_FUNCTION_EXISTS(fsetxattr HAVE_FSETXATTR)
1825
CHECK_FUNCTION_EXISTS(getxattr HAVE_GETXATTR)
1826
CHECK_FUNCTION_EXISTS(listxattr HAVE_LISTXATTR)
1827
CHECK_FUNCTION_EXISTS(setxattr HAVE_SETXATTR)
1828
IF(HAVE_FGETXATTR AND
1829
HAVE_FLISTXATTR AND
1830
HAVE_FSETXATTR AND
1831
HAVE_GETXATTR AND
1832
HAVE_LISTXATTR AND
1833
HAVE_SETXATTR)
1834
SET(ARCHIVE_XATTR_DARWIN TRUE)
1835
ENDIF()
1836
ELSEIF(HAVE_SYS_EXTATTR_H AND HAVE_DECL_EXTATTR_NAMESPACE_USER)
1837
# FreeBSD xattr support
1838
CHECK_FUNCTION_EXISTS(extattr_get_fd HAVE_EXTATTR_GET_FD)
1839
CHECK_FUNCTION_EXISTS(extattr_get_file HAVE_EXTATTR_GET_FILE)
1840
CHECK_FUNCTION_EXISTS(extattr_get_link HAVE_EXTATTR_GET_LINK)
1841
CHECK_FUNCTION_EXISTS(extattr_list_fd HAVE_EXTATTR_LIST_FD)
1842
CHECK_FUNCTION_EXISTS(extattr_list_file HAVE_EXTATTR_LIST_FILE)
1843
CHECK_FUNCTION_EXISTS(extattr_list_link HAVE_EXTATTR_LIST_LINK)
1844
CHECK_FUNCTION_EXISTS(extattr_set_fd HAVE_EXTATTR_SET_FD)
1845
CHECK_FUNCTION_EXISTS(extattr_set_link HAVE_EXTATTR_SET_LINK)
1846
IF(HAVE_EXTATTR_GET_FD AND
1847
HAVE_EXTATTR_GET_FILE AND
1848
HAVE_EXTATTR_GET_LINK AND
1849
HAVE_EXTATTR_LIST_FD AND
1850
HAVE_EXTATTR_LIST_FILE AND
1851
HAVE_EXTATTR_LIST_LINK AND
1852
HAVE_EXTATTR_SET_FD AND
1853
HAVE_EXTATTR_SET_LINK)
1854
SET(ARCHIVE_XATTR_FREEBSD TRUE)
1855
ENDIF()
1856
ELSEIF(HAVE_SYS_XATTR_H OR HAVE_ATTR_XATTR_H)
1857
# Linux xattr support
1858
CHECK_FUNCTION_EXISTS_GLIBC(fgetxattr HAVE_FGETXATTR)
1859
CHECK_FUNCTION_EXISTS_GLIBC(flistxattr HAVE_FLISTXATTR)
1860
CHECK_FUNCTION_EXISTS_GLIBC(fsetxattr HAVE_FSETXATTR)
1861
CHECK_FUNCTION_EXISTS_GLIBC(getxattr HAVE_GETXATTR)
1862
CHECK_FUNCTION_EXISTS_GLIBC(lgetxattr HAVE_LGETXATTR)
1863
CHECK_FUNCTION_EXISTS_GLIBC(listxattr HAVE_LISTXATTR)
1864
CHECK_FUNCTION_EXISTS_GLIBC(llistxattr HAVE_LLISTXATTR)
1865
CHECK_FUNCTION_EXISTS_GLIBC(lsetxattr HAVE_LSETXATTR)
1866
IF(HAVE_FGETXATTR AND
1867
HAVE_FLISTXATTR AND
1868
HAVE_FSETXATTR AND
1869
HAVE_GETXATTR AND
1870
HAVE_LGETXATTR AND
1871
HAVE_LISTXATTR AND
1872
HAVE_LLISTXATTR AND
1873
HAVE_LSETXATTR)
1874
SET(ARCHIVE_XATTR_LINUX TRUE)
1875
ENDIF()
1876
ELSEIF(HAVE_SYS_EA_H)
1877
# AIX xattr support
1878
CHECK_FUNCTION_EXISTS(fgetea HAVE_FGETEA)
1879
CHECK_FUNCTION_EXISTS(flistea HAVE_FLISTEA)
1880
CHECK_FUNCTION_EXISTS(fsetea HAVE_FSETEA)
1881
CHECK_FUNCTION_EXISTS(getea HAVE_GETEA)
1882
CHECK_FUNCTION_EXISTS(lgetea HAVE_LGETEA)
1883
CHECK_FUNCTION_EXISTS(listea HAVE_LISTEA)
1884
CHECK_FUNCTION_EXISTS(llistea HAVE_LLISTEA)
1885
CHECK_FUNCTION_EXISTS(lsetea HAVE_LSETEA)
1886
IF(HAVE_FGETEA AND
1887
HAVE_FLISTEA AND
1888
HAVE_FSETEA AND
1889
HAVE_GETEA AND
1890
HAVE_LGETEA AND
1891
HAVE_LISTEA AND
1892
HAVE_LLISTEA AND
1893
HAVE_LSETEA)
1894
SET(ARCHIVE_XATTR_AIX TRUE)
1895
ENDIF()
1896
ENDIF()
1897
1898
IF(ARCHIVE_XATTR_DARWIN)
1899
MESSAGE(STATUS "Extended attributes support: Darwin")
1900
ELSEIF(ARCHIVE_XATTR_FREEBSD)
1901
MESSAGE(STATUS "Extended attributes support: FreeBSD")
1902
ELSEIF(ARCHIVE_XATTR_LINUX)
1903
MESSAGE(STATUS "Extended attributes support: Linux")
1904
ELSEIF(ARCHIVE_XATTR_AIX)
1905
MESSAGE(STATUS "Extended attributes support: AIX")
1906
ELSE()
1907
MESSAGE(STATUS "Extended attributes support: none")
1908
ENDIF()
1909
ELSE(ENABLE_XATTR)
1910
SET(ARCHIVE_XATTR_DARWIN FALSE)
1911
SET(ARCHIVE_XATTR_FREEBSD FALSE)
1912
SET(ARCHIVE_XATTR_LINUX FALSE)
1913
SET(ARCHIVE_XATTR_AIX FALSE)
1914
ENDIF(ENABLE_XATTR)
1915
1916
#
1917
# Check for ACL libraries, headers, and functions
1918
#
1919
# The ACL support in libarchive is written against the POSIX1e draft,
1920
# which was never officially approved and varies quite a bit across
1921
# platforms. Worse, some systems have completely non-POSIX acl functions,
1922
# which makes the following checks rather more complex than I would like.
1923
#
1924
IF(ENABLE_ACL)
1925
# Solaris and derivates ACLs
1926
CHECK_FUNCTION_EXISTS(acl HAVE_ACL)
1927
CHECK_FUNCTION_EXISTS(facl HAVE_FACL)
1928
1929
# Libacl
1930
CHECK_LIBRARY_EXISTS(acl "acl_get_file" "" HAVE_LIBACL)
1931
IF(HAVE_LIBACL)
1932
SET(CMAKE_REQUIRED_LIBRARIES "acl")
1933
FIND_LIBRARY(ACL_LIBRARY NAMES acl)
1934
LIST(APPEND ADDITIONAL_LIBS ${ACL_LIBRARY})
1935
pkg_check_modules(LIBACL libacl)
1936
IF(LIBACL_VERSION)
1937
SET(LIBACL_PKGCONFIG_VERSION ${LIBACL_VERSION})
1938
ENDIF(LIBACL_VERSION)
1939
ELSE(HAVE_LIBACL)
1940
UNSET(LIBACL_PKGCONFIG_VERSION CACHE)
1941
ENDIF(HAVE_LIBACL)
1942
1943
CHECK_TYPE_EXISTS(acl_t "sys/types.h;sys/acl.h" HAVE_ACL_T)
1944
CHECK_TYPE_EXISTS(acl_entry_t "sys/types.h;sys/acl.h" HAVE_ACL_ENTRY_T)
1945
CHECK_TYPE_EXISTS(acl_permset_t "sys/types.h;sys/acl.h" HAVE_ACL_PERMSET_T)
1946
CHECK_TYPE_EXISTS(acl_tag_t "sys/types.h;sys/acl.h" HAVE_ACL_TAG_T)
1947
1948
IF(HAVE_ACL AND HAVE_FACL)
1949
CHECK_TYPE_EXISTS(aclent_t "sys/acl.h" HAVE_ACLENT_T)
1950
IF(HAVE_ACLENT_T)
1951
CHECK_SYMBOL_EXISTS(GETACL "sys/acl.h" HAVE_DECL_GETACL)
1952
CHECK_SYMBOL_EXISTS(GETACLCNT "sys/acl.h" HAVE_DECL_GETACLCNT)
1953
CHECK_SYMBOL_EXISTS(SETACL "sys/acl.h" HAVE_DECL_SETACL)
1954
IF(HAVE_DECL_GETACL AND
1955
HAVE_DECL_GETACLCNT AND
1956
HAVE_DECL_SETACL)
1957
SET(ARCHIVE_ACL_SUNOS TRUE)
1958
ENDIF()
1959
CHECK_TYPE_EXISTS(ace_t "sys/acl.h" HAVE_ACE_T)
1960
IF(HAVE_ACE_T)
1961
CHECK_SYMBOL_EXISTS(ACE_GETACL "sys/acl.h" HAVE_DECL_ACE_GETACL)
1962
CHECK_SYMBOL_EXISTS(ACE_GETACLCNT "sys/acl.h" HAVE_DECL_ACE_GETACLCNT)
1963
CHECK_SYMBOL_EXISTS(ACE_SETACL "sys/acl.h" HAVE_DECL_ACE_SETACL)
1964
IF(HAVE_DECL_ACE_GETACL AND
1965
HAVE_DECL_ACE_GETACLCNT AND
1966
HAVE_DECL_ACE_SETACL)
1967
SET(ARCHIVE_ACL_SUNOS_NFS4 TRUE)
1968
ENDIF()
1969
ENDIF(HAVE_ACE_T)
1970
ENDIF(HAVE_ACLENT_T)
1971
ENDIF(HAVE_ACL AND HAVE_FACL)
1972
1973
IF(HAVE_ACL_T AND HAVE_ACL_ENTRY_T AND HAVE_ACL_PERMSET_T AND HAVE_ACL_TAG_T)
1974
CHECK_FUNCTION_EXISTS_GLIBC(acl_add_perm HAVE_ACL_ADD_PERM)
1975
CHECK_FUNCTION_EXISTS_GLIBC(acl_clear_perms HAVE_ACL_CLEAR_PERMS)
1976
CHECK_FUNCTION_EXISTS_GLIBC(acl_create_entry HAVE_ACL_CREATE_ENTRY)
1977
CHECK_FUNCTION_EXISTS_GLIBC(acl_delete_def_file HAVE_ACL_DELETE_DEF_FILE)
1978
CHECK_FUNCTION_EXISTS_GLIBC(acl_free HAVE_ACL_FREE)
1979
CHECK_FUNCTION_EXISTS_GLIBC(acl_get_entry HAVE_ACL_GET_ENTRY)
1980
CHECK_FUNCTION_EXISTS_GLIBC(acl_get_fd HAVE_ACL_GET_FD)
1981
CHECK_FUNCTION_EXISTS_GLIBC(acl_get_file HAVE_ACL_GET_FILE)
1982
CHECK_FUNCTION_EXISTS_GLIBC(acl_get_permset HAVE_ACL_GET_PERMSET)
1983
CHECK_FUNCTION_EXISTS_GLIBC(acl_get_qualifier HAVE_ACL_GET_QUALIFIER)
1984
CHECK_FUNCTION_EXISTS_GLIBC(acl_get_tag_type HAVE_ACL_GET_TAG_TYPE)
1985
CHECK_FUNCTION_EXISTS_GLIBC(acl_init HAVE_ACL_INIT)
1986
CHECK_FUNCTION_EXISTS_GLIBC(acl_set_fd HAVE_ACL_SET_FD)
1987
CHECK_FUNCTION_EXISTS_GLIBC(acl_set_file HAVE_ACL_SET_FILE)
1988
CHECK_FUNCTION_EXISTS_GLIBC(acl_set_qualifier HAVE_ACL_SET_QUALIFIER)
1989
CHECK_FUNCTION_EXISTS_GLIBC(acl_set_tag_type HAVE_ACL_SET_TAG_TYPE)
1990
IF(HAVE_ACL_ADD_PERM AND
1991
HAVE_ACL_CLEAR_PERMS AND
1992
HAVE_ACL_CREATE_ENTRY AND
1993
HAVE_ACL_DELETE_DEF_FILE AND
1994
HAVE_ACL_FREE AND
1995
HAVE_ACL_GET_ENTRY AND
1996
HAVE_ACL_GET_FD AND
1997
HAVE_ACL_GET_FILE AND
1998
HAVE_ACL_GET_PERMSET AND
1999
HAVE_ACL_GET_QUALIFIER AND
2000
HAVE_ACL_GET_TAG_TYPE AND
2001
HAVE_ACL_INIT AND
2002
HAVE_ACL_SET_FD AND
2003
HAVE_ACL_SET_FILE AND
2004
HAVE_ACL_SET_QUALIFIER AND
2005
HAVE_ACL_SET_TAG_TYPE)
2006
SET(HAVE_POSIX_ACL_FUNCS 1)
2007
ENDIF()
2008
2009
CHECK_FUNCTION_EXISTS_GLIBC(acl_get_perm HAVE_ACL_GET_PERM)
2010
2011
IF(HAVE_POSIX_ACL_FUNCS AND HAVE_ACL_LIBACL_H AND HAVE_LIBACL AND
2012
HAVE_ACL_GET_PERM)
2013
SET(ARCHIVE_ACL_LIBACL TRUE)
2014
ELSE()
2015
CHECK_FUNCTION_EXISTS(acl_add_flag_np HAVE_ACL_ADD_FLAG_NP)
2016
CHECK_FUNCTION_EXISTS(acl_clear_flags_np HAVE_ACL_CLEAR_FLAGS_NP)
2017
CHECK_FUNCTION_EXISTS(acl_get_brand_np HAVE_ACL_GET_BRAND_NP)
2018
CHECK_FUNCTION_EXISTS(acl_get_entry_type_np HAVE_ACL_GET_ENTRY_TYPE_NP)
2019
CHECK_FUNCTION_EXISTS(acl_get_flag_np HAVE_ACL_GET_FLAG_NP)
2020
CHECK_FUNCTION_EXISTS(acl_get_flagset_np HAVE_ACL_GET_FLAGSET_NP)
2021
CHECK_FUNCTION_EXISTS(acl_get_fd_np HAVE_ACL_GET_FD_NP)
2022
CHECK_FUNCTION_EXISTS(acl_get_link_np HAVE_ACL_GET_LINK_NP)
2023
CHECK_FUNCTION_EXISTS(acl_get_perm_np HAVE_ACL_GET_PERM_NP)
2024
CHECK_FUNCTION_EXISTS(acl_is_trivial_np HAVE_ACL_IS_TRIVIAL_NP)
2025
CHECK_FUNCTION_EXISTS(acl_set_entry_type_np HAVE_ACL_SET_ENTRY_TYPE_NP)
2026
CHECK_FUNCTION_EXISTS(acl_set_fd_np HAVE_ACL_SET_FD_NP)
2027
CHECK_FUNCTION_EXISTS(acl_set_link_np HAVE_ACL_SET_LINK_NP)
2028
CHECK_FUNCTION_EXISTS(mbr_gid_to_uuid HAVE_MBR_GID_TO_UUID)
2029
CHECK_FUNCTION_EXISTS(mbr_uid_to_uuid HAVE_MBR_UID_TO_UUID)
2030
CHECK_FUNCTION_EXISTS(mbr_uuid_to_id HAVE_MBR_UUID_TO_ID)
2031
2032
CHECK_C_SOURCE_COMPILES("#include <sys/types.h>
2033
#include <sys/acl.h>
2034
int main(void) { return ACL_TYPE_EXTENDED; }" HAVE_DECL_ACL_TYPE_EXTENDED)
2035
CHECK_C_SOURCE_COMPILES("#include <sys/types.h>
2036
#include <sys/acl.h>
2037
int main(void) { return ACL_SYNCHRONIZE; }" HAVE_DECL_ACL_SYNCHRONIZE)
2038
CHECK_SYMBOL_EXISTS(ACL_TYPE_NFS4 "sys/acl.h" HAVE_DECL_ACL_TYPE_NFS4)
2039
CHECK_SYMBOL_EXISTS(ACL_USER "sys/acl.h" HAVE_DECL_ACL_USER)
2040
2041
IF(HAVE_POSIX_ACL_FUNCS AND
2042
HAVE_ACL_GET_FD_NP AND
2043
HAVE_ACL_GET_PERM_NP AND
2044
NOT HAVE_ACL_GET_PERM AND
2045
HAVE_ACL_SET_FD_NP)
2046
IF(HAVE_DECL_ACL_USER)
2047
SET(ARCHIVE_ACL_FREEBSD TRUE)
2048
IF(HAVE_DECL_ACL_TYPE_NFS4 AND
2049
HAVE_ACL_ADD_FLAG_NP AND
2050
HAVE_ACL_CLEAR_FLAGS_NP AND
2051
HAVE_ACL_GET_BRAND_NP AND
2052
HAVE_ACL_GET_ENTRY_TYPE_NP AND
2053
HAVE_ACL_GET_FLAGSET_NP AND
2054
HAVE_ACL_SET_ENTRY_TYPE_NP)
2055
SET(ARCHIVE_ACL_FREEBSD_NFS4 TRUE)
2056
ENDIF()
2057
ELSEIF(HAVE_DECL_ACL_TYPE_EXTENDED AND
2058
HAVE_MEMBERSHIP_H AND
2059
HAVE_ACL_ADD_FLAG_NP AND
2060
HAVE_ACL_CLEAR_FLAGS_NP AND
2061
HAVE_ACL_GET_FLAGSET_NP AND
2062
HAVE_ACL_GET_LINK_NP AND
2063
HAVE_ACL_SET_LINK_NP AND
2064
HAVE_MBR_UID_TO_UUID AND
2065
HAVE_MBR_GID_TO_UUID AND
2066
HAVE_MBR_UUID_TO_ID)
2067
SET(ARCHIVE_ACL_DARWIN TRUE)
2068
ENDIF()
2069
ENDIF()
2070
ENDIF()
2071
ENDIF(HAVE_ACL_T AND HAVE_ACL_ENTRY_T AND HAVE_ACL_PERMSET_T AND
2072
HAVE_ACL_TAG_T)
2073
2074
# Richacl
2075
CHECK_LIBRARY_EXISTS(richacl "richacl_get_file" "" HAVE_LIBRICHACL)
2076
IF(HAVE_LIBRICHACL)
2077
SET(CMAKE_REQUIRED_LIBRARIES "richacl")
2078
FIND_LIBRARY(RICHACL_LIBRARY NAMES richacl)
2079
LIST(APPEND ADDITIONAL_LIBS ${RICHACL_LIBRARY})
2080
pkg_check_modules(LIBRICHACL librichacl)
2081
IF(LIBRICHACL_VERSION)
2082
SET(LIBRICHACL_PKGCONFIG_VERSION ${LIBRICHACL_VERSION})
2083
ENDIF(LIBRICHACL_VERSION)
2084
ELSE(HAVE_LIBRICHACL)
2085
UNSET(LIBRICHACL_PKGCONFIG_VERSION CACHE)
2086
ENDIF(HAVE_LIBRICHACL)
2087
2088
CHECK_STRUCT_HAS_MEMBER("struct richace" e_type "sys/richacl.h"
2089
HAVE_STRUCT_RICHACE)
2090
CHECK_STRUCT_HAS_MEMBER("struct richacl" a_flags "sys/richacl.h"
2091
HAVE_STRUCT_RICHACL)
2092
2093
IF(HAVE_LIBRICHACL AND HAVE_STRUCT_RICHACL AND HAVE_STRUCT_RICHACE)
2094
CHECK_FUNCTION_EXISTS_GLIBC(richacl_alloc HAVE_RICHACL_ALLOC)
2095
CHECK_FUNCTION_EXISTS_GLIBC(richacl_equiv_mode HAVE_RICHACL_EQUIV_MODE)
2096
CHECK_FUNCTION_EXISTS_GLIBC(richacl_free HAVE_RICHACL_FREE)
2097
CHECK_FUNCTION_EXISTS_GLIBC(richacl_get_fd HAVE_RICHACL_GET_FD)
2098
CHECK_FUNCTION_EXISTS_GLIBC(richacl_get_file HAVE_RICHACL_GET_FILE)
2099
CHECK_FUNCTION_EXISTS_GLIBC(richacl_set_fd HAVE_RICHACL_SET_FD)
2100
CHECK_FUNCTION_EXISTS_GLIBC(richacl_set_file HAVE_RICHACL_SET_FILE)
2101
IF(HAVE_RICHACL_ALLOC AND
2102
HAVE_RICHACL_EQUIV_MODE AND
2103
HAVE_RICHACL_FREE AND
2104
HAVE_RICHACL_GET_FD AND
2105
HAVE_RICHACL_GET_FILE AND
2106
HAVE_RICHACL_SET_FD AND
2107
HAVE_RICHACL_SET_FILE)
2108
SET(ARCHIVE_ACL_LIBRICHACL TRUE)
2109
ENDIF()
2110
ENDIF(HAVE_LIBRICHACL AND HAVE_STRUCT_RICHACL AND HAVE_STRUCT_RICHACE)
2111
2112
IF(ARCHIVE_ACL_DARWIN)
2113
MESSAGE(STATUS "ACL support: Darwin (limited NFSv4)")
2114
ELSEIF(ARCHIVE_ACL_FREEBSD_NFS4)
2115
MESSAGE(STATUS "ACL support: FreeBSD (POSIX.1e and NFSv4)")
2116
ELSEIF(ARCHIVE_ACL_FREEBSD)
2117
MESSAGE(STATUS "ACL support: FreeBSD (POSIX.1e)")
2118
ELSEIF(ARCHIVE_ACL_LIBACL OR ARCHIVE_ACL_LIBRICHACL)
2119
IF(ARCHIVE_ACL_LIBACL AND ARCHIVE_ACL_LIBRICHACL)
2120
MESSAGE(STATUS "ACL support: libacl (POSIX.1e) + librichacl (NFSv4)")
2121
ELSEIF(ARCHIVE_ACL_LIBRICHACL)
2122
MESSAGE(STATUS "ACL support: librichacl (NFSv4)")
2123
ELSE()
2124
MESSAGE(STATUS "ACL support: libacl (POSIX.1e)")
2125
ENDIF()
2126
ELSEIF(ARCHIVE_ACL_SUNOS_NFS4)
2127
MESSAGE(STATUS "ACL support: Solaris (POSIX.1e and NFSv4)")
2128
ELSEIF(ARCHIVE_ACL_SUNOS)
2129
MESSAGE(STATUS "ACL support: Solaris (POSIX.1e)")
2130
ELSE()
2131
MESSAGE(STATUS "ACL support: none")
2132
ENDIF()
2133
2134
ELSE(ENABLE_ACL)
2135
# If someone runs cmake, then disables ACL support, we need
2136
# to forcibly override the cached values for these.
2137
SET(ARCHIVE_ACL_DARWIN FALSE)
2138
SET(ARCHIVE_ACL_FREEBSD FALSE)
2139
SET(ARCHIVE_ACL_FREEBSD_NFS4 FALSE)
2140
SET(ARCHIVE_ACL_LIBACL FALSE)
2141
SET(ARCHIVE_ACL_SUNOS FALSE)
2142
SET(ARCHIVE_ACL_SUNOS_NFS4 FALSE)
2143
ENDIF(ENABLE_ACL)
2144
2145
#
2146
# Check MD5/RMD160/SHA support
2147
# NOTE: Crypto checks must be run last before generating config.h
2148
#
2149
CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" LIBC)
2150
CHECK_CRYPTO("SHA256;SHA384;SHA512" LIBC2)
2151
CHECK_CRYPTO("SHA256;SHA384;SHA512" LIBC3)
2152
CHECK_CRYPTO("MD5;SHA1;SHA256;SHA384;SHA512" LIBSYSTEM)
2153
CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" MBEDTLS)
2154
CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" NETTLE)
2155
CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" OPENSSL)
2156
2157
# Libmd has to be probed after OpenSSL.
2158
CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA512" LIBMD)
2159
2160
CHECK_CRYPTO_WIN("MD5;SHA1;SHA256;SHA384;SHA512")
2161
2162
IF(0) # CMake does not build libarchive's shared library.
2163
# Check visibility annotations
2164
SET(OLD_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
2165
SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fvisibility=hidden -Werror")
2166
CHECK_C_SOURCE_COMPILES("void __attribute__((visibility(\"default\"))) foo(void);
2167
int main() { return 0; }" HAVE_VISIBILITY_ATTR)
2168
IF (HAVE_VISIBILITY_ATTR)
2169
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
2170
ADD_DEFINITIONS(-D__LIBARCHIVE_ENABLE_VISIBILITY)
2171
ENDIF(HAVE_VISIBILITY_ATTR)
2172
SET(CMAKE_REQUIRED_FLAGS "${OLD_CMAKE_REQUIRED_FLAGS}")
2173
ENDIF()
2174
2175
# Generate "config.h" from "build/cmake/config.h.in"
2176
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/build/cmake/config.h.in
2177
${CMAKE_CURRENT_BINARY_DIR}/config.h)
2178
INCLUDE_DIRECTORIES(BEFORE ${CMAKE_CURRENT_BINARY_DIR})
2179
ADD_DEFINITIONS(-DHAVE_CONFIG_H)
2180
2181
IF(0) # CMake does not build libarchive's packages.
2182
# Handle generation of the libarchive.pc file for pkg-config
2183
INCLUDE(CreatePkgConfigFile)
2184
ENDIF()
2185
2186
#
2187
# Register installation of PDF documents.
2188
#
2189
IF(WIN32 AND NOT CYGWIN AND ENABLE_INSTALL)
2190
#
2191
# On Windows platform, It's better that we install PDF documents
2192
# on one's computer.
2193
# These PDF documents are available in the release package.
2194
#
2195
IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/doc/pdf)
2196
INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc/pdf
2197
DESTINATION share/man
2198
FILES_MATCHING PATTERN "*.pdf"
2199
)
2200
ENDIF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/doc/pdf)
2201
ENDIF(WIN32 AND NOT CYGWIN AND ENABLE_INSTALL)
2202
#
2203
#
2204
#
2205
INCLUDE_DIRECTORIES(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/libarchive)
2206
#
2207
IF(MSVC)
2208
ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE)
2209
ENDIF(MSVC)
2210
2211
OPTION(DONT_FAIL_ON_CRC_ERROR "Ignore CRC errors during parsing (For fuzzing)" OFF)
2212
IF(DONT_FAIL_ON_CRC_ERROR)
2213
ADD_DEFINITIONS(-DDONT_FAIL_ON_CRC_ERROR=1)
2214
ENDIF(DONT_FAIL_ON_CRC_ERROR)
2215
2216
IF(ENABLE_TEST)
2217
ADD_CUSTOM_TARGET(run_all_tests)
2218
ENDIF(ENABLE_TEST)
2219
2220
# We need CoreServices on Mac OS.
2221
IF(APPLE)
2222
LIST(APPEND ADDITIONAL_LIBS "-framework CoreServices")
2223
ENDIF(APPLE)
2224
2225
add_subdirectory(libarchive)
2226
IF(0) # CMake does not build libarchive's command-line tools.
2227
add_subdirectory(cat)
2228
add_subdirectory(tar)
2229
add_subdirectory(cpio)
2230
add_subdirectory(unzip)
2231
ENDIF()
2232
2233
install(FILES COPYING DESTINATION ${CMake_INSTALL_DOC_DIR}/cmlibarchive)
2234
2235