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)