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