5
CMAKE_MINIMUM_REQUIRED(VERSION 2.6.3 FATAL_ERROR)
6
SET(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/build/cmake")
7
if(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
8
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${libarchive_BINARY_DIR}/bin)
12
# Version - read from 'version' file.
14
FILE(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/build/version _version)
16
"^([0-9])[0-9][0-9][0-9][0-9][0-9][0-9][a-z]?$" "\\1" _major ${_version})
18
"^[0-9]([0-9][0-9][0-9])[0-9][0-9][0-9][a-z]?$" "\\1" _minor ${_version})
20
"^[0-9][0-9][0-9][0-9]([0-9][0-9][0-9])[a-z]?$" "\\1" _revision ${_version})
22
"^[0-9][0-9][0-9][0-9][0-9][0-9][0-9]([a-z]?)$" "\\1" _quality ${_version})
23
SET(_version_number ${_major}${_minor}${_revision})
24
STRING(REGEX REPLACE "[0]*([^0][0-9]*)$" "\\1" _minor ${_minor})
25
STRING(REGEX REPLACE "[0]*([^0][0-9]*)$" "\\1" _revision ${_revision})
27
SET(VERSION "${_major}.${_minor}.${_revision}${_quality}")
28
SET(BSDCPIO_VERSION_STRING "${VERSION}")
29
SET(BSDTAR_VERSION_STRING "${VERSION}")
30
SET(LIBARCHIVE_VERSION_NUMBER "${_version_number}")
31
SET(LIBARCHIVE_VERSION_STRING "${VERSION}")
32
# Shared library number
35
# Enable CTest/CDash support
38
# Provide ADD_TEST_28 macro to approximate CMake 2.8 ADD_TEST(NAME).
39
# TODO: Require CMake 2.8 and drop this workaround (perhaps late 2010).
42
OPTION(ENABLE_OPENSSL "Enable use of OpenSSL" ON)
43
OPTION(ENABLE_TAR "Enable tar building" ON)
44
OPTION(ENABLE_TAR_SHARED "Enable dynamic build of tar" OFF)
45
OPTION(ENABLE_CPIO "Enable cpio building" ON)
46
OPTION(ENABLE_CPIO_SHARED "Enable dynamic build of cpio" OFF)
47
OPTION(ENABLE_XATTR "Enable extended attribute support" ON)
48
OPTION(ENABLE_ACL "Enable ACL support" ON)
49
OPTION(ENABLE_TEST "Enable unit and regression tests" ON)
54
IF(WIN32 AND NOT CYGWIN)
55
# Currently, dynamic build only.
56
SET(ENABLE_TAR_SHARED ON)
57
SET(ENABLE_CPIO_SHARED ON)
58
ENDIF(WIN32 AND NOT CYGWIN)
61
SET(_WIN32_WINNT 0x0500 CACHE INTERNAL "Setting _WIN32_WINNT to 0x0500 for Windows 2000 APIs")
62
SET(WINVER 0x0500 CACHE INTERNAL "Setting WINVER to 0x0500 for Windows 2000 APIs")
66
INCLUDE(CheckCSourceRuns)
67
INCLUDE(CheckFileOffsetBits)
69
INCLUDE(CheckHeaderDirent)
70
INCLUDE(CheckIncludeFile)
71
INCLUDE(CheckIncludeFiles)
72
INCLUDE(CheckLibraryExists)
73
INCLUDE(CheckStructMember)
74
INCLUDE(CheckSymbolExists)
75
INCLUDE(CheckTypeExists)
76
INCLUDE(CheckTypeSize)
81
MACRO (GENERATE_LIST_H _listfile _cmlist __list_sources)
83
# Remove _listfile and _cmlist from _argv
84
LIST(REMOVE_AT _argv 0 1)
85
IF (NOT EXISTS "${_listfile}" OR
86
${_cmlist} IS_NEWER_THAN "${_listfile}")
88
MESSAGE(STATUS "Generating ${_listfile}")
89
FILE(WRITE ${_listfile} "")
90
FOREACH (testfile ${_argv})
91
IF (testfile MATCHES "^test_[^/]+[.]c$")
92
FILE(STRINGS ${testfile} testvar REGEX "^DEFINE_TEST")
93
FOREACH (deftest ${testvar})
94
FILE(APPEND ${_listfile} "${deftest}\n")
96
ENDIF (testfile MATCHES "^test_[^/]+[.]c$")
99
ENDIF (NOT EXISTS "${_listfile}" OR
100
${_cmlist} IS_NEWER_THAN "${_listfile}")
101
ENDMACRO (GENERATE_LIST_H)
103
# Generate installation rules for man pages.
105
MACRO (INSTALL_MAN __mans)
106
FOREACH (_man ${ARGV})
107
STRING(REGEX REPLACE "^.+[.]([1-9])" "\\1" _mansect ${_man})
108
INSTALL(FILES ${_man} DESTINATION "share/man/man${_mansect}")
110
ENDMACRO (INSTALL_MAN __mans)
113
# Check compress/decompress libraries
115
IF(WIN32 AND NOT CMAKE_CL_64 AND NOT CYGWIN)
116
# GnuWin32 is only for Win32, not Win64.
117
SET(__GNUWIN32PATH "C:/Program Files/GnuWin32")
118
ENDIF(WIN32 AND NOT CMAKE_CL_64 AND NOT CYGWIN)
119
IF(DEFINED __GNUWIN32PATH AND EXISTS "${__GNUWIN32PATH}")
120
# You have to add a path availabel DLL file into PATH environment variable.
121
# Maybe DLL path is "C:/Program Files/GnuWin32/bin".
122
# The zlib and the bzip2 Setup program have installed programs and DLLs into
123
# "C:/Program Files/GnuWin32" by default.
124
# This is convenience setting for Windows.
125
SET(CMAKE_PREFIX_PATH ${__GNUWIN32PATH} $(CMAKE_PREFIX_PATH))
127
# If you didn't use Setup program or installed into nonstandard path,
128
# cmake cannot find out your zlib or bzip2 libraries and include files,
129
# you should execute cmake with -DCMAKE_PREFIX_PATH option.
131
# cmake -DCMAKE_PREFIX_PATH=<your-GnuWin32-path> <path-to-source>
133
# If compiling error occured in zconf.h, You may need patch to zconf.h.
134
#--- zconf.h.orig 2005-07-21 00:40:26.000000000
135
#+++ zconf.h 2009-01-19 11:39:10.093750000
138
# #if 1 /* HAVE_UNISTD_H -- this line is updated by ./configure */
139
# # include <sys/types.h> /* for off_t */
140
#-# include <unistd.h> /* for SEEK_* and off_t */
141
#+# include <stdio.h> /* for SEEK_* and off_t */
143
# # include <unixio.h> /* for off_t */
145
ENDIF(DEFINED __GNUWIN32PATH AND EXISTS "${__GNUWIN32PATH}")
147
SET(ADDITIONAL_LIBS "")
155
INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR})
156
LIST(APPEND ADDITIONAL_LIBS ${ZLIB_LIBRARIES})
158
MARK_AS_ADVANCED(CLEAR ZLIB_INCLUDE_DIR)
159
MARK_AS_ADVANCED(CLEAR ZLIB_LIBRARY)
167
INCLUDE_DIRECTORIES(${BZIP2_INCLUDE_DIR})
168
LIST(APPEND ADDITIONAL_LIBS ${BZIP2_LIBRARIES})
170
MARK_AS_ADVANCED(CLEAR BZIP2_INCLUDE_DIR)
171
MARK_AS_ADVANCED(CLEAR BZIP2_LIBRARY)
179
INCLUDE_DIRECTORIES(${LZMA_INCLUDE_DIR})
180
LIST(APPEND ADDITIONAL_LIBS ${LZMA_LIBRARIES})
181
MARK_AS_ADVANCED(CLEAR LZMA_INCLUDE_DIR)
182
MARK_AS_ADVANCED(CLEAR LZMA_LIBRARY)
183
ELSEIF(LZMADEC_FOUND)
184
SET(HAVE_LIBLZMADEC 1)
185
SET(HAVE_LZMADEC_H 1)
186
INCLUDE_DIRECTORIES(${LZMADEC_INCLUDE_DIR})
187
LIST(APPEND ADDITIONAL_LIBS ${LZMADEC_LIBRARIES})
188
MARK_AS_ADVANCED(CLEAR LZMADEC_INCLUDE_DIR)
189
MARK_AS_ADVANCED(CLEAR LZMADEC_LIBRARY)
191
MARK_AS_ADVANCED(CLEAR LZMA_INCLUDE_DIR)
192
MARK_AS_ADVANCED(CLEAR LZMA_LIBRARY)
198
CHECK_HEADER_DIRENT()
201
MACRO (LA_CHECK_INCLUDE_FILE header var)
202
CHECK_INCLUDE_FILES("${INCLUDES};${header}" ${var})
204
SET(INCLUDES ${INCLUDES} ${header})
206
ENDMACRO (LA_CHECK_INCLUDE_FILE)
208
# Some FreeBSD headers assume sys/types.h was already included.
209
LA_CHECK_INCLUDE_FILE("sys/types.h" HAVE_SYS_TYPES_H)
211
# Alphabetize the rest unless there's a compelling reason
212
LA_CHECK_INCLUDE_FILE("acl/libacl.h" HAVE_ACL_LIBACL_H)
213
LA_CHECK_INCLUDE_FILE("ctype.h" HAVE_CTYPE_H)
214
LA_CHECK_INCLUDE_FILE("direct.h" HAVE_DIRECT_H)
215
LA_CHECK_INCLUDE_FILE("dlfcn.h" HAVE_DLFCN_H)
216
LA_CHECK_INCLUDE_FILE("errno.h" HAVE_ERRNO_H)
217
LA_CHECK_INCLUDE_FILE("ext2fs/ext2_fs.h" HAVE_EXT2FS_EXT2_FS_H)
218
LA_CHECK_INCLUDE_FILE("fcntl.h" HAVE_FCNTL_H)
219
LA_CHECK_INCLUDE_FILE("grp.h" HAVE_GRP_H)
220
LA_CHECK_INCLUDE_FILE("inttypes.h" HAVE_INTTYPES_H)
221
LA_CHECK_INCLUDE_FILE("io.h" HAVE_IO_H)
222
LA_CHECK_INCLUDE_FILE("langinfo.h" HAVE_LANGINFO_H)
223
LA_CHECK_INCLUDE_FILE("limits.h" HAVE_LIMITS_H)
224
LA_CHECK_INCLUDE_FILE("linux/fs.h" HAVE_LINUX_FS_H)
225
LA_CHECK_INCLUDE_FILE("locale.h" HAVE_LOCALE_H)
226
LA_CHECK_INCLUDE_FILE("memory.h" HAVE_MEMORY_H)
227
LA_CHECK_INCLUDE_FILE("paths.h" HAVE_PATHS_H)
228
LA_CHECK_INCLUDE_FILE("poll.h" HAVE_POLL_H)
229
LA_CHECK_INCLUDE_FILE("process.h" HAVE_PROCESS_H)
230
LA_CHECK_INCLUDE_FILE("pwd.h" HAVE_PWD_H)
231
LA_CHECK_INCLUDE_FILE("regex.h" HAVE_REGEX_H)
232
LA_CHECK_INCLUDE_FILE("signal.h" HAVE_SIGNAL_H)
233
LA_CHECK_INCLUDE_FILE("stdarg.h" HAVE_STDARG_H)
234
LA_CHECK_INCLUDE_FILE("stdint.h" HAVE_STDINT_H)
235
LA_CHECK_INCLUDE_FILE("stdlib.h" HAVE_STDLIB_H)
236
LA_CHECK_INCLUDE_FILE("string.h" HAVE_STRING_H)
237
LA_CHECK_INCLUDE_FILE("strings.h" HAVE_STRINGS_H)
238
LA_CHECK_INCLUDE_FILE("sys/acl.h" HAVE_SYS_ACL_H)
239
LA_CHECK_INCLUDE_FILE("sys/cdefs.h" HAVE_SYS_CDEFS_H)
240
LA_CHECK_INCLUDE_FILE("sys/ioctl.h" HAVE_SYS_IOCTL_H)
241
LA_CHECK_INCLUDE_FILE("sys/mkdev.h" HAVE_SYS_MKDEV_H)
242
LA_CHECK_INCLUDE_FILE("sys/param.h" HAVE_SYS_PARAM_H)
243
LA_CHECK_INCLUDE_FILE("sys/poll.h" HAVE_SYS_POLL_H)
244
LA_CHECK_INCLUDE_FILE("sys/select.h" HAVE_SYS_SELECT_H)
245
LA_CHECK_INCLUDE_FILE("sys/stat.h" HAVE_SYS_STAT_H)
246
LA_CHECK_INCLUDE_FILE("sys/time.h" HAVE_SYS_TIME_H)
247
LA_CHECK_INCLUDE_FILE("sys/utime.h" HAVE_SYS_UTIME_H)
248
LA_CHECK_INCLUDE_FILE("sys/wait.h" HAVE_SYS_WAIT_H)
249
LA_CHECK_INCLUDE_FILE("time.h" HAVE_TIME_H)
250
LA_CHECK_INCLUDE_FILE("unistd.h" HAVE_UNISTD_H)
251
LA_CHECK_INCLUDE_FILE("utime.h" HAVE_UTIME_H)
252
LA_CHECK_INCLUDE_FILE("wchar.h" HAVE_WCHAR_H)
253
LA_CHECK_INCLUDE_FILE("wctype.h" HAVE_WCTYPE_H)
254
LA_CHECK_INCLUDE_FILE("windows.h" HAVE_WINDOWS_H)
258
# Some headers require extra includes when they're available.
265
FIND_PACKAGE(OpenSSL)
269
# How to prove that HASH functions, which have several names on various
270
# platforms, can be mapped to archive_{hash name}_init,
271
# archive_{hash name}_update and archive_{hash name}_final through
274
MACRO(CHECK_MD HASH IMPLEMENTATIONS)
276
SET(HASH_HEADER_CONFIG "#define HAVE_SYS_TYPES_H 1\n")
277
ELSE(HAVE_SYS_TYPES_H)
278
SET(HASH_HEADER_CONFIG "")
279
ENDIF(HAVE_SYS_TYPES_H)
281
FOREACH(IMPLEMENTATION ${IMPLEMENTATIONS})
282
IF(NOT DEFINED ARCHIVE_HASH_${HASH}_${IMPLEMENTATION})
283
STRING(TOLOWER "${HASH}" lower_hash)
284
STRING(TOUPPER "${HASH}" hash)
286
SET(HASH_REQUIRED_INCLUDES)
287
SET(TRY_HASH_REQUIRED_INCLUDES
288
"-DINCLUDE_DIRECTORIES:STRING=${CMAKE_CURRENT_SOURCE_DIR}/libarchive")
289
SET(HASH_REQUIRED_LIBS)
290
SET(TRY_HASH_REQUIRED_LIBS)
291
IF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)
292
SET(HASH_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
293
SET(TRY_HASH_REQUIRED_INCLUDES
294
"${TRY_HASH_REQUIRED_INCLUDES};${OPENSSL_INCLUDE_DIR}")
295
SET(HASH_REQUIRED_LIBS ${OPENSSL_LIBRARIES})
296
SET(TRY_HASH_REQUIRED_LIBS
297
"-DLINK_LIBRARIES:STRING=${OPENSSL_LIBRARIES}")
298
ENDIF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)
300
SET(SOURCE "#define ${hash}_COMPILE_TEST
301
#define ARCHIVE_HASH_${hash}_${IMPLEMENTATION}
302
#define __LIBARCHIVE_BUILD
303
${HASH_HEADER_CONFIG}
304
#include \"archive_hash.h\"
307
main(int argc, char **argv)
309
archive_${lower_hash}_ctx ctx;
311
archive_${lower_hash}_init(&ctx);
312
archive_${lower_hash}_update(&ctx, *argv, argc);
313
archive_${lower_hash}_final(&ctx, *argv);
318
FILE(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_hash_md.c" "${SOURCE}")
319
MESSAGE(STATUS "Checking support for ARCHIVE_HASH_${HASH}_${IMPLEMENTATION}")
321
TRY_COMPILE(ARCHIVE_HASH_${HASH}_${IMPLEMENTATION}
323
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_hash_md.c
325
"${TRY_HASH_REQUIRED_LIBS}"
326
"${TRY_HASH_REQUIRED_INCLUDES}"
327
OUTPUT_VARIABLE OUTPUT)
329
IF (ARCHIVE_HASH_${HASH}_${IMPLEMENTATION})
330
MESSAGE(STATUS "Checking support for ARCHIVE_HASH_${HASH}_${IMPLEMENTATION} -- found")
331
IF (HASH_REQUIRED_INCLUDES)
332
INCLUDE_DIRECTORIES(${HASH_REQUIRED_INCLUDES})
333
ENDIF (HASH_REQUIRED_INCLUDES)
334
IF (HASH_REQUIRED_LIBS)
335
LIST(APPEND ADDITIONAL_LIBS ${HASH_REQUIRED_LIBS})
336
LIST(REMOVE_DUPLICATES ADDITIONAL_LIBS)
337
ENDIF (HASH_REQUIRED_LIBS)
339
ENDIF (ARCHIVE_HASH_${HASH}_${IMPLEMENTATION})
341
MESSAGE(STATUS "Checking support for ARCHIVE_HASH_${HASH}_${IMPLEMENTATION} -- not found")
342
FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
343
"Checking support for ARCHIVE_HASH_${HASH}_${IMPLEMENTATION} failed with the following output:\n"
345
"Source file was:\n${SOURCE}\n")
346
ELSE(NOT DEFINED ARCHIVE_HASH_${HASH}_${IMPLEMENTATION})
347
IF(ARCHIVE_HASH_${HASH}_${IMPLEMENTATION})
349
ENDIF(ARCHIVE_HASH_${HASH}_${IMPLEMENTATION})
350
ENDIF(NOT DEFINED ARCHIVE_HASH_${HASH}_${IMPLEMENTATION})
351
ENDFOREACH(IMPLEMENTATION)
352
ENDMACRO(CHECK_MD HASH IMPLEMENTATIONS)
355
# HASH functions on Windows is defined at archive_windows.c, thus we do not
356
# need the test what the functions can be mapped to archive_{hash name}_init,
357
# archive_{hash name}_update and archive_{hash name}_final.
358
# The functions on Windows use CALG_{hash name} macro to create a crypt object
359
# and then we need to know what CALG_{hash name} macros is available to show
360
# ARCHIVE_HASH_{hash name}_WIN macros because Windows 2000 and earlier version
361
# of Windows XP do not support SHA256, SHA384 and SHA512.
363
MACRO(CHECK_HASH_WIN HASH_LIST)
364
IF(WIN32 AND NOT CYGWIN)
365
FOREACH(HASH ${HASH_LIST})
366
IF(NOT DEFINED ARCHIVE_HASH_${HASH}_WIN)
367
STRING(TOUPPER "${HASH}" hash)
369
IF ("${HASH}" MATCHES "^MD5$")
370
SET(ALGID "CALG_MD5")
371
ENDIF ("${HASH}" MATCHES "^MD5$")
372
IF ("${HASH}" MATCHES "^SHA1$")
373
SET(ALGID "CALG_SHA1")
374
ENDIF ("${HASH}" MATCHES "^SHA1$")
375
IF ("${HASH}" MATCHES "^SHA256$")
376
SET(ALGID "CALG_SHA_256")
377
ENDIF ("${HASH}" MATCHES "^SHA256$")
378
IF ("${HASH}" MATCHES "^SHA384$")
379
SET(ALGID "CALG_SHA_384")
380
ENDIF ("${HASH}" MATCHES "^SHA384$")
381
IF ("${HASH}" MATCHES "^SHA512$")
382
SET(ALGID "CALG_SHA_512")
383
ENDIF ("${HASH}" MATCHES "^SHA512$")
385
SET(SOURCE "#define ${hash}_COMPILE_TEST
386
#define _WIN32_WINNT ${_WIN32_WINNT}
387
#define WINVER ${WINVER}
389
#include <wincrypt.h>
392
main(int argc, char **argv)
397
SET(SOURCE_FILE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_hash_win.c")
399
FILE(WRITE "${SOURCE_FILE}" "${SOURCE}")
400
MESSAGE(STATUS "Checking support for ARCHIVE_HASH_${HASH}_WIN")
402
TRY_COMPILE(ARCHIVE_HASH_${HASH}_WIN
405
CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_CURRENT_SOURCE_DIR}/libarchive"
406
OUTPUT_VARIABLE OUTPUT)
408
IF (ARCHIVE_HASH_${HASH}_WIN)
410
"Checking support for ARCHIVE_HASH_${HASH}_WIN -- found")
411
ELSE (ARCHIVE_HASH_${HASH}_WIN)
413
"Checking support for ARCHIVE_HASH_${HASH}_WIN -- not found")
415
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
416
"Checking support for ARCHIVE_HASH_${HASH}_WIN failed with the following output:\n"
418
"Source file was:\n${SOURCE}\n")
419
ENDIF (ARCHIVE_HASH_${HASH}_WIN)
421
ENDIF(NOT DEFINED ARCHIVE_HASH_${HASH}_WIN)
423
ENDIF(WIN32 AND NOT CYGWIN)
424
ENDMACRO(CHECK_HASH_WIN HASH_LIST)
427
# Check MD5/RMD160/SHA support
429
CHECK_MD(MD5 "LIBC;LIBSYSTEM;OPENSSL")
430
CHECK_MD(RMD160 "LIBC;OPENSSL")
431
CHECK_MD(SHA1 "LIBC;LIBSYSTEM;OPENSSL")
432
CHECK_MD(SHA256 "LIBC;LIBC2;LIBC3;LIBSYSTEM;OPENSSL")
433
CHECK_MD(SHA384 "LIBC;LIBC2;LIBC3;LIBSYSTEM;OPENSSL")
434
CHECK_MD(SHA512 "LIBC;LIBC2;LIBC3;LIBSYSTEM;OPENSSL")
435
CHECK_HASH_WIN("MD5;SHA1;SHA256;SHA384;SHA512")
440
FIND_PACKAGE(LibXml2)
442
INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR})
443
LIST(APPEND ADDITIONAL_LIBS ${LIBXML2_LIBRARIES})
445
# libxml2's include files use iconv.h
446
# We need a directory path of iconv.h so that it won't fail to check
447
# "libxml/xmlreader.h".
448
FIND_PATH(ICONV_INCLUDE_DIR iconv.h)
449
INCLUDE_DIRECTORIES(${ICONV_INCLUDE_DIR})
450
SET(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR} ${LIBXML2_INCLUDE_DIR})
451
CHECK_INCLUDE_FILES("libxml/xmlreader.h" HAVE_LIBXML_XMLREADER_H)
452
SET(CMAKE_REQUIRED_INCLUDES "")
459
INCLUDE_DIRECTORIES(${EXPAT_INCLUDE_DIR})
460
LIST(APPEND ADDITIONAL_LIBS ${EXPAT_LIBRARIES})
462
LA_CHECK_INCLUDE_FILE("expat.h" HAVE_EXPAT_H)
469
CHECK_SYMBOL_EXISTS(CreateHardLinkA "windows.h" HAVE_CREATEHARDLINKA)
470
CHECK_SYMBOL_EXISTS(CreateHardLinkW "windows.h" HAVE_CREATEHARDLINKW)
471
CHECK_SYMBOL_EXISTS(_CrtSetReportMode "crtdbg.h" HAVE__CrtSetReportMode)
472
CHECK_FUNCTION_EXISTS_GLIBC(chflags HAVE_CHFLAGS)
473
CHECK_FUNCTION_EXISTS_GLIBC(chown HAVE_CHOWN)
474
CHECK_FUNCTION_EXISTS_GLIBC(chroot HAVE_CHROOT)
475
CHECK_FUNCTION_EXISTS_GLIBC(fchdir HAVE_FCHDIR)
476
CHECK_FUNCTION_EXISTS_GLIBC(fchflags HAVE_FCHFLAGS)
477
CHECK_FUNCTION_EXISTS_GLIBC(fchmod HAVE_FCHMOD)
478
CHECK_FUNCTION_EXISTS_GLIBC(fchown HAVE_FCHOWN)
479
CHECK_FUNCTION_EXISTS_GLIBC(fcntl HAVE_FCNTL)
480
CHECK_FUNCTION_EXISTS_GLIBC(fork HAVE_FORK)
481
CHECK_FUNCTION_EXISTS_GLIBC(fstat HAVE_FSTAT)
482
CHECK_FUNCTION_EXISTS_GLIBC(ftruncate HAVE_FTRUNCATE)
483
CHECK_FUNCTION_EXISTS_GLIBC(futimens HAVE_FUTIMENS)
484
CHECK_FUNCTION_EXISTS_GLIBC(futimes HAVE_FUTIMES)
485
CHECK_FUNCTION_EXISTS_GLIBC(geteuid HAVE_GETEUID)
486
CHECK_FUNCTION_EXISTS_GLIBC(getgrgid_r HAVE_GETGRGID_R)
487
CHECK_FUNCTION_EXISTS_GLIBC(getgrnam_r HAVE_GETGRNAM_R)
488
CHECK_FUNCTION_EXISTS_GLIBC(getpwnam_r HAVE_GETPWNAM_R)
489
CHECK_FUNCTION_EXISTS_GLIBC(getpwuid_r HAVE_GETPWUID_R)
490
CHECK_FUNCTION_EXISTS_GLIBC(getpid HAVE_GETPID)
491
CHECK_FUNCTION_EXISTS_GLIBC(lchflags HAVE_LCHFLAGS)
492
CHECK_FUNCTION_EXISTS_GLIBC(lchmod HAVE_LCHMOD)
493
CHECK_FUNCTION_EXISTS_GLIBC(lchown HAVE_LCHOWN)
494
CHECK_FUNCTION_EXISTS_GLIBC(link HAVE_LINK)
495
CHECK_FUNCTION_EXISTS_GLIBC(lstat HAVE_LSTAT)
496
CHECK_FUNCTION_EXISTS_GLIBC(lutimes HAVE_LUTIMES)
497
CHECK_FUNCTION_EXISTS_GLIBC(memmove HAVE_MEMMOVE)
498
CHECK_FUNCTION_EXISTS_GLIBC(mkdir HAVE_MKDIR)
499
CHECK_FUNCTION_EXISTS_GLIBC(mkfifo HAVE_MKFIFO)
500
CHECK_FUNCTION_EXISTS_GLIBC(mknod HAVE_MKNOD)
501
CHECK_FUNCTION_EXISTS_GLIBC(nl_langinfo HAVE_NL_LANGINFO)
502
CHECK_FUNCTION_EXISTS_GLIBC(pipe HAVE_PIPE)
503
CHECK_FUNCTION_EXISTS_GLIBC(poll HAVE_POLL)
504
CHECK_FUNCTION_EXISTS_GLIBC(readlink HAVE_READLINK)
505
CHECK_FUNCTION_EXISTS_GLIBC(select HAVE_SELECT)
506
CHECK_FUNCTION_EXISTS_GLIBC(setenv HAVE_SETENV)
507
CHECK_FUNCTION_EXISTS_GLIBC(setlocale HAVE_SETLOCALE)
508
CHECK_FUNCTION_EXISTS_GLIBC(sigaction HAVE_SIGACTION)
509
CHECK_FUNCTION_EXISTS_GLIBC(strchr HAVE_STRCHR)
510
CHECK_FUNCTION_EXISTS_GLIBC(strdup HAVE_STRDUP)
511
CHECK_FUNCTION_EXISTS_GLIBC(strerror HAVE_STRERROR)
512
CHECK_FUNCTION_EXISTS_GLIBC(strncpy_s HAVE_STRNCPY_S)
513
CHECK_FUNCTION_EXISTS_GLIBC(strrchr HAVE_STRRCHR)
514
CHECK_FUNCTION_EXISTS_GLIBC(symlink HAVE_SYMLINK)
515
CHECK_FUNCTION_EXISTS_GLIBC(timegm HAVE_TIMEGM)
516
CHECK_FUNCTION_EXISTS_GLIBC(tzset HAVE_TZSET)
517
CHECK_FUNCTION_EXISTS_GLIBC(unsetenv HAVE_UNSETENV)
518
CHECK_FUNCTION_EXISTS_GLIBC(utime HAVE_UTIME)
519
CHECK_FUNCTION_EXISTS_GLIBC(utimes HAVE_UTIMES)
520
CHECK_FUNCTION_EXISTS_GLIBC(utimensat HAVE_UTIMENSAT)
521
CHECK_FUNCTION_EXISTS_GLIBC(vfork HAVE_VFORK)
522
CHECK_FUNCTION_EXISTS_GLIBC(wcrtomb HAVE_WCRTOMB)
523
CHECK_FUNCTION_EXISTS_GLIBC(wcscmp HAVE_WCSCMP)
524
CHECK_FUNCTION_EXISTS_GLIBC(wcscpy HAVE_WCSCPY)
525
CHECK_FUNCTION_EXISTS_GLIBC(wcslen HAVE_WCSLEN)
526
CHECK_FUNCTION_EXISTS_GLIBC(wctomb HAVE_WCTOMB)
527
CHECK_SYMBOL_EXISTS(wmemcmp "wchar.h" HAVE_WMEMCMP)
528
CHECK_SYMBOL_EXISTS(wmemcpy "wchar.h" HAVE_WMEMCPY)
530
SET(CMAKE_REQUIRED_LIBRARIES "")
531
CHECK_SYMBOL_EXISTS(fseeko "stdio.h" HAVE_FSEEKO)
532
CHECK_SYMBOL_EXISTS(strerror_r "string.h" HAVE_STRERROR_R)
533
CHECK_SYMBOL_EXISTS(strftime "time.h" HAVE_STRFTIME)
534
CHECK_SYMBOL_EXISTS(vprintf "stdio.h" HAVE_VPRINTF)
535
CHECK_SYMBOL_EXISTS(cygwin_conv_path "sys/cygwin.h" HAVE_CYGWIN_CONV_PATH)
537
CHECK_SYMBOL_EXISTS(major "sys/mkdev.h" MAJOR_IN_MKDEV)
538
CHECK_SYMBOL_EXISTS(major "sys/sysmacros.h" MAJOR_IN_SYSMACROS)
541
SET(HAVE_DECL_STRERROR_R 1)
542
ENDIF(HAVE_STRERROR_R)
547
SET(headers "limits.h")
549
LIST(APPEND headers "stdint.h")
552
LIST(APPEND headers "inttypes.h")
553
ENDIF(HAVE_INTTYPES_H)
554
CHECK_SYMBOL_EXISTS(EFTYPE "errno.h" HAVE_EFTYPE)
555
CHECK_SYMBOL_EXISTS(EILSEQ "errno.h" HAVE_EILSEQ)
556
CHECK_SYMBOL_EXISTS(D_MD_ORDER "langinfo.h" HAVE_D_MD_ORDER)
557
CHECK_SYMBOL_EXISTS(optarg "unistd.h" HAVE_DECL_OPTARG)
558
CHECK_SYMBOL_EXISTS(optind "unistd.h" HAVE_DECL_OPTIND)
559
CHECK_SYMBOL_EXISTS(INT64_MAX "${headers}" HAVE_DECL_INT64_MAX)
560
CHECK_SYMBOL_EXISTS(INT64_MIN "${headers}" HAVE_DECL_INT64_MIN)
561
CHECK_SYMBOL_EXISTS(UINT32_MAX "${headers}" HAVE_DECL_UINT32_MAX)
562
CHECK_SYMBOL_EXISTS(UINT64_MAX "${headers}" HAVE_DECL_UINT64_MAX)
563
CHECK_SYMBOL_EXISTS(SIZE_MAX "${headers}" HAVE_DECL_SIZE_MAX)
564
CHECK_SYMBOL_EXISTS(SSIZE_MAX "limits.h" HAVE_DECL_SSIZE_MAX)
567
# Check struct members
569
# Check for birthtime in struct stat
570
CHECK_STRUCT_MEMBER("struct stat" st_birthtime
571
"sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_BIRTHTIME)
573
# Check for high-resolution timestamps in struct stat
574
CHECK_STRUCT_MEMBER("struct stat" st_birthtimespec.tv_nsec
575
"sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC)
576
CHECK_STRUCT_MEMBER("struct stat" st_mtimespec.tv_nsec
577
"sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC)
578
CHECK_STRUCT_MEMBER("struct stat" st_mtim.tv_nsec
579
"sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC)
580
CHECK_STRUCT_MEMBER("struct stat" st_mtime_n
581
"sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIME_N)
582
CHECK_STRUCT_MEMBER("struct stat" st_umtime
583
"sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_UMTIME)
584
CHECK_STRUCT_MEMBER("struct stat" st_mtime_usec
585
"sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIME_USEC)
586
# Check for block size support in struct stat
587
CHECK_STRUCT_MEMBER("struct stat" st_blksize
588
"sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_BLKSIZE)
589
# Check for st_flags in struct stat (BSD fflags)
590
CHECK_STRUCT_MEMBER("struct stat" st_flags
591
"sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_FLAGS)
594
CHECK_STRUCT_MEMBER("struct tm" tm_sec
595
"sys/types.h;sys/time.h;time.h" TIME_WITH_SYS_TIME)
598
# Check for integer types
600
# XXX There must be a way to make this simpler <sigh> XXXX
602
CHECK_TYPE_SIZE("long long int" LONG_LONG_INT)
603
CHECK_TYPE_SIZE("unsigned long long" UNSIGNED_LONG_LONG)
604
CHECK_TYPE_SIZE("unsigned long long int" UNSIGNED_LONG_LONG_INT)
607
CHECK_TYPE_SIZE(dev_t DEV_T)
610
SET(dev_t "unsigned int")
612
ENDIF(NOT HAVE_DEV_T)
614
CHECK_TYPE_SIZE(gid_t GID_T)
619
SET(gid_t "unsigned int")
621
ENDIF(NOT HAVE_GID_T)
623
CHECK_TYPE_SIZE(id_t ID_T)
628
SET(id_t "unsigned int")
632
CHECK_TYPE_SIZE(int32_t INT32_T)
635
ENDIF(NOT HAVE_INT32_T)
637
CHECK_TYPE_SIZE(int64_t INT64_T)
642
ENDIF(NOT HAVE_INT64_T)
644
CHECK_TYPE_SIZE(intmax_t INTMAX_T)
645
IF(NOT HAVE_INTMAX_T)
646
SET(intmax_t "int64_t")
647
ENDIF(NOT HAVE_INTMAX_T)
649
CHECK_TYPE_SIZE(mode_t MODE_T)
652
SET(mode_t "unsigned short")
656
ENDIF(NOT HAVE_MODE_T)
658
CHECK_TYPE_SIZE(off_t OFF_T)
661
ENDIF(NOT HAVE_OFF_T)
663
CHECK_TYPE_SIZE(size_t SIZE_T)
665
IF("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
666
SET(size_t "uint64_t")
667
ELSE("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
668
SET(size_t "uint32_t")
669
ENDIF("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
670
ENDIF(NOT HAVE_SIZE_T)
672
CHECK_TYPE_SIZE(ssize_t SSIZE_T)
674
IF("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
675
SET(ssize_t "int64_t")
676
ELSE("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
678
ENDIF("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
679
ENDIF(NOT HAVE_SSIZE_T)
681
CHECK_TYPE_SIZE(uid_t UID_T)
686
SET(uid_t "unsigned int")
688
ENDIF(NOT HAVE_UID_T)
690
CHECK_TYPE_SIZE(pid_t PID_T)
695
MESSAGE(FATAL_ERROR "pid_t doesn't exist on this platform?")
697
ENDIF(NOT HAVE_PID_T)
699
CHECK_TYPE_SIZE(uint16_t UINT16_T)
700
IF(NOT HAVE_UINT16_T)
701
SET(uint16_t "unsigned short")
702
ENDIF(NOT HAVE_UINT16_T)
704
CHECK_TYPE_SIZE(uint32_t UINT32_T)
705
IF(NOT HAVE_UINT32_T)
706
SET(uint32_t "unsigned int")
707
ENDIF(NOT HAVE_UINT32_T)
709
CHECK_TYPE_SIZE(uint64_t UINT64_T)
710
IF(NOT HAVE_UINT64_T)
712
SET(uint64_t "unsigned __int64")
714
ENDIF(NOT HAVE_UINT64_T)
716
CHECK_TYPE_SIZE(uintmax_t UINTMAX_T)
717
IF(NOT HAVE_UINTMAX_T)
718
SET(uintmax_t "uint64_t")
719
ENDIF(NOT HAVE_UINTMAX_T)
721
CHECK_TYPE_SIZE(intptr_t INTPTR_T)
722
IF(NOT HAVE_INTPTR_T)
723
IF("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
724
SET(intptr_t "int64_t")
726
SET(intptr_t "int32_t")
728
ENDIF(NOT HAVE_INTPTR_T)
730
CHECK_TYPE_SIZE(uintptr_t UINTPTR_T)
731
IF(NOT HAVE_UINTPTR_T)
732
IF("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
733
SET(uintptr_t "uint64_t")
735
SET(uintptr_t "uint32_t")
737
ENDIF(NOT HAVE_UINTPTR_T)
739
CHECK_TYPE_SIZE(wchar_t SIZEOF_WCHAR_T)
740
IF(HAVE_SIZEOF_WCHAR_T)
742
ENDIF(HAVE_SIZEOF_WCHAR_T)
744
# Check if _FILE_OFFSET_BITS macro needed for large files
746
CHECK_FILE_OFFSET_BITS()
751
# Check for Extended Attribute libraries, headers, and functions
754
LA_CHECK_INCLUDE_FILE(attr/xattr.h HAVE_ATTR_XATTR_H)
755
LA_CHECK_INCLUDE_FILE(sys/xattr.h HAVE_SYS_XATTR_H)
756
LA_CHECK_INCLUDE_FILE(sys/extattr.h HAVE_SYS_EXTATTR_H)
757
CHECK_LIBRARY_EXISTS(attr "setxattr" "" HAVE_ATTR_LIB)
759
SET(CMAKE_REQUIRED_LIBRARIES "attr")
761
CHECK_SYMBOL_EXISTS(EXTATTR_NAMESPACE_USER "sys/types.h;sys/extattr.h" HAVE_DECL_EXTATTR_NAMESPACE_USER)
762
CHECK_FUNCTION_EXISTS_GLIBC(extattr_get_file HAVE_EXTATTR_GET_FILE)
763
CHECK_FUNCTION_EXISTS_GLIBC(extattr_list_file HAVE_EXTATTR_LIST_FILE)
764
CHECK_FUNCTION_EXISTS_GLIBC(extattr_set_fd HAVE_EXTATTR_SET_FD)
765
CHECK_FUNCTION_EXISTS_GLIBC(extattr_set_file HAVE_EXTATTR_SET_FILE)
766
CHECK_FUNCTION_EXISTS_GLIBC(fsetxattr HAVE_FSETXATTR)
767
CHECK_FUNCTION_EXISTS_GLIBC(getxattr HAVE_GETXATTR)
768
CHECK_FUNCTION_EXISTS_GLIBC(lgetxattr HAVE_LGETXATTR)
769
CHECK_FUNCTION_EXISTS_GLIBC(listxattr HAVE_LISTXATTR)
770
CHECK_FUNCTION_EXISTS_GLIBC(llistxattr HAVE_LLISTXATTR)
771
CHECK_FUNCTION_EXISTS_GLIBC(lsetxattr HAVE_LSETXATTR)
775
# Check for ACL libraries, headers, and functions
777
# The ACL support in libarchive is written against the POSIX1e draft,
778
# which was never officially approved and varies quite a bit across
779
# platforms. Worse, some systems have completely non-POSIX acl functions,
780
# which makes the following checks rather more complex than I would like.
783
CHECK_LIBRARY_EXISTS(acl "acl_get_file" "" HAVE_ACL_LIB)
785
SET(CMAKE_REQUIRED_LIBRARIES "acl")
786
FIND_LIBRARY(ACL_LIBRARY NAMES acl)
787
LIST(APPEND ADDITIONAL_LIBS ${ACL_LIBRARY})
790
CHECK_FUNCTION_EXISTS_GLIBC(acl_create_entry HAVE_ACL_CREATE_ENTRY)
791
CHECK_FUNCTION_EXISTS_GLIBC(acl_init HAVE_ACL_INIT)
792
CHECK_FUNCTION_EXISTS_GLIBC(acl_set_fd HAVE_ACL_SET_FD)
793
CHECK_FUNCTION_EXISTS_GLIBC(acl_set_fd_np HAVE_ACL_SET_FD_NP)
794
CHECK_FUNCTION_EXISTS_GLIBC(acl_set_file HAVE_ACL_SET_FILE)
795
CHECK_TYPE_EXISTS(acl_permset_t "${INCLUDES}" HAVE_ACL_PERMSET_T)
797
# The "acl_get_perm()" function was omitted from the POSIX draft.
798
# (It's a pretty obvious oversight; otherwise, there's no way to
799
# test for specific permissions in a permset.) Linux uses the obvious
800
# name, FreeBSD adds _np to mark it as "non-Posix extension."
801
# Test for both as a double-check that we really have POSIX-style ACL support.
802
CHECK_SYMBOL_EXISTS(acl_get_perm "${INCLUDES}" HAVE_ACL_GET_PERM)
803
CHECK_SYMBOL_EXISTS(acl_get_perm_np "${INCLUDES}" HAVE_ACL_GET_PERM_NP)
804
CHECK_SYMBOL_EXISTS(acl_get_link "${INCLUDES}" HAVE_ACL_GET_LINK)
805
CHECK_SYMBOL_EXISTS(acl_get_link_np "${INCLUDES}" HAVE_ACL_GET_LINK_NP)
807
# MacOS has an acl.h that isn't POSIX. It can be detected by
808
# checking for ACL_USER
809
CHECK_SYMBOL_EXISTS(ACL_USER "${INCLUDES}" HAVE_ACL_USER)
812
# Generate "config.h" from "build/cmake/config.h.in"
813
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/build/cmake/config.h.in
814
${CMAKE_CURRENT_BINARY_DIR}/config.h)
815
INCLUDE_DIRECTORIES(BEFORE ${CMAKE_CURRENT_BINARY_DIR})
816
ADD_DEFINITIONS(-DHAVE_CONFIG_H)
819
# Register installation of PDF documents.
821
IF(WIN32 AND NOT CYGWIN)
823
# On Windows platform, It's better that we install PDF documents
825
# These PDF documents are available in the release package.
827
IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/doc/pdf)
828
INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc/pdf
829
DESTINATION share/man
830
FILES_MATCHING PATTERN "*.pdf"
832
ENDIF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/doc/pdf)
833
ENDIF(WIN32 AND NOT CYGWIN)
837
INCLUDE_DIRECTORIES(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/libarchive)
840
ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE)
842
# Especially for early development, we want to be a little
843
# aggressive about diagnosing build problems; this can get
844
# relaxed somewhat in final shipping versions.
845
IF ("CMAKE_C_COMPILER_ID" MATCHES "^GNU$")
846
ADD_DEFINITIONS(-Wall -Werror)
847
ENDIF ("CMAKE_C_COMPILER_ID" MATCHES "^GNU$")
850
ADD_CUSTOM_TARGET(run_all_tests)
853
add_subdirectory(libarchive)
854
add_subdirectory(tar)
855
add_subdirectory(cpio)