Blame CMakeLists.txt

Packit 08bd4c
#
Packit 08bd4c
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12 FATAL_ERROR)
Packit 08bd4c
#
Packit 08bd4c
PROJECT(libarchive C)
Packit 08bd4c
#
Packit 08bd4c
SET(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/build/cmake")
Packit 08bd4c
if(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
Packit 08bd4c
  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${libarchive_BINARY_DIR}/bin)
Packit 08bd4c
endif()
Packit 08bd4c
#
Packit 08bd4c
# Set the Build type for make based generators.
Packit 08bd4c
# You can choose following types:
Packit 08bd4c
#   Debug          : Debug build
Packit 08bd4c
#   Release        : Release build
Packit 08bd4c
#   RelWithDebInfo : Release build with Debug Info
Packit 08bd4c
#   MinSizeRel     : Release Min Size build
Packit 08bd4c
IF(NOT CMAKE_BUILD_TYPE)
Packit 08bd4c
  SET(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build Type" FORCE)
Packit 08bd4c
ENDIF(NOT CMAKE_BUILD_TYPE)
Packit 08bd4c
# Set a value type to properly display CMAKE_BUILD_TYPE on GUI if the
Packit 08bd4c
# value type is "UNINITIALIZED".
Packit 08bd4c
GET_PROPERTY(cached_type CACHE CMAKE_BUILD_TYPE PROPERTY TYPE)
Packit 08bd4c
IF("${cached_type}" STREQUAL "UNINITIALIZED")
Packit 08bd4c
  SET(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING "Build Type" FORCE)
Packit 08bd4c
ENDIF("${cached_type}" STREQUAL "UNINITIALIZED")
Packit 08bd4c
# Check the Build Type.
Packit 08bd4c
IF(NOT "${CMAKE_BUILD_TYPE}"
Packit 08bd4c
       MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel)\$")
Packit 08bd4c
  MESSAGE(FATAL_ERROR
Packit 08bd4c
          "Unknown keyword for CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}\n"
Packit 08bd4c
          "Acceptable keywords: Debug,Release,RelWithDebInfo,MinSizeRel")
Packit 08bd4c
ENDIF(NOT "${CMAKE_BUILD_TYPE}"
Packit 08bd4c
          MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel)\$")
Packit 08bd4c
Packit 08bd4c
# On MacOS, prefer MacPorts libraries to system libraries.
Packit 08bd4c
# I haven't come up with a compelling argument for this to be conditional.
Packit 08bd4c
list(APPEND CMAKE_PREFIX_PATH /opt/local)
Packit 08bd4c
# Enable @rpath in the install name.
Packit 08bd4c
# detail in "cmake  --help-policy CMP0042"
Packit 08bd4c
SET(CMAKE_MACOSX_RPATH ON)
Packit 08bd4c
Packit 08bd4c
#
Packit 08bd4c
# Version - read from 'version' file.
Packit 08bd4c
#
Packit 08bd4c
FILE(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/build/version _version)
Packit 08bd4c
STRING(REGEX REPLACE
Packit 08bd4c
 "^([0-9])[0-9][0-9][0-9][0-9][0-9][0-9][a-z]*$" "\\1" _major ${_version})
Packit 08bd4c
STRING(REGEX REPLACE
Packit 08bd4c
 "^[0-9]([0-9][0-9][0-9])[0-9][0-9][0-9][a-z]*$" "\\1" _minor ${_version})
Packit 08bd4c
STRING(REGEX REPLACE
Packit 08bd4c
 "^[0-9][0-9][0-9][0-9]([0-9][0-9][0-9])[a-z]*$" "\\1" _revision ${_version})
Packit 08bd4c
STRING(REGEX REPLACE
Packit 08bd4c
 "^[0-9][0-9][0-9][0-9][0-9][0-9][0-9]([a-z]*)$" "\\1" _quality ${_version})
Packit 08bd4c
SET(_version_number ${_major}${_minor}${_revision})
Packit 08bd4c
STRING(REGEX REPLACE "[0]*([^0]*[0-9])$" "\\1" _trimmed_minor ${_minor})
Packit 08bd4c
STRING(REGEX REPLACE "[0]*([^0]*[0-9])$" "\\1" _trimmed_revision ${_revision})
Packit 08bd4c
#
Packit 08bd4c
SET(VERSION                    "${_major}.${_trimmed_minor}.${_trimmed_revision}${_quality}")
Packit 08bd4c
SET(BSDCPIO_VERSION_STRING     "${VERSION}")
Packit 08bd4c
SET(BSDTAR_VERSION_STRING      "${VERSION}")
Packit 08bd4c
SET(BSDCAT_VERSION_STRING      "${VERSION}")
Packit 08bd4c
SET(LIBARCHIVE_VERSION_NUMBER  "${_version_number}")
Packit 08bd4c
SET(LIBARCHIVE_VERSION_STRING  "${VERSION}")
Packit 08bd4c
Packit 08bd4c
# INTERFACE_VERSION increments with every release
Packit 08bd4c
# libarchive 2.7 == interface version 9 = 2 + 7
Packit 08bd4c
# libarchive 2.8 == interface version 10 = 2 + 8
Packit 08bd4c
# libarchive 2.9 == interface version 11 = 2 + 9
Packit 08bd4c
# libarchive 3.0 == interface version 12
Packit 08bd4c
# libarchive 3.1 == interface version 13
Packit 08bd4c
math(EXPR INTERFACE_VERSION  "13 + ${_minor}")
Packit 08bd4c
Packit 08bd4c
# Set SOVERSION == Interface version
Packit 08bd4c
# ?? Should there be more here ??
Packit 08bd4c
SET(SOVERSION "${INTERFACE_VERSION}")
Packit 08bd4c
Packit 08bd4c
# Enalbe CMAKE_PUSH_CHECK_STATE() and CMAKE_POP_CHECK_STATE() macros
Packit 08bd4c
# saving and restoring the state of the variables.
Packit 08bd4c
INCLUDE(CMakePushCheckState)
Packit 08bd4c
Packit 08bd4c
# Initialize the state of the variables. This initialization is not
Packit 08bd4c
# necessary but this shows you what value the variables initially have.
Packit 08bd4c
SET(CMAKE_REQUIRED_DEFINITIONS)
Packit 08bd4c
SET(CMAKE_REQUIRED_INCLUDES)
Packit 08bd4c
SET(CMAKE_REQUIRED_LIBRARIES)
Packit 08bd4c
SET(CMAKE_REQUIRED_FLAGS)
Packit 08bd4c
Packit 08bd4c
# Especially for early development, we want to be a little
Packit 08bd4c
# aggressive about diagnosing build problems; this can get
Packit 08bd4c
# relaxed somewhat in final shipping versions.
Packit 08bd4c
IF (CMAKE_C_COMPILER_ID MATCHES "^GNU$")
Packit 08bd4c
  SET(CMAKE_REQUIRED_FLAGS "-Wall -Wformat -Wformat-security")
Packit 08bd4c
  #################################################################
Packit 08bd4c
  # Set compile flags for all build types.
Packit 08bd4c
  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wformat -Wformat-security")
Packit 08bd4c
  #################################################################
Packit 08bd4c
  # Set compile flags for debug build.
Packit 08bd4c
  # This is added into CMAKE_C_FLAGS when CMAKE_BUILD_TYPE is "Debug"
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Werror")
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wextra")
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wunused")
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wshadow")
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wmissing-prototypes")
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wcast-qual")
Packit 08bd4c
ENDIF (CMAKE_C_COMPILER_ID MATCHES "^GNU$")
Packit 08bd4c
IF (CMAKE_C_COMPILER_ID MATCHES "^Clang$")
Packit 08bd4c
  SET(CMAKE_REQUIRED_FLAGS "-Wall -Wformat -Wformat-security")
Packit 08bd4c
  #################################################################
Packit 08bd4c
  # Set compile flags for all build types.
Packit 08bd4c
  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wformat -Wformat-security")
Packit 08bd4c
  #################################################################
Packit 08bd4c
  # Set compile flags for debug build.
Packit 08bd4c
  # This is added into CMAKE_C_FLAGS when CMAKE_BUILD_TYPE is "Debug"
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g")
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Werror")
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wextra")
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wunused")
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wshadow")
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wmissing-prototypes")
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wcast-qual")
Packit 08bd4c
ENDIF (CMAKE_C_COMPILER_ID MATCHES "^Clang$")
Packit 08bd4c
IF (CMAKE_C_COMPILER_ID MATCHES "^XL$")
Packit 08bd4c
  SET(CMAKE_C_COMPILER "xlc_r")
Packit 08bd4c
  SET(CMAKE_REQUIRED_FLAGS "-qflag=e:e -qformat=sec")
Packit 08bd4c
  #################################################################
Packit 08bd4c
  # Set compile flags for all build types.
Packit 08bd4c
  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -qflag=e:e -qformat=sec")
Packit 08bd4c
  #################################################################
Packit 08bd4c
  # Set compile flags for debug build.
Packit 08bd4c
  # This is added into CMAKE_C_FLAGS when CMAKE_BUILD_TYPE is "Debug"
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g")
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -qhalt=w")
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -qflag=w:w")
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -qinfo=pro:use")
Packit 08bd4c
ENDIF(CMAKE_C_COMPILER_ID MATCHES "^XL$")
Packit 08bd4c
IF (MSVC)
Packit 08bd4c
  #################################################################
Packit 08bd4c
  # Set compile flags for debug build.
Packit 08bd4c
  # This is added into CMAKE_C_FLAGS when CMAKE_BUILD_TYPE is "Debug"
Packit 08bd4c
  # Enable level 4 C4061: The enumerate has no associated handler in a switch
Packit 08bd4c
  #                       statement.
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4061")
Packit 08bd4c
  # Enable level 4 C4254: A larger bit field was assigned to a smaller bit
Packit 08bd4c
  #                       field.
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4254")
Packit 08bd4c
  # Enable level 4 C4295: An array was initialized but the last character in
Packit 08bd4c
  #                       the array is not a null; accessing the array may
Packit 08bd4c
  #                       produce unexpected results.
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4295")
Packit 08bd4c
  # Enable level 4 C4296: An unsigned variable was used in a comparison
Packit 08bd4c
  #                       operation with zero.
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4296")
Packit 08bd4c
  # Enable level 4 C4389: An operation involved signed and unsigned variables.
Packit 08bd4c
  #                       This could result in a loss of data.
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4389")
Packit 08bd4c
  # Enable level 4 C4505: The given function is local and not referenced in
Packit 08bd4c
  #                       the body of the module; therefore, the function is
Packit 08bd4c
  #                       dead code.
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4505")
Packit 08bd4c
  # Enable level 4 C4514: The optimizer removed an inline function that is not
Packit 08bd4c
  #                       called.
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4514")
Packit 08bd4c
  # Enable level 4 C4702: Unreachable code.
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4702")
Packit 08bd4c
  # Enable level 4 C4706: The test value in a conditional expression was the
Packit 08bd4c
  #                       result of an assignment.
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4706")
Packit 08bd4c
  # /WX option is the same as gcc's -Werror option.
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /WX")
Packit 08bd4c
  # /Oi option enables built-in functions.
Packit 08bd4c
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /Oi")
Packit 08bd4c
  #################################################################
Packit 08bd4c
  # Set compile flags for release build.
Packit 08bd4c
  SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Oi")
Packit 08bd4c
ENDIF (MSVC)
Packit 08bd4c
Packit 08bd4c
# Enable CTest/CDash support
Packit 08bd4c
include(CTest)
Packit 08bd4c
Packit 08bd4c
OPTION(ENABLE_NETTLE "Enable use of Nettle" ON)
Packit 08bd4c
OPTION(ENABLE_OPENSSL "Enable use of OpenSSL" ON)
Packit 08bd4c
OPTION(ENABLE_LZO "Enable the use of the system LZO library if found" OFF)
Packit 08bd4c
OPTION(ENABLE_LZMA "Enable the use of the system LZMA library if found" ON)
Packit 08bd4c
Packit 08bd4c
OPTION(ENABLE_ZLIB "Enable the use of the system ZLIB library if found" ON)
Packit 08bd4c
OPTION(ENABLE_BZip2 "Enable the use of the system BZip2 library if found" ON)
Packit 08bd4c
OPTION(ENABLE_LIBXML2 "Enable the use of the system libxml2 library if found" ON)
Packit 08bd4c
OPTION(ENABLE_EXPAT "Enable the use of the system EXPAT library if found" ON)
Packit 08bd4c
OPTION(ENABLE_PCREPOSIX "Enable the use of the system PCREPOSIX library if found" ON)
Packit 08bd4c
OPTION(ENABLE_LibGCC "Enable the use of the system LibGCC library if found" ON)
Packit 08bd4c
# CNG is used for encrypt/decrypt Zip archives on Windows.
Packit 08bd4c
OPTION(ENABLE_CNG "Enable the use of CNG(Crypto Next Generation)" ON)
Packit 08bd4c
Packit 08bd4c
OPTION(ENABLE_TAR "Enable tar building" ON)
Packit 08bd4c
OPTION(ENABLE_TAR_SHARED "Enable dynamic build of tar" FALSE)
Packit 08bd4c
OPTION(ENABLE_CPIO "Enable cpio building" ON)
Packit 08bd4c
OPTION(ENABLE_CPIO_SHARED "Enable dynamic build of cpio" FALSE)
Packit 08bd4c
OPTION(ENABLE_CAT "Enable cat building" ON)
Packit 08bd4c
OPTION(ENABLE_CAT_SHARED "Enable dynamic build of cat" FALSE)
Packit 08bd4c
OPTION(ENABLE_XATTR "Enable extended attribute support" ON)
Packit 08bd4c
OPTION(ENABLE_ACL "Enable ACL support" ON)
Packit 08bd4c
OPTION(ENABLE_ICONV "Enable iconv support" ON)
Packit 08bd4c
OPTION(ENABLE_TEST "Enable unit and regression tests" ON)
Packit 08bd4c
OPTION(ENABLE_COVERAGE "Enable code coverage (GCC only, automatically sets ENABLE_TEST to ON)" FALSE)
Packit 08bd4c
OPTION(ENABLE_INSTALL "Enable installing of libraries" ON)
Packit 08bd4c
Packit 08bd4c
SET(POSIX_REGEX_LIB "AUTO" CACHE STRING "Choose what library should provide POSIX regular expression support")
Packit 08bd4c
SET(ENABLE_SAFESEH "AUTO" CACHE STRING "Enable use of /SAFESEH linker flag (MSVC only)")
Packit 08bd4c
SET(WINDOWS_VERSION "WIN7" CACHE STRING "Set Windows version to use (Windows only)")
Packit 08bd4c
Packit 08bd4c
IF(ENABLE_COVERAGE)
Packit 08bd4c
	include(LibarchiveCodeCoverage)
Packit 08bd4c
ENDIF(ENABLE_COVERAGE)
Packit 08bd4c
Packit 08bd4c
IF(ENABLE_TEST)
Packit 08bd4c
	ENABLE_TESTING()
Packit 08bd4c
ENDIF(ENABLE_TEST)
Packit 08bd4c
Packit 08bd4c
IF(WIN32)
Packit 08bd4c
  IF(WINDOWS_VERSION STREQUAL "WIN8")
Packit 08bd4c
    SET(NTDDI_VERSION 0x06020000)
Packit 08bd4c
    SET(_WIN32_WINNT 0x0602)
Packit 08bd4c
    SET(WINVER 0x0602)
Packit 08bd4c
  ELSEIF(WINDOWS_VERSION STREQUAL "WIN7")
Packit 08bd4c
    SET(NTDDI_VERSION 0x06010000)
Packit 08bd4c
    SET(_WIN32_WINNT 0x0601)
Packit 08bd4c
    SET(WINVER 0x0601)
Packit 08bd4c
  ELSEIF(WINDOWS_VERSION STREQUAL "WS08")
Packit 08bd4c
    SET(NTDDI_VERSION 0x06000100)
Packit 08bd4c
    SET(_WIN32_WINNT 0x0600)
Packit 08bd4c
    SET(WINVER 0x0600)
Packit 08bd4c
  ELSEIF(WINDOWS_VERSION STREQUAL "VISTA")
Packit 08bd4c
    SET(NTDDI_VERSION 0x06000000)
Packit 08bd4c
    SET(_WIN32_WINNT 0x0600)
Packit 08bd4c
    SET(WINVER 0x0600)
Packit 08bd4c
  ELSEIF(WINDOWS_VERSION STREQUAL "WS03")
Packit 08bd4c
    SET(NTDDI_VERSION 0x05020000)
Packit 08bd4c
    SET(_WIN32_WINNT 0x0502)
Packit 08bd4c
    SET(WINVER 0x0502)
Packit 08bd4c
  ELSEIF(WINDOWS_VERSION STREQUAL "WINXP")
Packit 08bd4c
    SET(NTDDI_VERSION 0x05010000)
Packit 08bd4c
    SET(_WIN32_WINNT 0x0501)
Packit 08bd4c
    SET(WINVER 0x0501)
Packit 08bd4c
  ELSE(WINDOWS_VERSION STREQUAL "WIN8")
Packit 08bd4c
    # Default to Windows Server 2003 API if we don't recognize the specifier
Packit 08bd4c
    SET(NTDDI_VERSION 0x05020000)
Packit 08bd4c
    SET(_WIN32_WINNT 0x0502)
Packit 08bd4c
    SET(WINVER 0x0502)
Packit 08bd4c
  ENDIF(WINDOWS_VERSION STREQUAL "WIN8")
Packit 08bd4c
ENDIF(WIN32)
Packit 08bd4c
Packit 08bd4c
IF(MSVC)
Packit 08bd4c
  IF(ENABLE_SAFESEH STREQUAL "YES")
Packit 08bd4c
    SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH")
Packit 08bd4c
    SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SAFESEH")
Packit 08bd4c
    SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /SAFESEH")
Packit 08bd4c
    SET(ENV{LDFLAGS} "$ENV{LDFLAGS} /SAFESEH")
Packit 08bd4c
  ELSEIF(ENABLE_SAFESEH STREQUAL "NO")
Packit 08bd4c
    SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO")
Packit 08bd4c
    SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SAFESEH:NO")
Packit 08bd4c
    SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /SAFESEH:NO")
Packit 08bd4c
    SET(ENV{LDFLAGS} "$ENV{LDFLAGS} /SAFESEH:NO")
Packit 08bd4c
  ENDIF(ENABLE_SAFESEH STREQUAL "YES")
Packit 08bd4c
ENDIF(MSVC)
Packit 08bd4c
Packit 08bd4c
IF("${CMAKE_C_PLATFORM_ID}" MATCHES "^(HP-UX)$")
Packit 08bd4c
  ADD_DEFINITIONS(-D_XOPEN_SOURCE=500) # Ask wchar.h for mbstate_t
Packit 08bd4c
ENDIF()
Packit 08bd4c
Packit 08bd4c
#
Packit 08bd4c
INCLUDE(CheckCSourceCompiles)
Packit 08bd4c
INCLUDE(CheckCSourceRuns)
Packit 08bd4c
INCLUDE(CheckFileOffsetBits)
Packit 08bd4c
INCLUDE(CheckFuncs)
Packit 08bd4c
INCLUDE(CheckHeaderDirent)
Packit 08bd4c
INCLUDE(CheckIncludeFile)
Packit 08bd4c
INCLUDE(CheckIncludeFiles)
Packit 08bd4c
INCLUDE(CheckLibraryExists)
Packit 08bd4c
INCLUDE(CheckStructHasMember)
Packit 08bd4c
INCLUDE(CheckSymbolExists)
Packit 08bd4c
INCLUDE(CheckTypeExists)
Packit 08bd4c
INCLUDE(CheckTypeSize)
Packit 08bd4c
Packit 08bd4c
#
Packit 08bd4c
# Generate list.h
Packit 08bd4c
#
Packit 08bd4c
MACRO (GENERATE_LIST_H _listfile _cmlist __list_sources)
Packit 08bd4c
  SET(_argv ${ARGV})
Packit 08bd4c
  # Remove _listfile and _cmlist from _argv
Packit 08bd4c
  LIST(REMOVE_AT _argv 0 1)
Packit 08bd4c
  IF (NOT EXISTS "${_listfile}" OR
Packit 08bd4c
     ${_cmlist} IS_NEWER_THAN "${_listfile}")
Packit 08bd4c
Packit 08bd4c
    MESSAGE(STATUS "Generating ${_listfile}")
Packit 08bd4c
    FILE(WRITE ${_listfile} "")
Packit 08bd4c
    FOREACH (testfile ${_argv})
Packit 08bd4c
      IF (testfile MATCHES "^test_[^/]+[.]c$")
Packit 08bd4c
        FILE(STRINGS ${testfile} testvar REGEX "^DEFINE_TEST")
Packit 08bd4c
        FOREACH (deftest ${testvar})
Packit 08bd4c
          FILE(APPEND ${_listfile} "${deftest}\n")
Packit 08bd4c
        ENDFOREACH (deftest)
Packit 08bd4c
      ENDIF (testfile MATCHES "^test_[^/]+[.]c$")
Packit 08bd4c
    ENDFOREACH (testfile)
Packit 08bd4c
Packit 08bd4c
  ENDIF (NOT EXISTS "${_listfile}" OR
Packit 08bd4c
     ${_cmlist} IS_NEWER_THAN "${_listfile}")
Packit 08bd4c
ENDMACRO (GENERATE_LIST_H)
Packit 08bd4c
#
Packit 08bd4c
# Generate installation rules for man pages.
Packit 08bd4c
#
Packit 08bd4c
MACRO (INSTALL_MAN __mans)
Packit 08bd4c
  FOREACH (_man ${ARGV})
Packit 08bd4c
    STRING(REGEX REPLACE "^.+[.]([1-9])" "\\1" _mansect ${_man})
Packit 08bd4c
    INSTALL(FILES ${_man} DESTINATION "share/man/man${_mansect}")
Packit 08bd4c
  ENDFOREACH (_man)
Packit 08bd4c
ENDMACRO (INSTALL_MAN __mans)
Packit 08bd4c
#
Packit 08bd4c
# Find out what macro is needed to use libraries on Windows.
Packit 08bd4c
#
Packit 08bd4c
MACRO (TRY_MACRO_FOR_LIBRARY INCLUDES LIBRARIES
Packit 08bd4c
       TRY_TYPE SAMPLE_SOURCE MACRO_LIST)
Packit 08bd4c
  IF(WIN32 AND NOT CYGWIN)
Packit 08bd4c
    CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
Packit 08bd4c
    SET(CMAKE_REQUIRED_INCLUDES ${INCLUDES})
Packit 08bd4c
    SET(CMAKE_REQUIRED_LIBRARIES ${LIBRARIES})
Packit 08bd4c
    FOREACH(VAR ${MACRO_LIST})
Packit 08bd4c
      # Clear ${VAR} from CACHE If the libraries which ${VAR} was
Packit 08bd4c
      # checked with are changed.
Packit 08bd4c
      SET(VAR_WITH_LIB "${VAR}_WITH_LIB")
Packit 08bd4c
      GET_PROPERTY(PREV_VAR_WITH_LIB VARIABLE PROPERTY ${VAR_WITH_LIB})
Packit 08bd4c
      IF(NOT "${PREV_VAR_WITH_LIB}" STREQUAL "${LIBRARIES}")
Packit 08bd4c
        UNSET(${VAR} CACHE)
Packit 08bd4c
      ENDIF(NOT "${PREV_VAR_WITH_LIB}" STREQUAL "${LIBRARIES}")
Packit 08bd4c
      # Check if the library can be used with the macro.
Packit 08bd4c
      IF("${TRY_TYPE}" MATCHES "COMPILES")
Packit 08bd4c
        CHECK_C_SOURCE_COMPILES("${SAMPLE_SOURCE}" ${VAR})
Packit 08bd4c
      ELSEIF("${TRY_TYPE}" MATCHES "RUNS")
Packit 08bd4c
        CHECK_C_SOURCE_RUNS("${SAMPLE_SOURCE}" ${VAR})
Packit 08bd4c
      ELSE("${TRY_TYPE}" MATCHES "COMPILES")
Packit 08bd4c
        MESSAGE(FATAL_ERROR "UNKNOWN KEYWORD \"${TRY_TYPE}\" FOR TRY_TYPE")
Packit 08bd4c
      ENDIF("${TRY_TYPE}" MATCHES "COMPILES")
Packit 08bd4c
      # Save the libraries which ${VAR} is checked with.
Packit 08bd4c
      SET(${VAR_WITH_LIB} "${LIBRARIES}" CACHE INTERNAL
Packit 08bd4c
          "Macro ${VAR} is checked with")
Packit 08bd4c
    ENDFOREACH(VAR)
Packit 08bd4c
    CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
Packit 08bd4c
  ENDIF(WIN32 AND NOT CYGWIN)
Packit 08bd4c
ENDMACRO (TRY_MACRO_FOR_LIBRARY)
Packit 08bd4c
#
Packit 08bd4c
# Check compress/decompress libraries
Packit 08bd4c
#
Packit 08bd4c
IF(WIN32 AND NOT CMAKE_CL_64 AND NOT CYGWIN)
Packit 08bd4c
  # GnuWin32 is only for Win32, not Win64.
Packit 08bd4c
  SET(__GNUWIN32PATH "C:/Program Files/GnuWin32")
Packit 08bd4c
ENDIF(WIN32 AND NOT CMAKE_CL_64 AND NOT CYGWIN)
Packit 08bd4c
IF(DEFINED __GNUWIN32PATH AND EXISTS "${__GNUWIN32PATH}")
Packit 08bd4c
  # You have to add a path availabel DLL file into PATH environment variable.
Packit 08bd4c
  # Maybe DLL path is "C:/Program Files/GnuWin32/bin".
Packit 08bd4c
  # The zlib and the bzip2 Setup program have installed programs and DLLs into
Packit 08bd4c
  # "C:/Program Files/GnuWin32" by default.
Packit 08bd4c
  # This is convenience setting for Windows.
Packit 08bd4c
  SET(CMAKE_PREFIX_PATH ${__GNUWIN32PATH} $(CMAKE_PREFIX_PATH))
Packit 08bd4c
  #
Packit 08bd4c
  # If you didn't use Setup program or installed into nonstandard path,
Packit 08bd4c
  # cmake cannot find out your zlib or bzip2 libraries and include files,
Packit 08bd4c
  # you should execute cmake with  -DCMAKE_PREFIX_PATH option.
Packit 08bd4c
  #   e.g.
Packit 08bd4c
  #     cmake -DCMAKE_PREFIX_PATH=<your-GnuWin32-path> <path-to-source>
Packit 08bd4c
  #
Packit 08bd4c
  # If compiling error occurred in zconf.h, You may need patch to zconf.h.
Packit 08bd4c
  #--- zconf.h.orig	2005-07-21 00:40:26.000000000
Packit 08bd4c
  #+++ zconf.h	2009-01-19 11:39:10.093750000
Packit 08bd4c
  #@@ -286,7 +286,7 @@
Packit 08bd4c
  #
Packit 08bd4c
  # #if 1           /* HAVE_UNISTD_H -- this line is updated by ./configure */
Packit 08bd4c
  # #  include <sys/types.h> /* for off_t */
Packit 08bd4c
  #-#  include <unistd.h>    /* for SEEK_* and off_t */
Packit 08bd4c
  #+#  include <stdio.h>    /* for SEEK_* and off_t */
Packit 08bd4c
  # #  ifdef VMS
Packit 08bd4c
  # #    include <unixio.h>   /* for off_t */
Packit 08bd4c
  # #  endif
Packit 08bd4c
ENDIF(DEFINED __GNUWIN32PATH AND EXISTS "${__GNUWIN32PATH}")
Packit 08bd4c
Packit 08bd4c
SET(ADDITIONAL_LIBS "")
Packit 08bd4c
#
Packit 08bd4c
# Find ZLIB
Packit 08bd4c
#
Packit 08bd4c
IF(ENABLE_ZLIB)
Packit 08bd4c
  FIND_PACKAGE(ZLIB)
Packit 08bd4c
ELSE()
Packit 08bd4c
  SET(ZLIB_FOUND FALSE) # Override cached value
Packit 08bd4c
ENDIF()
Packit 08bd4c
IF(ZLIB_FOUND)
Packit 08bd4c
  SET(HAVE_LIBZ 1)
Packit 08bd4c
  SET(HAVE_ZLIB_H 1)
Packit 08bd4c
  INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR})
Packit 08bd4c
  LIST(APPEND ADDITIONAL_LIBS ${ZLIB_LIBRARIES})
Packit 08bd4c
  IF(WIN32 AND NOT CYGWIN)
Packit 08bd4c
    #
Packit 08bd4c
    # Test if ZLIB_WINAPI macro is needed to use.
Packit 08bd4c
    #
Packit 08bd4c
    TRY_MACRO_FOR_LIBRARY(
Packit 08bd4c
      "${ZLIB_INCLUDE_DIR}" "${ZLIB_LIBRARIES}"
Packit 08bd4c
      RUNS
Packit 08bd4c
      "#include <zlib.h>\nint main() {uLong f = zlibCompileFlags(); return (f&(1U<<10))?0:-1; }"
Packit 08bd4c
      ZLIB_WINAPI)
Packit 08bd4c
    IF(ZLIB_WINAPI)
Packit 08bd4c
      ADD_DEFINITIONS(-DZLIB_WINAPI)
Packit 08bd4c
    ELSE(ZLIB_WINAPI)
Packit 08bd4c
      # Test if a macro is needed for the library.
Packit 08bd4c
      TRY_MACRO_FOR_LIBRARY(
Packit 08bd4c
        "${ZLIB_INCLUDE_DIR}" "${ZLIB_LIBRARIES}"
Packit 08bd4c
        COMPILES
Packit 08bd4c
        "#include <zlib.h>\nint main() {return zlibVersion()?1:0; }"
Packit 08bd4c
        "ZLIB_DLL;WITHOUT_ZLIB_DLL")
Packit 08bd4c
      IF(ZLIB_DLL)
Packit 08bd4c
        ADD_DEFINITIONS(-DZLIB_DLL)
Packit 08bd4c
      ENDIF(ZLIB_DLL)
Packit 08bd4c
    ENDIF(ZLIB_WINAPI)
Packit 08bd4c
  ENDIF(WIN32 AND NOT CYGWIN)
Packit 08bd4c
ENDIF(ZLIB_FOUND)
Packit 08bd4c
MARK_AS_ADVANCED(CLEAR ZLIB_INCLUDE_DIR)
Packit 08bd4c
MARK_AS_ADVANCED(CLEAR ZLIB_LIBRARY)
Packit 08bd4c
#
Packit 08bd4c
# Find BZip2
Packit 08bd4c
#
Packit 08bd4c
IF(ENABLE_BZip2)
Packit 08bd4c
  FIND_PACKAGE(BZip2)
Packit 08bd4c
ELSE()
Packit 08bd4c
  SET(BZIP2_FOUND FALSE) # Override cached value
Packit 08bd4c
ENDIF()
Packit 08bd4c
IF(BZIP2_FOUND)
Packit 08bd4c
  SET(HAVE_LIBBZ2 1)
Packit 08bd4c
  SET(HAVE_BZLIB_H 1)
Packit 08bd4c
  INCLUDE_DIRECTORIES(${BZIP2_INCLUDE_DIR})
Packit 08bd4c
  LIST(APPEND ADDITIONAL_LIBS ${BZIP2_LIBRARIES})
Packit 08bd4c
  # Test if a macro is needed for the library.
Packit 08bd4c
  TRY_MACRO_FOR_LIBRARY(
Packit 08bd4c
    "${BZIP2_INCLUDE_DIR}" "${BZIP2_LIBRARIES}"
Packit 08bd4c
    COMPILES
Packit 08bd4c
    "#include <bzlib.h>\nint main() {return BZ2_bzlibVersion()?1:0; }"
Packit 08bd4c
    "USE_BZIP2_DLL;USE_BZIP2_STATIC")
Packit 08bd4c
  IF(USE_BZIP2_DLL)
Packit 08bd4c
    ADD_DEFINITIONS(-DUSE_BZIP2_DLL)
Packit 08bd4c
  ELSEIF(USE_BZIP2_STATIC)
Packit 08bd4c
    ADD_DEFINITIONS(-DUSE_BZIP2_STATIC)
Packit 08bd4c
  ENDIF(USE_BZIP2_DLL)
Packit 08bd4c
ENDIF(BZIP2_FOUND)
Packit 08bd4c
MARK_AS_ADVANCED(CLEAR BZIP2_INCLUDE_DIR)
Packit 08bd4c
MARK_AS_ADVANCED(CLEAR BZIP2_LIBRARIES)
Packit 08bd4c
Packit 08bd4c
Packit 08bd4c
#
Packit 08bd4c
# Find LZMA
Packit 08bd4c
#
Packit 08bd4c
IF(ENABLE_LZMA)
Packit 08bd4c
  FIND_PACKAGE(LibLZMA)
Packit 08bd4c
ELSE()
Packit 08bd4c
  SET(LIBZMA_FOUND FALSE) # Override cached value
Packit 08bd4c
ENDIF()
Packit 08bd4c
Packit 08bd4c
IF(LIBLZMA_FOUND)
Packit 08bd4c
  SET(HAVE_LIBLZMA 1)
Packit 08bd4c
  SET(HAVE_LZMA_H 1)
Packit 08bd4c
  SET(CMAKE_REQUIRED_INCLUDES ${LIBLZMA_INCLUDE_DIR})
Packit 08bd4c
  SET(CMAKE_REQUIRED_LIBRARIES ${LIBLZMA_LIBRARIES})
Packit 08bd4c
  INCLUDE_DIRECTORIES(${LIBLZMA_INCLUDE_DIRS})
Packit 08bd4c
  LIST(APPEND ADDITIONAL_LIBS ${LIBLZMA_LIBRARIES})
Packit 08bd4c
  # Test if a macro is needed for the library.
Packit 08bd4c
  TRY_MACRO_FOR_LIBRARY(
Packit 08bd4c
    "${LIBLZMA_INCLUDE_DIRS}" "${LIBLZMA_LIBRARIES}"
Packit 08bd4c
    COMPILES
Packit 08bd4c
    "#include <lzma.h>\nint main() {return (int)lzma_version_number(); }"
Packit 08bd4c
    "WITHOUT_LZMA_API_STATIC;LZMA_API_STATIC")
Packit 08bd4c
  IF(NOT WITHOUT_LZMA_API_STATIC AND LZMA_API_STATIC)
Packit 08bd4c
    ADD_DEFINITIONS(-DLZMA_API_STATIC)
Packit 08bd4c
  ENDIF(NOT WITHOUT_LZMA_API_STATIC AND LZMA_API_STATIC)
Packit 08bd4c
ELSE(LIBLZMA_FOUND)
Packit 08bd4c
# LZMA not found and will not be used.
Packit 08bd4c
ENDIF(LIBLZMA_FOUND)
Packit 08bd4c
#
Packit 08bd4c
# Find LZO2
Packit 08bd4c
#
Packit 08bd4c
IF(ENABLE_LZO)
Packit 08bd4c
  IF (LZO2_INCLUDE_DIR)
Packit 08bd4c
    # Already in cache, be silent
Packit 08bd4c
    SET(LZO2_FIND_QUIETLY TRUE)
Packit 08bd4c
  ENDIF (LZO2_INCLUDE_DIR)
Packit 08bd4c
Packit 08bd4c
  FIND_PATH(LZO2_INCLUDE_DIR lzo/lzoconf.h)
Packit 08bd4c
  FIND_LIBRARY(LZO2_LIBRARY NAMES lzo2 liblzo2)
Packit 08bd4c
  INCLUDE(FindPackageHandleStandardArgs)
Packit 08bd4c
  FIND_PACKAGE_HANDLE_STANDARD_ARGS(LZO2 DEFAULT_MSG LZO2_LIBRARY LZO2_INCLUDE_DIR)
Packit 08bd4c
ELSE(ENABLE_LZO)
Packit 08bd4c
  SET(LIBZMA_FOUND FALSE) # Override cached value
Packit 08bd4c
ENDIF(ENABLE_LZO)
Packit 08bd4c
IF(LZO2_FOUND)
Packit 08bd4c
  SET(HAVE_LIBLZO2 1)
Packit 08bd4c
  SET(HAVE_LZO_LZOCONF_H 1)
Packit 08bd4c
  SET(HAVE_LZO_LZO1X_H 1)
Packit 08bd4c
  INCLUDE_DIRECTORIES(${LZO2_INCLUDE_DIR})
Packit 08bd4c
  LIST(APPEND ADDITIONAL_LIBS ${LZO2_LIBRARY})
Packit 08bd4c
  #
Packit 08bd4c
  # TODO: test for static library.
Packit 08bd4c
  #
Packit 08bd4c
ENDIF(LZO2_FOUND)
Packit 08bd4c
MARK_AS_ADVANCED(CLEAR LZO2_INCLUDE_DIR)
Packit 08bd4c
MARK_AS_ADVANCED(CLEAR LZO2_LIBRARY)
Packit 08bd4c
#
Packit 08bd4c
# Find LZ4
Packit 08bd4c
#
Packit 08bd4c
IF (LZ4_INCLUDE_DIR)
Packit 08bd4c
  # Already in cache, be silent
Packit 08bd4c
  SET(LZ4_FIND_QUIETLY TRUE)
Packit 08bd4c
ENDIF (LZ4_INCLUDE_DIR)
Packit 08bd4c
Packit 08bd4c
FIND_PATH(LZ4_INCLUDE_DIR lz4.h)
Packit 08bd4c
FIND_LIBRARY(LZ4_LIBRARY NAMES lz4 liblz4)
Packit 08bd4c
INCLUDE(FindPackageHandleStandardArgs)
Packit 08bd4c
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LZ4 DEFAULT_MSG LZ4_LIBRARY LZ4_INCLUDE_DIR)
Packit 08bd4c
IF(LZ4_FOUND)
Packit 08bd4c
  SET(HAVE_LIBLZ4 1)
Packit 08bd4c
  SET(HAVE_LZ4_H 1)
Packit 08bd4c
  CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
Packit 08bd4c
  SET(CMAKE_REQUIRED_INCLUDES ${LZ4_INCLUDE_DIR})
Packit 08bd4c
  CHECK_INCLUDE_FILES("lz4hc.h" HAVE_LZ4HC_H)
Packit 08bd4c
  CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
Packit 08bd4c
  INCLUDE_DIRECTORIES(${LZ4_INCLUDE_DIR})
Packit 08bd4c
  LIST(APPEND ADDITIONAL_LIBS ${LZ4_LIBRARY})
Packit 08bd4c
  #
Packit 08bd4c
  # TODO: test for static library.
Packit 08bd4c
  #
Packit 08bd4c
ENDIF(LZ4_FOUND)
Packit 08bd4c
MARK_AS_ADVANCED(CLEAR LZ4_INCLUDE_DIR)
Packit 08bd4c
MARK_AS_ADVANCED(CLEAR LZ4_LIBRARY)
Packit 08bd4c
Packit 08bd4c
#
Packit 08bd4c
# Check headers
Packit 08bd4c
#
Packit 08bd4c
CHECK_HEADER_DIRENT()
Packit 08bd4c
Packit 08bd4c
SET(INCLUDES "")
Packit 08bd4c
MACRO (LA_CHECK_INCLUDE_FILE header var)
Packit 08bd4c
      CHECK_INCLUDE_FILES("${INCLUDES};${header}" ${var})
Packit 08bd4c
      IF (${var})
Packit 08bd4c
      	 SET(INCLUDES ${INCLUDES} ${header})
Packit 08bd4c
      ENDIF (${var})
Packit 08bd4c
ENDMACRO (LA_CHECK_INCLUDE_FILE)
Packit 08bd4c
Packit 08bd4c
# Some FreeBSD headers assume sys/types.h was already included.
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("sys/types.h" HAVE_SYS_TYPES_H)
Packit 08bd4c
Packit 08bd4c
# Alphabetize the rest unless there's a compelling reason
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("acl/libacl.h" HAVE_ACL_LIBACL_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("attr/xattr.h" HAVE_ATTR_XATTR_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("ctype.h" HAVE_CTYPE_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("copyfile.h" HAVE_COPYFILE_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("direct.h" HAVE_DIRECT_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("dlfcn.h" HAVE_DLFCN_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("errno.h" HAVE_ERRNO_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("ext2fs/ext2_fs.h" HAVE_EXT2FS_EXT2_FS_H)
Packit 08bd4c
Packit 08bd4c
CHECK_C_SOURCE_COMPILES("#include <sys/ioctl.h>
Packit 08bd4c
#include <ext2fs/ext2_fs.h>
Packit 08bd4c
int main(void) { return EXT2_IOC_GETFLAGS; }" HAVE_WORKING_EXT2_IOC_GETFLAGS)
Packit 08bd4c
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("fcntl.h" HAVE_FCNTL_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("grp.h" HAVE_GRP_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("inttypes.h" HAVE_INTTYPES_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("io.h" HAVE_IO_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("langinfo.h" HAVE_LANGINFO_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("limits.h" HAVE_LIMITS_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("linux/types.h" HAVE_LINUX_TYPES_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("linux/fiemap.h" HAVE_LINUX_FIEMAP_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("linux/fs.h" HAVE_LINUX_FS_H)
Packit 08bd4c
Packit 08bd4c
CHECK_C_SOURCE_COMPILES("#include <sys/ioctl.h>
Packit 08bd4c
#include <linux/fs.h>
Packit 08bd4c
int main(void) { return FS_IOC_GETFLAGS; }" HAVE_WORKING_FS_IOC_GETFLAGS)
Packit 08bd4c
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("linux/magic.h" HAVE_LINUX_MAGIC_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("locale.h" HAVE_LOCALE_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("membership.h" HAVE_MEMBERSHIP_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("memory.h" HAVE_MEMORY_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("paths.h" HAVE_PATHS_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("poll.h" HAVE_POLL_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("process.h" HAVE_PROCESS_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("pthread.h" HAVE_PTHREAD_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("pwd.h" HAVE_PWD_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("readpassphrase.h" HAVE_READPASSPHRASE_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("regex.h" HAVE_REGEX_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("signal.h" HAVE_SIGNAL_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("spawn.h" HAVE_SPAWN_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("stdarg.h" HAVE_STDARG_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("stdint.h" HAVE_STDINT_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("stdlib.h" HAVE_STDLIB_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("string.h" HAVE_STRING_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("strings.h" HAVE_STRINGS_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("sys/acl.h" HAVE_SYS_ACL_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("sys/cdefs.h" HAVE_SYS_CDEFS_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("sys/extattr.h" HAVE_SYS_EXTATTR_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("sys/ioctl.h" HAVE_SYS_IOCTL_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("sys/mkdev.h" HAVE_SYS_MKDEV_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("sys/mount.h" HAVE_SYS_MOUNT_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("sys/param.h" HAVE_SYS_PARAM_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("sys/poll.h" HAVE_SYS_POLL_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("sys/richacl.h" HAVE_SYS_RICHACL_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("sys/select.h" HAVE_SYS_SELECT_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("sys/stat.h" HAVE_SYS_STAT_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("sys/statfs.h" HAVE_SYS_STATFS_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("sys/statvfs.h" HAVE_SYS_STATVFS_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("sys/time.h" HAVE_SYS_TIME_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("sys/utime.h" HAVE_SYS_UTIME_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("sys/utsname.h" HAVE_SYS_UTSNAME_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("sys/vfs.h" HAVE_SYS_VFS_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("sys/wait.h" HAVE_SYS_WAIT_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("sys/xattr.h" HAVE_SYS_XATTR_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("time.h" HAVE_TIME_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("unistd.h" HAVE_UNISTD_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("utime.h" HAVE_UTIME_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("wchar.h" HAVE_WCHAR_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("wctype.h" HAVE_WCTYPE_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("windows.h" HAVE_WINDOWS_H)
Packit 08bd4c
IF(ENABLE_CNG)
Packit 08bd4c
  LA_CHECK_INCLUDE_FILE("Bcrypt.h" HAVE_BCRYPT_H)
Packit 08bd4c
  IF(HAVE_BCRYPT_H)
Packit 08bd4c
    LIST(APPEND ADDITIONAL_LIBS "Bcrypt")
Packit 08bd4c
  ENDIF(HAVE_BCRYPT_H)
Packit 08bd4c
ELSE(ENABLE_CNG)
Packit 08bd4c
  UNSET(HAVE_BCRYPT_H CACHE)
Packit 08bd4c
ENDIF(ENABLE_CNG)
Packit 08bd4c
# Following files need windows.h, so we should test it after windows.h test.
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("wincrypt.h" HAVE_WINCRYPT_H)
Packit 08bd4c
LA_CHECK_INCLUDE_FILE("winioctl.h" HAVE_WINIOCTL_H)
Packit 08bd4c
Packit 08bd4c
#
Packit 08bd4c
# Check whether use of __EXTENSIONS__ is safe.
Packit 08bd4c
# We need some macro such as _GNU_SOURCE to use extension functions.
Packit 08bd4c
#
Packit 08bd4c
SET(_INCLUDE_FILES)
Packit 08bd4c
FOREACH (it ${_HEADER})
Packit 08bd4c
   SET(_INCLUDE_FILES "${_INCLUDE_FILES}#include <${it}>\n")
Packit 08bd4c
ENDFOREACH (it)
Packit 08bd4c
Packit 08bd4c
CHECK_C_SOURCE_COMPILES(
Packit 08bd4c
  "#define __EXTENSIONS__ 1
Packit 08bd4c
   ${_INCLUDE_FILES}
Packit 08bd4c
   int main() { return 0;}"
Packit 08bd4c
 SAFE_TO_DEFINE_EXTENSIONS)
Packit 08bd4c
Packit 08bd4c
#
Packit 08bd4c
# Find Nettle
Packit 08bd4c
#
Packit 08bd4c
IF(ENABLE_NETTLE)
Packit 08bd4c
  FIND_PACKAGE(Nettle)
Packit 08bd4c
  IF(NETTLE_FOUND)
Packit 08bd4c
    SET(HAVE_LIBNETTLE 1)
Packit 08bd4c
    LIST(APPEND ADDITIONAL_LIBS ${NETTLE_LIBRARIES})
Packit 08bd4c
    INCLUDE_DIRECTORIES(${NETTLE_INCLUDE_DIR})
Packit 08bd4c
Packit 08bd4c
    LIST(APPEND CMAKE_REQUIRED_INCLUDES ${NETTLE_INCLUDE_DIR})
Packit 08bd4c
    LA_CHECK_INCLUDE_FILE("nettle/aes.h" HAVE_NETTLE_AES_H)
Packit 08bd4c
    LA_CHECK_INCLUDE_FILE("nettle/hmac.h" HAVE_NETTLE_HMAC_H)
Packit 08bd4c
    LA_CHECK_INCLUDE_FILE("nettle/md5.h" HAVE_NETTLE_MD5_H)
Packit 08bd4c
    LA_CHECK_INCLUDE_FILE("nettle/pbkdf2.h" HAVE_NETTLE_PBKDF2_H)
Packit 08bd4c
    LA_CHECK_INCLUDE_FILE("nettle/ripemd160.h" HAVE_NETTLE_RIPEMD160_H)
Packit 08bd4c
    LA_CHECK_INCLUDE_FILE("nettle/sha.h" HAVE_NETTLE_SHA_H)
Packit 08bd4c
Packit 08bd4c
  ENDIF(NETTLE_FOUND)
Packit 08bd4c
  MARK_AS_ADVANCED(CLEAR NETTLE_INCLUDE_DIR)
Packit 08bd4c
  MARK_AS_ADVANCED(CLEAR NETTLE_LIBRARIES)
Packit 08bd4c
ENDIF(ENABLE_NETTLE)
Packit 08bd4c
Packit 08bd4c
#
Packit 08bd4c
# Find OpenSSL
Packit 08bd4c
# (Except on Mac, where OpenSSL is deprecated.)
Packit 08bd4c
#
Packit 08bd4c
IF(ENABLE_OPENSSL AND NOT CMAKE_SYSTEM_NAME MATCHES "Darwin")
Packit 08bd4c
  FIND_PACKAGE(OpenSSL)
Packit 08bd4c
  IF(OPENSSL_FOUND)
Packit 08bd4c
    SET(HAVE_LIBCRYPTO 1)
Packit 08bd4c
    INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR})
Packit 08bd4c
    LIST(APPEND ADDITIONAL_LIBS ${OPENSSL_CRYPTO_LIBRARY})
Packit 08bd4c
  ENDIF(OPENSSL_FOUND)
Packit 08bd4c
ELSE()
Packit 08bd4c
  SET(OPENSSL_FOUND FALSE) # Override cached value
Packit 08bd4c
ENDIF()
Packit 08bd4c
Packit 08bd4c
# FreeBSD libmd
Packit 08bd4c
IF(NOT OPENSSL_FOUND)
Packit 08bd4c
  CHECK_LIBRARY_EXISTS(md "MD5Init" "" LIBMD_FOUND)
Packit 08bd4c
  IF(LIBMD_FOUND)
Packit 08bd4c
    CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
Packit 08bd4c
    SET(CMAKE_REQUIRED_LIBRARIES "md")
Packit 08bd4c
    FIND_LIBRARY(LIBMD_LIBRARY NAMES md)
Packit 08bd4c
    LIST(APPEND ADDITIONAL_LIBS ${LIBMD_LIBRARY})
Packit 08bd4c
    CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
Packit 08bd4c
  ENDIF(LIBMD_FOUND)
Packit 08bd4c
ENDIF(NOT OPENSSL_FOUND)
Packit 08bd4c
Packit 08bd4c
#
Packit 08bd4c
# How to prove that CRYPTO functions, which have several names on various
Packit 08bd4c
# platforms, just see if archive_digest.c can compile and link against
Packit 08bd4c
# required libraries.
Packit 08bd4c
#
Packit 08bd4c
MACRO(CHECK_CRYPTO ALGORITHMS IMPLEMENTATION)
Packit 08bd4c
    FOREACH(ALGORITHM ${ALGORITHMS})
Packit 08bd4c
      IF(NOT ARCHIVE_CRYPTO_${ALGORITHM})
Packit 08bd4c
      STRING(TOLOWER "${ALGORITHM}" lower_algorithm)
Packit 08bd4c
      STRING(TOUPPER "${ALGORITHM}" algorithm)
Packit 08bd4c
      IF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND NOT OPENSSL_FOUND)
Packit 08bd4c
        SET(ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} FALSE)
Packit 08bd4c
      ELSEIF("${IMPLEMENTATION}" MATCHES "^NETTLE$" AND NOT NETTLE_FOUND)
Packit 08bd4c
        SET(ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} FALSE)
Packit 08bd4c
      ENDIF("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND NOT OPENSSL_FOUND)
Packit 08bd4c
Packit 08bd4c
      IF(NOT DEFINED ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
Packit 08bd4c
        # Probe the local implementation for whether this
Packit 08bd4c
	# crypto implementation is available on this platform.
Packit 08bd4c
	SET(TRY_CRYPTO_REQUIRED_INCLUDES
Packit 08bd4c
	  "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}/libarchive;${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp")
Packit 08bd4c
	SET(TRY_CRYPTO_REQUIRED_LIBS)
Packit 08bd4c
	IF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)
Packit 08bd4c
	    SET(TRY_CRYPTO_REQUIRED_INCLUDES
Packit 08bd4c
	      "${TRY_CRYPTO_REQUIRED_INCLUDES};${OPENSSL_INCLUDE_DIR}")
Packit 08bd4c
	    SET(TRY_CRYPTO_REQUIRED_LIBS
Packit 08bd4c
	        "-DLINK_LIBRARIES:STRING=${OPENSSL_LIBRARIES}")
Packit 08bd4c
	ELSEIF("${IMPLEMENTATION}" MATCHES "^NETTLE$" AND NETTLE_FOUND)
Packit 08bd4c
	    SET(TRY_CRYPTO_REQUIRED_INCLUDES
Packit 08bd4c
	      "${TRY_CRYPTO_REQUIRED_INCLUDES};${NETTLE_INCLUDE_DIR}")
Packit 08bd4c
	    SET(TRY_CRYPTO_REQUIRED_LIBS
Packit 08bd4c
	        "-DLINK_LIBRARIES:STRING=${NETTLE_LIBRARY}")
Packit 08bd4c
	ELSEIF("${IMPLEMENTATION}" MATCHES "^LIBMD$" AND LIBMD_FOUND)
Packit 08bd4c
	    SET(TRY_CRYPTO_REQUIRED_LIBS
Packit 08bd4c
	        "-DLINK_LIBRARIES:STRING=${LIBMD_LIBRARY}")
Packit 08bd4c
	ENDIF("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)
Packit 08bd4c
Packit 08bd4c
    CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/build/cmake/config.h.in
Packit 08bd4c
      ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/confdefs.h)
Packit 08bd4c
	FILE(READ "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/confdefs.h"
Packit 08bd4c
	     CONFDEFS_H)
Packit 08bd4c
	FILE(READ "${CMAKE_CURRENT_SOURCE_DIR}/libarchive/archive_digest.c"
Packit 08bd4c
	     ARCHIVE_CRYPTO_C)
Packit 08bd4c
Packit 08bd4c
	SET(SOURCE "${CONFDEFS_H}
Packit 08bd4c
Packit 08bd4c
#define ARCHIVE_${algorithm}_COMPILE_TEST
Packit 08bd4c
#define ARCHIVE_CRYPTO_${algorithm}_${IMPLEMENTATION}
Packit 08bd4c
#define PLATFORM_CONFIG_H \"check_crypto_md.h\"
Packit 08bd4c
Packit 08bd4c
${ARCHIVE_CRYPTO_C}
Packit 08bd4c
Packit 08bd4c
int
Packit 08bd4c
main(int argc, char **argv)
Packit 08bd4c
{
Packit 08bd4c
  archive_${lower_algorithm}_ctx ctx;
Packit 08bd4c
  archive_${lower_algorithm}_init(&ctx;;
Packit 08bd4c
  archive_${lower_algorithm}_update(&ctx, *argv, argc);
Packit 08bd4c
  archive_${lower_algorithm}_final(&ctx, NULL);
Packit 08bd4c
  return 0;
Packit 08bd4c
}
Packit 08bd4c
")
Packit 08bd4c
Packit 08bd4c
  FILE(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_crypto_md.h" "")
Packit 08bd4c
	FILE(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_crypto_md.c" "${SOURCE}")
Packit 08bd4c
	MESSAGE(STATUS "Checking support for ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION}")
Packit 08bd4c
Packit 08bd4c
	TRY_COMPILE(ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION}
Packit 08bd4c
	  ${CMAKE_BINARY_DIR}
Packit 08bd4c
	  ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_crypto_md.c
Packit 08bd4c
	  CMAKE_FLAGS
Packit 08bd4c
	   "${TRY_CRYPTO_REQUIRED_LIBS}"
Packit 08bd4c
	   "${TRY_CRYPTO_REQUIRED_INCLUDES}"
Packit 08bd4c
	  OUTPUT_VARIABLE OUTPUT)
Packit 08bd4c
Packit 08bd4c
	# Inform user whether or not we found it; if not, log why we didn't.
Packit 08bd4c
        IF (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
Packit 08bd4c
          MESSAGE(STATUS "Checking support for ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} -- found")
Packit 08bd4c
		  SET(ARCHIVE_CRYPTO_${ALGORITHM} 1)
Packit 08bd4c
        ELSE (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
Packit 08bd4c
          MESSAGE(STATUS "Checking support for ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} -- not found")
Packit 08bd4c
          FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
Packit 08bd4c
    	    "Checking support for ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} failed with the following output:\n"
Packit 08bd4c
    	    "${OUTPUT}\n"
Packit 08bd4c
    	    "Source file was:\n${SOURCE}\n")
Packit 08bd4c
        ENDIF (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
Packit 08bd4c
      ENDIF(NOT DEFINED ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
Packit 08bd4c
Packit 08bd4c
      # Add appropriate libs/includes depending on whether the implementation
Packit 08bd4c
      # was found on this platform.
Packit 08bd4c
      IF (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
Packit 08bd4c
        IF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)
Packit 08bd4c
          INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR})
Packit 08bd4c
	  LIST(APPEND ADDITIONAL_LIBS ${OPENSSL_LIBRARIES})
Packit 08bd4c
	   LIST(REMOVE_DUPLICATES ADDITIONAL_LIBS)
Packit 08bd4c
        ENDIF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)
Packit 08bd4c
      ENDIF (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
Packit 08bd4c
      ENDIF(NOT ARCHIVE_CRYPTO_${ALGORITHM})
Packit 08bd4c
    ENDFOREACH(ALGORITHM ${ALGORITHMS})
Packit 08bd4c
ENDMACRO(CHECK_CRYPTO ALGORITHMS IMPLEMENTATION)
Packit 08bd4c
Packit 08bd4c
#
Packit 08bd4c
# CRYPTO functions on Windows is defined at archive_windows.c, thus we do not
Packit 08bd4c
# need the test what the functions can be mapped to archive_{crypto name}_init,
Packit 08bd4c
# archive_{crypto name}_update and archive_{crypto name}_final.
Packit 08bd4c
# The functions on Windows use CALG_{crypto name} macro to create a crypt object
Packit 08bd4c
# and then we need to know what CALG_{crypto name} macros is available to show
Packit 08bd4c
# ARCHIVE_CRYPTO_{crypto name}_WIN macros because Windows 2000 and earlier version
Packit 08bd4c
# of Windows XP do not support SHA256, SHA384 and SHA512.
Packit 08bd4c
#
Packit 08bd4c
MACRO(CHECK_CRYPTO_WIN CRYPTO_LIST)
Packit 08bd4c
  IF(WIN32 AND NOT CYGWIN)
Packit 08bd4c
    FOREACH(CRYPTO ${CRYPTO_LIST})
Packit 08bd4c
      IF(NOT ARCHIVE_CRYPTO_${CRYPTO})
Packit 08bd4c
      IF(NOT DEFINED ARCHIVE_CRYPTO_${CRYPTO}_WIN)
Packit 08bd4c
	STRING(TOUPPER "${CRYPTO}" crypto)
Packit 08bd4c
	SET(ALGID "")
Packit 08bd4c
	IF ("${CRYPTO}" MATCHES "^MD5$")
Packit 08bd4c
	    SET(ALGID "CALG_MD5")
Packit 08bd4c
	ENDIF ("${CRYPTO}" MATCHES "^MD5$")
Packit 08bd4c
	IF ("${CRYPTO}" MATCHES "^SHA1$")
Packit 08bd4c
	    SET(ALGID "CALG_SHA1")
Packit 08bd4c
	ENDIF ("${CRYPTO}" MATCHES "^SHA1$")
Packit 08bd4c
	IF ("${CRYPTO}" MATCHES "^SHA256$")
Packit 08bd4c
	    SET(ALGID "CALG_SHA_256")
Packit 08bd4c
	ENDIF ("${CRYPTO}" MATCHES "^SHA256$")
Packit 08bd4c
	IF ("${CRYPTO}" MATCHES "^SHA384$")
Packit 08bd4c
	    SET(ALGID "CALG_SHA_384")
Packit 08bd4c
	ENDIF ("${CRYPTO}" MATCHES "^SHA384$")
Packit 08bd4c
	IF ("${CRYPTO}" MATCHES "^SHA512$")
Packit 08bd4c
	    SET(ALGID "CALG_SHA_512")
Packit 08bd4c
	ENDIF ("${CRYPTO}" MATCHES "^SHA512$")
Packit 08bd4c
Packit 08bd4c
    CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/build/cmake/config.h.in
Packit 08bd4c
      ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/confdefs.h)
Packit 08bd4c
	FILE(READ "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/confdefs.h"
Packit 08bd4c
	     CONFDEFS_H)
Packit 08bd4c
Packit 08bd4c
	SET(SOURCE "${CONFDEFS_H}
Packit 08bd4c
Packit 08bd4c
#define ${crypto}_COMPILE_TEST
Packit 08bd4c
#include <windows.h>
Packit 08bd4c
#include <wincrypt.h>
Packit 08bd4c
Packit 08bd4c
int
Packit 08bd4c
main(int argc, char **argv)
Packit 08bd4c
{
Packit 08bd4c
	return ${ALGID};
Packit 08bd4c
}
Packit 08bd4c
")
Packit 08bd4c
	SET(SOURCE_FILE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_crypto_win.c")
Packit 08bd4c
Packit 08bd4c
	FILE(WRITE "${SOURCE_FILE}" "${SOURCE}")
Packit 08bd4c
	MESSAGE(STATUS "Checking support for ARCHIVE_CRYPTO_${CRYPTO}_WIN")
Packit 08bd4c
Packit 08bd4c
	TRY_COMPILE(ARCHIVE_CRYPTO_${CRYPTO}_WIN
Packit 08bd4c
	  ${CMAKE_BINARY_DIR}
Packit 08bd4c
	  ${SOURCE_FILE}
Packit 08bd4c
	  CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}/libarchive"
Packit 08bd4c
	  OUTPUT_VARIABLE OUTPUT)
Packit 08bd4c
Packit 08bd4c
	IF (ARCHIVE_CRYPTO_${CRYPTO}_WIN)
Packit 08bd4c
	    MESSAGE(STATUS
Packit 08bd4c
	        "Checking support for ARCHIVE_CRYPTO_${CRYPTO}_WIN -- found")
Packit 08bd4c
		SET(ARCHIVE_CRYPTO_${CRYPTO} 1)
Packit 08bd4c
	ELSE (ARCHIVE_CRYPTO_${CRYPTO}_WIN)
Packit 08bd4c
	    MESSAGE(STATUS
Packit 08bd4c
	         "Checking support for ARCHIVE_CRYPTO_${CRYPTO}_WIN -- not found")
Packit 08bd4c
    	    FILE(APPEND
Packit 08bd4c
	        ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
Packit 08bd4c
                "Checking support for ARCHIVE_CRYPTO_${CRYPTO}_WIN failed with the following output:\n"
Packit 08bd4c
        	"${OUTPUT}\n"
Packit 08bd4c
        	"Source file was:\n${SOURCE}\n")
Packit 08bd4c
	ENDIF (ARCHIVE_CRYPTO_${CRYPTO}_WIN)
Packit 08bd4c
Packit 08bd4c
      ENDIF(NOT DEFINED ARCHIVE_CRYPTO_${CRYPTO}_WIN)
Packit 08bd4c
      ENDIF(NOT ARCHIVE_CRYPTO_${CRYPTO})
Packit 08bd4c
    ENDFOREACH(CRYPTO)
Packit 08bd4c
  ENDIF(WIN32 AND NOT CYGWIN)
Packit 08bd4c
ENDMACRO(CHECK_CRYPTO_WIN CRYPTO_LIST)
Packit 08bd4c
Packit 08bd4c
#
Packit 08bd4c
# Find iconv
Packit 08bd4c
# POSIX defines the second arg as const char **
Packit 08bd4c
# and requires it to be in libc.  But we can accept
Packit 08bd4c
# a non-const argument here and can support iconv()
Packit 08bd4c
# being in libiconv.
Packit 08bd4c
#
Packit 08bd4c
MACRO(CHECK_ICONV LIB TRY_ICONV_CONST)
Packit 08bd4c
  IF(NOT HAVE_ICONV)
Packit 08bd4c
    CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
Packit 08bd4c
    IF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR
Packit 08bd4c
        CMAKE_C_COMPILER_ID MATCHES "^Clang$")
Packit 08bd4c
      #
Packit 08bd4c
      # During checking iconv proto type, we should use -Werror to avoid the
Packit 08bd4c
      # success of iconv detection with a warnig which success is a miss
Packit 08bd4c
      # detection. So this needs for all build mode(even it's a release mode).
Packit 08bd4c
      #
Packit 08bd4c
      SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Werror")
Packit 08bd4c
    ENDIF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR
Packit 08bd4c
           CMAKE_C_COMPILER_ID MATCHES "^Clang$")
Packit 08bd4c
    IF (CMAKE_C_COMPILER_ID MATCHES "^XL$")
Packit 08bd4c
      SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -qhalt=w -qflag=w:w")
Packit 08bd4c
    ENDIF (CMAKE_C_COMPILER_ID MATCHES "^XL$")
Packit 08bd4c
    IF (MSVC)
Packit 08bd4c
      # NOTE: /WX option is the same as gcc's -Werror option.
Packit 08bd4c
      SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} /WX")
Packit 08bd4c
    ENDIF (MSVC)
Packit 08bd4c
    #
Packit 08bd4c
    CHECK_C_SOURCE_COMPILES(
Packit 08bd4c
      "#include <stdlib.h>
Packit 08bd4c
       #include <iconv.h>
Packit 08bd4c
       int main() {
Packit 08bd4c
          ${TRY_ICONV_CONST} char *ccp;
Packit 08bd4c
          iconv_t cd = iconv_open(\"\", \"\");
Packit 08bd4c
          iconv(cd, &ccp, (size_t *)0, (char **)0, (size_t *)0);
Packit 08bd4c
          iconv_close(cd);
Packit 08bd4c
          return 0;
Packit 08bd4c
       }"
Packit 08bd4c
     HAVE_ICONV_${LIB}_${TRY_ICONV_CONST})
Packit 08bd4c
    IF(HAVE_ICONV_${LIB}_${TRY_ICONV_CONST})
Packit 08bd4c
      SET(HAVE_ICONV true)
Packit 08bd4c
      SET(ICONV_CONST ${TRY_ICONV_CONST})
Packit 08bd4c
    ENDIF(HAVE_ICONV_${LIB}_${TRY_ICONV_CONST})
Packit 08bd4c
    CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
Packit 08bd4c
  ENDIF(NOT HAVE_ICONV)
Packit 08bd4c
ENDMACRO(CHECK_ICONV TRY_ICONV_CONST)
Packit 08bd4c
Packit 08bd4c
IF(ENABLE_ICONV)
Packit 08bd4c
  CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
Packit 08bd4c
  FIND_PATH(ICONV_INCLUDE_DIR iconv.h)
Packit 08bd4c
  IF(ICONV_INCLUDE_DIR)
Packit 08bd4c
    #SET(INCLUDES ${INCLUDES} "iconv.h")
Packit 08bd4c
    SET(HAVE_ICONV_H 1)
Packit 08bd4c
    INCLUDE_DIRECTORIES(${ICONV_INCLUDE_DIR})
Packit 08bd4c
    SET(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR})
Packit 08bd4c
    CHECK_ICONV("libc" "const")
Packit 08bd4c
    CHECK_ICONV("libc" "")
Packit 08bd4c
Packit 08bd4c
    # If iconv isn't in libc and we have a libiconv, try that.
Packit 08bd4c
    FIND_LIBRARY(LIBICONV_PATH NAMES iconv libiconv)
Packit 08bd4c
    IF(NOT HAVE_ICONV AND LIBICONV_PATH)
Packit 08bd4c
      LIST(APPEND CMAKE_REQUIRED_LIBRARIES ${LIBICONV_PATH})
Packit 08bd4c
      # Test if a macro is needed for the library.
Packit 08bd4c
      TRY_MACRO_FOR_LIBRARY(
Packit 08bd4c
        "${ICONV_INCLUDE_DIR}" "${LIBICONV_PATH}"
Packit 08bd4c
        COMPILES
Packit 08bd4c
        "#include <iconv.h>\nint main() {return iconv_close((iconv_t)0);}"
Packit 08bd4c
        "WITHOUT_LIBICONV_STATIC;LIBICONV_STATIC")
Packit 08bd4c
      IF(NOT WITHOUT_LIBICONV_STATIC AND LIBICONV_STATIC)
Packit 08bd4c
        ADD_DEFINITIONS(-DLIBICONV_STATIC)
Packit 08bd4c
      ENDIF(NOT WITHOUT_LIBICONV_STATIC AND LIBICONV_STATIC)
Packit 08bd4c
      #
Packit 08bd4c
      # Set up CMAKE_REQUIRED_* for CHECK_ICONV
Packit 08bd4c
      #
Packit 08bd4c
      SET(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR})
Packit 08bd4c
      SET(CMAKE_REQUIRED_LIBRARIES ${LIBICONV_PATH})
Packit 08bd4c
      IF(LIBICONV_STATIC)
Packit 08bd4c
        # LIBICONV_STATIC is necessary for the success of CHECK_ICONV
Packit 08bd4c
        # on Windows.
Packit 08bd4c
        SET(CMAKE_REQUIRED_DEFINITIONS "-DLIBICONV_STATIC")
Packit 08bd4c
      ELSE(LIBICONV_STATIC)
Packit 08bd4c
        SET(CMAKE_REQUIRED_DEFINITIONS)
Packit 08bd4c
      ENDIF(LIBICONV_STATIC)
Packit 08bd4c
      CHECK_ICONV("libiconv" "const")
Packit 08bd4c
      CHECK_ICONV("libiconv" "")
Packit 08bd4c
      IF (HAVE_ICONV)
Packit 08bd4c
        LIST(APPEND ADDITIONAL_LIBS ${LIBICONV_PATH})
Packit 08bd4c
      ENDIF(HAVE_ICONV)
Packit 08bd4c
    ENDIF(NOT HAVE_ICONV AND LIBICONV_PATH)
Packit 08bd4c
  ENDIF(ICONV_INCLUDE_DIR)
Packit 08bd4c
  #
Packit 08bd4c
  # Find locale_charset() for libiconv.
Packit 08bd4c
  #
Packit 08bd4c
  IF(LIBICONV_PATH)
Packit 08bd4c
    SET(CMAKE_REQUIRED_DEFINITIONS)
Packit 08bd4c
    SET(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR})
Packit 08bd4c
    SET(CMAKE_REQUIRED_LIBRARIES)
Packit 08bd4c
    CHECK_INCLUDE_FILES("localcharset.h" HAVE_LOCALCHARSET_H)
Packit 08bd4c
    FIND_LIBRARY(LIBCHARSET_PATH NAMES charset libcharset)
Packit 08bd4c
    IF(LIBCHARSET_PATH)
Packit 08bd4c
      SET(CMAKE_REQUIRED_LIBRARIES ${LIBCHARSET_PATH})
Packit 08bd4c
      IF(WIN32 AND NOT CYGWIN)
Packit 08bd4c
        # Test if a macro is needed for the library.
Packit 08bd4c
        TRY_MACRO_FOR_LIBRARY(
Packit 08bd4c
          "${ICONV_INCLUDE_DIR}" "${LIBCHARSET_PATH}"
Packit 08bd4c
          COMPILES
Packit 08bd4c
          "#include <localcharset.h>\nint main() {return locale_charset()?1:0;}"
Packit 08bd4c
          "WITHOUT_LIBCHARSET_STATIC;LIBCHARSET_STATIC")
Packit 08bd4c
        IF(NOT WITHOUT_LIBCHARSET_STATIC AND LIBCHARSET_STATIC)
Packit 08bd4c
          ADD_DEFINITIONS(-DLIBCHARSET_STATIC)
Packit 08bd4c
        ENDIF(NOT WITHOUT_LIBCHARSET_STATIC AND LIBCHARSET_STATIC)
Packit 08bd4c
        IF(WITHOUT_LIBCHARSET_STATIC OR LIBCHARSET_STATIC)
Packit 08bd4c
          SET(HAVE_LOCALE_CHARSET ON CACHE INTERNAL
Packit 08bd4c
              "Have function locale_charset")
Packit 08bd4c
        ENDIF(WITHOUT_LIBCHARSET_STATIC OR LIBCHARSET_STATIC)
Packit 08bd4c
      ELSE(WIN32 AND NOT CYGWIN)
Packit 08bd4c
        CHECK_FUNCTION_EXISTS_GLIBC(locale_charset HAVE_LOCALE_CHARSET)
Packit 08bd4c
      ENDIF(WIN32 AND NOT CYGWIN)
Packit 08bd4c
      IF(HAVE_LOCALE_CHARSET)
Packit 08bd4c
        LIST(APPEND ADDITIONAL_LIBS ${LIBCHARSET_PATH})
Packit 08bd4c
      ENDIF(HAVE_LOCALE_CHARSET)
Packit 08bd4c
    ENDIF(LIBCHARSET_PATH)
Packit 08bd4c
  ENDIF(LIBICONV_PATH)
Packit 08bd4c
  CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
Packit 08bd4c
ELSE(ENABLE_ICONV)
Packit 08bd4c
  # Make sure ICONV variables are not in CACHE after ENABLE_ICONV disabled
Packit 08bd4c
  # (once enabled).
Packit 08bd4c
  UNSET(HAVE_LOCALE_CHARSET CACHE)
Packit 08bd4c
  UNSET(HAVE_ICONV CACHE)
Packit 08bd4c
  UNSET(HAVE_ICONV_libc_ CACHE)
Packit 08bd4c
  UNSET(HAVE_ICONV_libc_const CACHE)
Packit 08bd4c
  UNSET(HAVE_ICONV_libiconv_ CACHE)
Packit 08bd4c
  UNSET(HAVE_ICONV_libiconv_const CACHE)
Packit 08bd4c
  UNSET(ICONV_INCLUDE_DIR CACHE)
Packit 08bd4c
  UNSET(LIBICONV_PATH CACHE)
Packit 08bd4c
  UNSET(LIBICONV_DLL CACHE)
Packit 08bd4c
  UNSET(LIBICONV_STATIC CACHE)
Packit 08bd4c
  UNSET(LIBCHARSET_DLL CACHE)
Packit 08bd4c
  UNSET(LIBCHARSET_STATIC CACHE)
Packit 08bd4c
ENDIF(ENABLE_ICONV)
Packit 08bd4c
Packit 08bd4c
#
Packit 08bd4c
# Find Libxml2
Packit 08bd4c
#
Packit 08bd4c
IF(ENABLE_LIBXML2)
Packit 08bd4c
  FIND_PACKAGE(LibXml2)
Packit 08bd4c
ELSE()
Packit 08bd4c
  SET(LIBXML2_FOUND FALSE)
Packit 08bd4c
ENDIF()
Packit 08bd4c
IF(LIBXML2_FOUND)
Packit 08bd4c
  CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
Packit 08bd4c
  INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR})
Packit 08bd4c
  LIST(APPEND ADDITIONAL_LIBS ${LIBXML2_LIBRARIES})
Packit 08bd4c
  SET(HAVE_LIBXML2 1)
Packit 08bd4c
  # libxml2's include files use iconv.h
Packit 08bd4c
  SET(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR} ${LIBXML2_INCLUDE_DIR})
Packit 08bd4c
  CHECK_INCLUDE_FILES("libxml/xmlreader.h" HAVE_LIBXML_XMLREADER_H)
Packit 08bd4c
  CHECK_INCLUDE_FILES("libxml/xmlwriter.h" HAVE_LIBXML_XMLWRITER_H)
Packit 08bd4c
  # Test if a macro is needed for the library.
Packit 08bd4c
  TRY_MACRO_FOR_LIBRARY(
Packit 08bd4c
    "${ICONV_INCLUDE_DIR};${LIBXML2_INCLUDE_DIR}"
Packit 08bd4c
    "ws2_32.lib;${ZLIB_LIBRARIES};${LIBICONV_PATH};${LIBXML2_LIBRARIES}"
Packit 08bd4c
    COMPILES
Packit 08bd4c
    "#include <stddef.h>\n#include <libxml/xmlreader.h>\nint main() {return xmlTextReaderRead((xmlTextReaderPtr)(void *)0);}"
Packit 08bd4c
    "WITHOUT_LIBXML_STATIC;LIBXML_STATIC")
Packit 08bd4c
  IF(NOT WITHOUT_LIBXML_STATIC AND LIBXML_STATIC)
Packit 08bd4c
    ADD_DEFINITIONS(-DLIBXML_STATIC)
Packit 08bd4c
  ENDIF(NOT WITHOUT_LIBXML_STATIC AND LIBXML_STATIC)
Packit 08bd4c
  CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
Packit 08bd4c
ELSE(LIBXML2_FOUND)
Packit 08bd4c
  #
Packit 08bd4c
  # Find Expat
Packit 08bd4c
  #
Packit 08bd4c
  IF(ENABLE_EXPAT)
Packit 08bd4c
    FIND_PACKAGE(EXPAT)
Packit 08bd4c
  ELSE()
Packit 08bd4c
    SET(EXPAT_FOUND FALSE)
Packit 08bd4c
  ENDIF()
Packit 08bd4c
  IF(EXPAT_FOUND)
Packit 08bd4c
    CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
Packit 08bd4c
    INCLUDE_DIRECTORIES(${EXPAT_INCLUDE_DIR})
Packit 08bd4c
    LIST(APPEND ADDITIONAL_LIBS ${EXPAT_LIBRARIES})
Packit 08bd4c
    SET(HAVE_LIBEXPAT 1)
Packit 08bd4c
    LA_CHECK_INCLUDE_FILE("expat.h" HAVE_EXPAT_H)
Packit 08bd4c
    CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
Packit 08bd4c
  ENDIF(EXPAT_FOUND)
Packit 08bd4c
ENDIF(LIBXML2_FOUND)
Packit 08bd4c
MARK_AS_ADVANCED(CLEAR LIBXML2_INCLUDE_DIR)
Packit 08bd4c
MARK_AS_ADVANCED(CLEAR LIBXML2_LIBRARIES)
Packit 08bd4c
Packit 08bd4c
#
Packit 08bd4c
# POSIX Regular Expression support
Packit 08bd4c
#
Packit 08bd4c
IF(POSIX_REGEX_LIB MATCHES "^(AUTO|LIBC|LIBREGEX)$")
Packit 08bd4c
  #
Packit 08bd4c
  # If PCREPOSIX is not found or not requested, try using regex
Packit 08bd4c
  # from libc or libregex
Packit 08bd4c
  #
Packit 08bd4c
  FIND_PATH(REGEX_INCLUDE_DIR regex.h)
Packit 08bd4c
  IF(REGEX_INCLUDE_DIR)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(regcomp HAVE_REGCOMP_LIBC)
Packit 08bd4c
    #
Packit 08bd4c
    # If libc does not provide regex, find libregex.
Packit 08bd4c
    #
Packit 08bd4c
    IF(NOT HAVE_REGCOMP_LIBC)
Packit 08bd4c
      CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
Packit 08bd4c
      FIND_LIBRARY(REGEX_LIBRARY regex)
Packit 08bd4c
      IF(REGEX_LIBRARY)
Packit 08bd4c
        SET(CMAKE_REQUIRED_LIBRARIES ${REGEX_LIBRARY})
Packit 08bd4c
        CHECK_FUNCTION_EXISTS_GLIBC(regcomp HAVE_REGCOMP_LIBREGEX)
Packit 08bd4c
        IF(HAVE_REGCOMP_LIBREGEX)
Packit 08bd4c
          LIST(APPEND ADDITIONAL_LIBS ${REGEX_LIBRARY})
Packit 08bd4c
          #
Packit 08bd4c
          # If regex.h is not found, retry looking for regex.h at
Packit 08bd4c
          # REGEX_INCLUDE_DIR
Packit 08bd4c
          #
Packit 08bd4c
          IF(NOT HAVE_REGEX_H)
Packit 08bd4c
            UNSET(HAVE_REGEX_H CACHE)
Packit 08bd4c
            INCLUDE_DIRECTORIES(${REGEX_INCLUDE_DIR})
Packit 08bd4c
            SET(CMAKE_REQUIRED_INCLUDES ${REGEX_INCLUDE_DIR})
Packit 08bd4c
            LA_CHECK_INCLUDE_FILE("regex.h" HAVE_REGEX_H)
Packit 08bd4c
          ENDIF(NOT HAVE_REGEX_H)
Packit 08bd4c
          # Test if a macro is needed for the library.
Packit 08bd4c
          TRY_MACRO_FOR_LIBRARY(
Packit 08bd4c
            "${REGEX_INCLUDE_DIR}" "${REGEX_LIBRARY}"
Packit 08bd4c
            COMPILES
Packit 08bd4c
            "#include <stddef.h>\n#include <regex.h>\nint main() {regex_t r;return regcomp(&r, \"\", 0);}"
Packit 08bd4c
            "USE_REGEX_DLL;USE_REGEX_STATIC")
Packit 08bd4c
          IF(USE_REGEX_DLL)
Packit 08bd4c
            ADD_DEFINITIONS(-DUSE_REGEX_DLL)
Packit 08bd4c
          ELSEIF(USE_REGEX_STATIC)
Packit 08bd4c
            ADD_DEFINITIONS(-DUSE_REGEX_STATIC)
Packit 08bd4c
          ENDIF(USE_REGEX_DLL)
Packit 08bd4c
        ENDIF(HAVE_REGCOMP_LIBREGEX)
Packit 08bd4c
      ENDIF(REGEX_LIBRARY)
Packit 08bd4c
      CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
Packit 08bd4c
    ENDIF(NOT HAVE_REGCOMP_LIBC)
Packit 08bd4c
  ENDIF(REGEX_INCLUDE_DIR)
Packit 08bd4c
  IF(HAVE_REGCOMP_LIBC OR HAVE_REGCOMP_LIBREGEX)
Packit 08bd4c
    SET(FOUND_POSIX_REGEX_LIB 1)
Packit 08bd4c
  ENDIF(HAVE_REGCOMP_LIBC OR HAVE_REGCOMP_LIBREGEX)
Packit 08bd4c
ENDIF(POSIX_REGEX_LIB MATCHES "^(AUTO|LIBC|LIBREGEX)$")
Packit 08bd4c
Packit 08bd4c
IF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCREPOSIX)$")
Packit 08bd4c
  #
Packit 08bd4c
  # If requested, try finding library for PCREPOSIX
Packit 08bd4c
  #
Packit 08bd4c
  IF(ENABLE_LibGCC)
Packit 08bd4c
    FIND_PACKAGE(LibGCC)
Packit 08bd4c
  ELSE()
Packit 08bd4c
    SET(LIBGCC_FOUND FALSE) # Override cached value
Packit 08bd4c
  ENDIF()
Packit 08bd4c
  IF(ENABLE_PCREPOSIX)
Packit 08bd4c
    FIND_PACKAGE(PCREPOSIX)
Packit 08bd4c
  ELSE()
Packit 08bd4c
    SET(PCREPOSIX_FOUND FALSE) # Override cached value
Packit 08bd4c
  ENDIF()
Packit 08bd4c
  IF(PCREPOSIX_FOUND)
Packit 08bd4c
    INCLUDE_DIRECTORIES(${PCRE_INCLUDE_DIR})
Packit 08bd4c
    LIST(APPEND ADDITIONAL_LIBS ${PCREPOSIX_LIBRARIES})
Packit 08bd4c
    # Test if a macro is needed for the library.
Packit 08bd4c
    TRY_MACRO_FOR_LIBRARY(
Packit 08bd4c
      "${PCRE_INCLUDE_DIR}" "${PCREPOSIX_LIBRARIES}"
Packit 08bd4c
      COMPILES
Packit 08bd4c
      "#include <pcreposix.h>\nint main() {regex_t r;return regcomp(&r, \"\", 0);}"
Packit 08bd4c
      "WITHOUT_PCRE_STATIC;PCRE_STATIC")
Packit 08bd4c
    IF(NOT WITHOUT_PCRE_STATIC AND PCRE_STATIC)
Packit 08bd4c
      ADD_DEFINITIONS(-DPCRE_STATIC)
Packit 08bd4c
	ELSEIF(NOT WITHOUT_PCRE_STATIC AND NOT PCRE_STATIC AND PCRE_FOUND)
Packit 08bd4c
	  # Determine if pcre static libraries are to be used.
Packit 08bd4c
      LIST(APPEND ADDITIONAL_LIBS ${PCRE_LIBRARIES})
Packit 08bd4c
      SET(TMP_LIBRARIES ${PCREPOSIX_LIBRARIES} ${PCRE_LIBRARIES})
Packit 08bd4c
      MESSAGE(STATUS "trying again with -lpcre included")
Packit 08bd4c
      TRY_MACRO_FOR_LIBRARY(
Packit 08bd4c
        "${PCRE_INCLUDE_DIR}" "${TMP_LIBRARIES}"
Packit 08bd4c
        COMPILES
Packit 08bd4c
        "#include <pcreposix.h>\nint main() {regex_t r;return regcomp(&r, \"\", 0);}"
Packit 08bd4c
        "WITHOUT_PCRE_STATIC;PCRE_STATIC")
Packit 08bd4c
      IF(NOT WITHOUT_PCRE_STATIC AND PCRE_STATIC)
Packit 08bd4c
        ADD_DEFINITIONS(-DPCRE_STATIC)
Packit 08bd4c
      ELSEIF(NOT WITHOUT_PCRE_STATIC AND NOT PCRE_STATIC AND MSVC AND LIBGCC_FOUND)
Packit 08bd4c
        # When doing a Visual Studio build using pcre static libraries
Packit 08bd4c
        # built using the mingw toolchain, -lgcc is needed to resolve
Packit 08bd4c
        # ___chkstk_ms.
Packit 08bd4c
        MESSAGE(STATUS "Visual Studio build detected, trying again with -lgcc included")
Packit 08bd4c
        LIST(APPEND ADDITIONAL_LIBS ${LIBGCC_LIBRARIES})
Packit 08bd4c
        SET(TMP_LIBRARIES ${PCREPOSIX_LIBRARIES} ${PCRE_LIBRARIES} ${LIBGCC_LIBRARIES})
Packit 08bd4c
          TRY_MACRO_FOR_LIBRARY(
Packit 08bd4c
            "${PCRE_INCLUDE_DIR}" "${TMP_LIBRARIES}"
Packit 08bd4c
            COMPILES
Packit 08bd4c
            "#include <pcreposix.h>\nint main() {regex_t r;return regcomp(&r, \"\", 0);}"
Packit 08bd4c
            "WITHOUT_PCRE_STATIC;PCRE_STATIC")
Packit 08bd4c
          IF(NOT WITHOUT_PCRE_STATIC AND PCRE_STATIC)
Packit 08bd4c
            ADD_DEFINITIONS(-DPCRE_STATIC)
Packit 08bd4c
          ENDIF(NOT WITHOUT_PCRE_STATIC AND PCRE_STATIC)
Packit 08bd4c
      ENDIF(NOT WITHOUT_PCRE_STATIC AND PCRE_STATIC)
Packit 08bd4c
    ENDIF(NOT WITHOUT_PCRE_STATIC AND PCRE_STATIC)
Packit 08bd4c
  ENDIF(PCREPOSIX_FOUND)
Packit 08bd4c
  MARK_AS_ADVANCED(CLEAR PCRE_INCLUDE_DIR)
Packit 08bd4c
  MARK_AS_ADVANCED(CLEAR PCREPOSIX_LIBRARIES)
Packit 08bd4c
  MARK_AS_ADVANCED(CLEAR PCRE_LIBRARIES)
Packit 08bd4c
  MARK_AS_ADVANCED(CLEAR LIBGCC_LIBRARIES)
Packit 08bd4c
ENDIF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCREPOSIX)$")
Packit 08bd4c
Packit 08bd4c
#
Packit 08bd4c
# Check functions
Packit 08bd4c
#
Packit 08bd4c
CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
Packit 08bd4c
IF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR
Packit 08bd4c
    CMAKE_C_COMPILER_ID MATCHES "^Clang$")
Packit 08bd4c
  #
Packit 08bd4c
  # During checking functions, we should use -fno-builtin to avoid the
Packit 08bd4c
  # failure of function detection which failure is an error "conflicting
Packit 08bd4c
  # types for built-in function" caused by using -Werror option.
Packit 08bd4c
  #
Packit 08bd4c
  SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fno-builtin")
Packit 08bd4c
ENDIF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR
Packit 08bd4c
       CMAKE_C_COMPILER_ID MATCHES "^Clang$")
Packit 08bd4c
CHECK_SYMBOL_EXISTS(_CrtSetReportMode "crtdbg.h" HAVE__CrtSetReportMode)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(arc4random_buf HAVE_ARC4RANDOM_BUF)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(chflags HAVE_CHFLAGS)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(chown HAVE_CHOWN)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(chroot HAVE_CHROOT)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(ctime_r HAVE_CTIME_R)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(fchdir HAVE_FCHDIR)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(fchflags HAVE_FCHFLAGS)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(fchmod HAVE_FCHMOD)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(fchown HAVE_FCHOWN)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(fcntl HAVE_FCNTL)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(fdopendir HAVE_FDOPENDIR)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(fork HAVE_FORK)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(fstat HAVE_FSTAT)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(fstatat HAVE_FSTATAT)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(fstatfs HAVE_FSTATFS)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(fstatvfs HAVE_FSTATVFS)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(ftruncate HAVE_FTRUNCATE)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(futimens HAVE_FUTIMENS)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(futimes HAVE_FUTIMES)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(futimesat HAVE_FUTIMESAT)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(geteuid HAVE_GETEUID)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(getgrgid_r HAVE_GETGRGID_R)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(getgrnam_r HAVE_GETGRNAM_R)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(getpwnam_r HAVE_GETPWNAM_R)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(getpwuid_r HAVE_GETPWUID_R)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(getpid HAVE_GETPID)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(getvfsbyname HAVE_GETVFSBYNAME)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(gmtime_r HAVE_GMTIME_R)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(lchflags HAVE_LCHFLAGS)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(lchmod HAVE_LCHMOD)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(lchown HAVE_LCHOWN)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(link HAVE_LINK)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(localtime_r HAVE_LOCALTIME_R)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(lstat HAVE_LSTAT)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(lutimes HAVE_LUTIMES)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(mbrtowc HAVE_MBRTOWC)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(memmove HAVE_MEMMOVE)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(mkdir HAVE_MKDIR)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(mkfifo HAVE_MKFIFO)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(mknod HAVE_MKNOD)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(mkstemp HAVE_MKSTEMP)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(nl_langinfo HAVE_NL_LANGINFO)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(openat HAVE_OPENAT)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(pipe HAVE_PIPE)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(poll HAVE_POLL)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(posix_spawnp HAVE_POSIX_SPAWNP)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(readlink HAVE_READLINK)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(readpassphrase HAVE_READPASSPHRASE)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(select HAVE_SELECT)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(setenv HAVE_SETENV)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(setlocale HAVE_SETLOCALE)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(sigaction HAVE_SIGACTION)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(statfs HAVE_STATFS)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(statvfs HAVE_STATVFS)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(strchr HAVE_STRCHR)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(strdup HAVE_STRDUP)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(strerror HAVE_STRERROR)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(strncpy_s HAVE_STRNCPY_S)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(strrchr HAVE_STRRCHR)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(symlink HAVE_SYMLINK)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(timegm HAVE_TIMEGM)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(tzset HAVE_TZSET)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(unsetenv HAVE_UNSETENV)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(utime HAVE_UTIME)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(utimes HAVE_UTIMES)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(utimensat HAVE_UTIMENSAT)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(vfork HAVE_VFORK)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(wcrtomb HAVE_WCRTOMB)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(wcscmp HAVE_WCSCMP)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(wcscpy HAVE_WCSCPY)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(wcslen HAVE_WCSLEN)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(wctomb HAVE_WCTOMB)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(_ctime64_s HAVE__CTIME64_S)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(_fseeki64 HAVE__FSEEKI64)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(_get_timezone HAVE__GET_TIMEZONE)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(_localtime64_s HAVE__LOCALTIME64_S)
Packit 08bd4c
CHECK_FUNCTION_EXISTS_GLIBC(_mkgmtime64 HAVE__MKGMTIME64)
Packit 08bd4c
Packit 08bd4c
SET(CMAKE_REQUIRED_LIBRARIES "")
Packit 08bd4c
CHECK_FUNCTION_EXISTS(cygwin_conv_path HAVE_CYGWIN_CONV_PATH)
Packit 08bd4c
CHECK_FUNCTION_EXISTS(fseeko HAVE_FSEEKO)
Packit 08bd4c
CHECK_FUNCTION_EXISTS(strerror_r HAVE_STRERROR_R)
Packit 08bd4c
CHECK_FUNCTION_EXISTS(strftime HAVE_STRFTIME)
Packit 08bd4c
CHECK_FUNCTION_EXISTS(vprintf HAVE_VPRINTF)
Packit 08bd4c
CHECK_FUNCTION_EXISTS(wmemcmp HAVE_WMEMCMP)
Packit 08bd4c
CHECK_FUNCTION_EXISTS(wmemcpy HAVE_WMEMCPY)
Packit 08bd4c
CHECK_FUNCTION_EXISTS(wmemmove HAVE_WMEMMOVE)
Packit 08bd4c
Packit 08bd4c
CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
Packit 08bd4c
Packit 08bd4c
CHECK_C_SOURCE_COMPILES(
Packit 08bd4c
  "#include <sys/types.h>\n#include <sys/mount.h>\nint main(void) { struct vfsconf v; return sizeof(v);}"
Packit 08bd4c
  HAVE_STRUCT_VFSCONF)
Packit 08bd4c
Packit 08bd4c
CHECK_C_SOURCE_COMPILES(
Packit 08bd4c
  "#include <sys/types.h>\n#include <sys/mount.h>\nint main(void) { struct xvfsconf v; return sizeof(v);}"
Packit 08bd4c
  HAVE_STRUCT_XVFSCONF)
Packit 08bd4c
Packit 08bd4c
# Make sure we have the POSIX version of readdir_r, not the
Packit 08bd4c
# older 2-argument version.
Packit 08bd4c
CHECK_C_SOURCE_COMPILES(
Packit 08bd4c
  "#include <dirent.h>\nint main() {DIR *d = opendir(\".\"); struct dirent e,*r; return readdir_r(d,&e,&r);}"
Packit 08bd4c
  HAVE_READDIR_R)
Packit 08bd4c
Packit 08bd4c
# dirfd can be either a function or a macro.
Packit 08bd4c
CHECK_C_SOURCE_COMPILES(
Packit 08bd4c
  "#include <dirent.h>\nint main() {DIR *d = opendir(\".\"); return dirfd(d);}"
Packit 08bd4c
  HAVE_DIRFD)
Packit 08bd4c
Packit 08bd4c
# Only detect readlinkat() if we also have AT_FDCWD in unistd.h.
Packit 08bd4c
# NOTE: linux requires fcntl.h for AT_FDCWD.
Packit 08bd4c
CHECK_C_SOURCE_COMPILES(
Packit 08bd4c
  "#include <fcntl.h>\n#include <unistd.h>\nint main() {char buf[10]; return readlinkat(AT_FDCWD, \"\", buf, 0);}"
Packit 08bd4c
  HAVE_READLINKAT)
Packit 08bd4c
Packit 08bd4c
Packit 08bd4c
# To verify major(), we need to both include the header
Packit 08bd4c
# of interest and verify that the result can be linked.
Packit 08bd4c
# CHECK_FUNCTION_EXISTS doesn't accept a header argument,
Packit 08bd4c
# CHECK_SYMBOL_EXISTS doesn't test linkage.
Packit 08bd4c
CHECK_C_SOURCE_COMPILES(
Packit 08bd4c
  "#include <sys/mkdev.h>\nint main() { return major(256); }"
Packit 08bd4c
  MAJOR_IN_MKDEV)
Packit 08bd4c
CHECK_C_SOURCE_COMPILES(
Packit 08bd4c
  "#include <sys/sysmacros.h>\nint main() { return major(256); }"
Packit 08bd4c
  MAJOR_IN_SYSMACROS)
Packit 08bd4c
Packit 08bd4c
CHECK_C_SOURCE_COMPILES(
Packit 08bd4c
  "#include <lzma.h>\n#if LZMA_VERSION < 50020000\n#error unsupported\n#endif\nint main(void){lzma_stream_encoder_mt(0, 0); return 0;}"
Packit 08bd4c
  HAVE_LZMA_STREAM_ENCODER_MT)
Packit 08bd4c
Packit 08bd4c
IF(HAVE_STRERROR_R)
Packit 08bd4c
  SET(HAVE_DECL_STRERROR_R 1)
Packit 08bd4c
ENDIF(HAVE_STRERROR_R)
Packit 08bd4c
Packit 08bd4c
#
Packit 08bd4c
# Check defines
Packit 08bd4c
#
Packit 08bd4c
SET(headers "limits.h")
Packit 08bd4c
IF(HAVE_STDINT_H)
Packit 08bd4c
  LIST(APPEND headers "stdint.h")
Packit 08bd4c
ENDIF(HAVE_STDINT_H)
Packit 08bd4c
IF(HAVE_INTTYPES_H)
Packit 08bd4c
  LIST(APPEND headers "inttypes.h")
Packit 08bd4c
ENDIF(HAVE_INTTYPES_H)
Packit 08bd4c
CHECK_SYMBOL_EXISTS(EFTYPE           "errno.h"    HAVE_EFTYPE)
Packit 08bd4c
CHECK_SYMBOL_EXISTS(EILSEQ           "errno.h"    HAVE_EILSEQ)
Packit 08bd4c
CHECK_SYMBOL_EXISTS(D_MD_ORDER       "langinfo.h" HAVE_D_MD_ORDER)
Packit 08bd4c
CHECK_SYMBOL_EXISTS(INT32_MAX        "${headers}" HAVE_DECL_INT32_MAX)
Packit 08bd4c
CHECK_SYMBOL_EXISTS(INT32_MIN        "${headers}" HAVE_DECL_INT32_MIN)
Packit 08bd4c
CHECK_SYMBOL_EXISTS(INT64_MAX        "${headers}" HAVE_DECL_INT64_MAX)
Packit 08bd4c
CHECK_SYMBOL_EXISTS(INT64_MIN        "${headers}" HAVE_DECL_INT64_MIN)
Packit 08bd4c
CHECK_SYMBOL_EXISTS(INTMAX_MAX       "${headers}" HAVE_DECL_INTMAX_MAX)
Packit 08bd4c
CHECK_SYMBOL_EXISTS(INTMAX_MIN       "${headers}" HAVE_DECL_INTMAX_MIN)
Packit 08bd4c
CHECK_SYMBOL_EXISTS(UINT32_MAX       "${headers}" HAVE_DECL_UINT32_MAX)
Packit 08bd4c
CHECK_SYMBOL_EXISTS(UINT64_MAX       "${headers}" HAVE_DECL_UINT64_MAX)
Packit 08bd4c
CHECK_SYMBOL_EXISTS(UINTMAX_MAX      "${headers}" HAVE_DECL_UINTMAX_MAX)
Packit 08bd4c
CHECK_SYMBOL_EXISTS(SIZE_MAX         "${headers}" HAVE_DECL_SIZE_MAX)
Packit 08bd4c
CHECK_SYMBOL_EXISTS(SSIZE_MAX        "limits.h"   HAVE_DECL_SSIZE_MAX)
Packit 08bd4c
Packit 08bd4c
#
Packit 08bd4c
# Check struct members
Packit 08bd4c
#
Packit 08bd4c
# Check for tm_gmtoff in struct tm
Packit 08bd4c
CHECK_STRUCT_HAS_MEMBER("struct tm" tm_gmtoff
Packit 08bd4c
    "time.h" HAVE_STRUCT_TM_TM_GMTOFF)
Packit 08bd4c
CHECK_STRUCT_HAS_MEMBER("struct tm" __tm_gmtoff
Packit 08bd4c
    "time.h" HAVE_STRUCT_TM___TM_GMTOFF)
Packit 08bd4c
Packit 08bd4c
# Check for f_namemax in struct statfs
Packit 08bd4c
CHECK_STRUCT_HAS_MEMBER("struct statfs" f_namemax
Packit 08bd4c
    "sys/param.h;sys/mount.h" HAVE_STRUCT_STATFS_F_NAMEMAX)
Packit 08bd4c
Packit 08bd4c
# Check for birthtime in struct stat
Packit 08bd4c
CHECK_STRUCT_HAS_MEMBER("struct stat" st_birthtime
Packit 08bd4c
    "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_BIRTHTIME)
Packit 08bd4c
Packit 08bd4c
# Check for high-resolution timestamps in struct stat
Packit 08bd4c
CHECK_STRUCT_HAS_MEMBER("struct stat" st_birthtimespec.tv_nsec
Packit 08bd4c
    "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC)
Packit 08bd4c
CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtimespec.tv_nsec
Packit 08bd4c
    "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC)
Packit 08bd4c
CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtim.tv_nsec
Packit 08bd4c
    "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC)
Packit 08bd4c
CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtime_n
Packit 08bd4c
    "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIME_N)
Packit 08bd4c
CHECK_STRUCT_HAS_MEMBER("struct stat" st_umtime
Packit 08bd4c
    "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_UMTIME)
Packit 08bd4c
CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtime_usec
Packit 08bd4c
    "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIME_USEC)
Packit 08bd4c
# Check for block size support in struct stat
Packit 08bd4c
CHECK_STRUCT_HAS_MEMBER("struct stat" st_blksize
Packit 08bd4c
    "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_BLKSIZE)
Packit 08bd4c
# Check for st_flags in struct stat (BSD fflags)
Packit 08bd4c
CHECK_STRUCT_HAS_MEMBER("struct stat" st_flags
Packit 08bd4c
    "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_FLAGS)
Packit 08bd4c
Packit 08bd4c
IF(HAVE_SYS_STATVFS_H)
Packit 08bd4c
  CHECK_STRUCT_HAS_MEMBER("struct statvfs" f_iosize
Packit 08bd4c
    "sys/types.h;sys/statvfs.h" HAVE_STRUCT_STATVFS_F_IOSIZE)
Packit 08bd4c
ENDIF()
Packit 08bd4c
Packit 08bd4c
#
Packit 08bd4c
#
Packit 08bd4c
CHECK_STRUCT_HAS_MEMBER("struct tm" tm_sec
Packit 08bd4c
    "sys/types.h;sys/time.h;time.h" TIME_WITH_SYS_TIME)
Packit 08bd4c
Packit 08bd4c
#
Packit 08bd4c
# Check for integer types
Packit 08bd4c
#
Packit 08bd4c
#
Packit 08bd4c
CHECK_TYPE_SIZE("short" SIZE_OF_SHORT)
Packit 08bd4c
CHECK_TYPE_SIZE("int" SIZE_OF_INT)
Packit 08bd4c
CHECK_TYPE_SIZE("long" SIZE_OF_LONG)
Packit 08bd4c
CHECK_TYPE_SIZE("long long"     SIZE_OF_LONG_LONG)
Packit 08bd4c
Packit 08bd4c
CHECK_TYPE_SIZE("unsigned short" SIZE_OF_UNSIGNED_SHORT)
Packit 08bd4c
CHECK_TYPE_SIZE("unsigned" SIZE_OF_UNSIGNED)
Packit 08bd4c
CHECK_TYPE_SIZE("unsigned long" SIZE_OF_UNSIGNED_LONG)
Packit 08bd4c
CHECK_TYPE_SIZE("unsigned long long" SIZE_OF_UNSIGNED_LONG_LONG)
Packit 08bd4c
Packit 08bd4c
CHECK_TYPE_SIZE("__int64" __INT64)
Packit 08bd4c
CHECK_TYPE_SIZE("unsigned __int64" UNSIGNED___INT64)
Packit 08bd4c
Packit 08bd4c
CHECK_TYPE_SIZE(int16_t INT16_T)
Packit 08bd4c
CHECK_TYPE_SIZE(int32_t INT32_T)
Packit 08bd4c
CHECK_TYPE_SIZE(int64_t INT64_T)
Packit 08bd4c
CHECK_TYPE_SIZE(intmax_t INTMAX_T)
Packit 08bd4c
CHECK_TYPE_SIZE(uint8_t UINT8_T)
Packit 08bd4c
CHECK_TYPE_SIZE(uint16_t UINT16_T)
Packit 08bd4c
CHECK_TYPE_SIZE(uint32_t UINT32_T)
Packit 08bd4c
CHECK_TYPE_SIZE(uint64_t UINT64_T)
Packit 08bd4c
CHECK_TYPE_SIZE(uintmax_t UINTMAX_T)
Packit 08bd4c
Packit 08bd4c
CHECK_TYPE_SIZE(dev_t       DEV_T)
Packit 08bd4c
IF(NOT HAVE_DEV_T)
Packit 08bd4c
  IF(MSVC)
Packit 08bd4c
    SET(dev_t "unsigned int")
Packit 08bd4c
  ENDIF(MSVC)
Packit 08bd4c
ENDIF(NOT HAVE_DEV_T)
Packit 08bd4c
#
Packit 08bd4c
CHECK_TYPE_SIZE(gid_t       GID_T)
Packit 08bd4c
IF(NOT HAVE_GID_T)
Packit 08bd4c
  IF(WIN32)
Packit 08bd4c
    SET(gid_t "short")
Packit 08bd4c
  ELSE(WIN32)
Packit 08bd4c
    SET(gid_t "unsigned int")
Packit 08bd4c
  ENDIF(WIN32)
Packit 08bd4c
ENDIF(NOT HAVE_GID_T)
Packit 08bd4c
#
Packit 08bd4c
CHECK_TYPE_SIZE(id_t        ID_T)
Packit 08bd4c
IF(NOT HAVE_ID_T)
Packit 08bd4c
  IF(WIN32)
Packit 08bd4c
    SET(id_t "short")
Packit 08bd4c
  ELSE(WIN32)
Packit 08bd4c
    SET(id_t "unsigned int")
Packit 08bd4c
  ENDIF(WIN32)
Packit 08bd4c
ENDIF(NOT HAVE_ID_T)
Packit 08bd4c
#
Packit 08bd4c
CHECK_TYPE_SIZE(mode_t      MODE_T)
Packit 08bd4c
IF(NOT HAVE_MODE_T)
Packit 08bd4c
  IF(WIN32)
Packit 08bd4c
    SET(mode_t "unsigned short")
Packit 08bd4c
  ELSE(WIN32)
Packit 08bd4c
    SET(mode_t "int")
Packit 08bd4c
  ENDIF(WIN32)
Packit 08bd4c
ENDIF(NOT HAVE_MODE_T)
Packit 08bd4c
#
Packit 08bd4c
CHECK_TYPE_SIZE(off_t       OFF_T)
Packit 08bd4c
IF(NOT HAVE_OFF_T)
Packit 08bd4c
  SET(off_t "__int64")
Packit 08bd4c
ENDIF(NOT HAVE_OFF_T)
Packit 08bd4c
#
Packit 08bd4c
CHECK_TYPE_SIZE(size_t      SIZE_T)
Packit 08bd4c
IF(NOT HAVE_SIZE_T)
Packit 08bd4c
  IF("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
Packit 08bd4c
    SET(size_t "uint64_t")
Packit 08bd4c
  ELSE("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
Packit 08bd4c
    SET(size_t   "uint32_t")
Packit 08bd4c
  ENDIF("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
Packit 08bd4c
ENDIF(NOT HAVE_SIZE_T)
Packit 08bd4c
#
Packit 08bd4c
CHECK_TYPE_SIZE(ssize_t     SSIZE_T)
Packit 08bd4c
IF(NOT HAVE_SSIZE_T)
Packit 08bd4c
  IF("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
Packit 08bd4c
    SET(ssize_t "int64_t")
Packit 08bd4c
  ELSE("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
Packit 08bd4c
    SET(ssize_t "long")
Packit 08bd4c
  ENDIF("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
Packit 08bd4c
ENDIF(NOT HAVE_SSIZE_T)
Packit 08bd4c
#
Packit 08bd4c
CHECK_TYPE_SIZE(uid_t       UID_T)
Packit 08bd4c
IF(NOT HAVE_UID_T)
Packit 08bd4c
  IF(WIN32)
Packit 08bd4c
    SET(uid_t "short")
Packit 08bd4c
  ELSE(WIN32)
Packit 08bd4c
    SET(uid_t "unsigned int")
Packit 08bd4c
  ENDIF(WIN32)
Packit 08bd4c
ENDIF(NOT HAVE_UID_T)
Packit 08bd4c
#
Packit 08bd4c
CHECK_TYPE_SIZE(pid_t       PID_T)
Packit 08bd4c
IF(NOT HAVE_PID_T)
Packit 08bd4c
  IF(WIN32)
Packit 08bd4c
    SET(pid_t "int")
Packit 08bd4c
  ELSE(WIN32)
Packit 08bd4c
    MESSAGE(FATAL_ERROR "pid_t doesn't exist on this platform?")
Packit 08bd4c
  ENDIF(WIN32)
Packit 08bd4c
ENDIF(NOT HAVE_PID_T)
Packit 08bd4c
#
Packit 08bd4c
CHECK_TYPE_SIZE(intptr_t   INTPTR_T)
Packit 08bd4c
IF(NOT HAVE_INTPTR_T)
Packit 08bd4c
  IF("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
Packit 08bd4c
    SET(intptr_t "int64_t")
Packit 08bd4c
  ELSE()
Packit 08bd4c
    SET(intptr_t "int32_t")
Packit 08bd4c
  ENDIF()
Packit 08bd4c
ENDIF(NOT HAVE_INTPTR_T)
Packit 08bd4c
#
Packit 08bd4c
CHECK_TYPE_SIZE(uintptr_t   UINTPTR_T)
Packit 08bd4c
IF(NOT HAVE_UINTPTR_T)
Packit 08bd4c
  IF("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
Packit 08bd4c
    SET(uintptr_t "uint64_t")
Packit 08bd4c
  ELSE()
Packit 08bd4c
    SET(uintptr_t "uint32_t")
Packit 08bd4c
  ENDIF()
Packit 08bd4c
ENDIF(NOT HAVE_UINTPTR_T)
Packit 08bd4c
#
Packit 08bd4c
CHECK_TYPE_SIZE(wchar_t     SIZEOF_WCHAR_T)
Packit 08bd4c
IF(HAVE_SIZEOF_WCHAR_T)
Packit 08bd4c
  SET(HAVE_WCHAR_T 1)
Packit 08bd4c
ENDIF(HAVE_SIZEOF_WCHAR_T)
Packit 08bd4c
#
Packit 08bd4c
# Check if _FILE_OFFSET_BITS macro needed for large files
Packit 08bd4c
#
Packit 08bd4c
CHECK_FILE_OFFSET_BITS()
Packit 08bd4c
Packit 08bd4c
#
Packit 08bd4c
# Check for Extended Attribute libraries, headers, and functions
Packit 08bd4c
#
Packit 08bd4c
IF(ENABLE_XATTR)
Packit 08bd4c
  CHECK_LIBRARY_EXISTS(attr "setxattr" "" HAVE_LIBATTR)
Packit 08bd4c
  IF(HAVE_LIBATTR)
Packit 08bd4c
    SET(CMAKE_REQUIRED_LIBRARIES "attr")
Packit 08bd4c
  ENDIF(HAVE_LIBATTR)
Packit 08bd4c
  CHECK_SYMBOL_EXISTS(EXTATTR_NAMESPACE_USER "sys/types.h;sys/extattr.h" HAVE_DECL_EXTATTR_NAMESPACE_USER)
Packit 08bd4c
  CHECK_SYMBOL_EXISTS(XATTR_NOFOLLOW "sys/xattr.h" HAVE_DECL_XATTR_NOFOLLOW)
Packit 08bd4c
  IF(HAVE_SYS_XATTR_H AND HAVE_DECL_XATTR_NOFOLLOW)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS(fgetxattr HAVE_FGETXATTR)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS(flistxattr HAVE_FLISTXATTR)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS(fsetxattr HAVE_FSETXATTR)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS(getxattr HAVE_GETXATTR)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS(listxattr HAVE_LISTXATTR)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS(setxattr HAVE_SETXATTR)
Packit 08bd4c
    IF(HAVE_FGETXATTR AND
Packit 08bd4c
       HAVE_FLISTXATTR AND
Packit 08bd4c
       HAVE_FSETXATTR AND
Packit 08bd4c
       HAVE_GETXATTR AND
Packit 08bd4c
       HAVE_LISTXATTR AND
Packit 08bd4c
       HAVE_SETXATTR)
Packit 08bd4c
      SET(ARCHIVE_XATTR_DARWIN TRUE)
Packit 08bd4c
    ENDIF()
Packit 08bd4c
  ELSEIF(HAVE_SYS_EXTATTR_H AND HAVE_DECL_EXTATTR_NAMESPACE_USER)
Packit 08bd4c
    # FreeBSD xattr support
Packit 08bd4c
    CHECK_FUNCTION_EXISTS(extattr_get_fd HAVE_EXTATTR_GET_FD)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS(extattr_get_file HAVE_EXTATTR_GET_FILE)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS(extattr_get_link HAVE_EXTATTR_GET_LINK)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS(extattr_list_fd HAVE_EXTATTR_LIST_FD)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS(extattr_list_file HAVE_EXTATTR_LIST_FILE)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS(extattr_list_link HAVE_EXTATTR_LIST_LINK)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS(extattr_set_fd HAVE_EXTATTR_SET_FD)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS(extattr_set_link HAVE_EXTATTR_SET_LINK)
Packit 08bd4c
    IF(HAVE_EXTATTR_GET_FD AND
Packit 08bd4c
       HAVE_EXTATTR_GET_FILE AND
Packit 08bd4c
       HAVE_EXTATTR_GET_LINK AND
Packit 08bd4c
       HAVE_EXTATTR_LIST_FD AND
Packit 08bd4c
       HAVE_EXTATTR_LIST_FILE AND
Packit 08bd4c
       HAVE_EXTATTR_LIST_LINK AND
Packit 08bd4c
       HAVE_EXTATTR_SET_FD AND
Packit 08bd4c
       HAVE_EXTATTR_SET_LINK)
Packit 08bd4c
      SET(ARCHIVE_XATTR_FREEBSD TRUE)
Packit 08bd4c
    ENDIF()
Packit 08bd4c
  ELSEIF(HAVE_SYS_XATTR_H OR HAVE_ATTR_XATTR_H)
Packit 08bd4c
    # Linux xattr support
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(fgetxattr HAVE_FGETXATTR)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(flistxattr HAVE_FLISTXATTR)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(fsetxattr HAVE_FSETXATTR)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(getxattr HAVE_GETXATTR)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(lgetxattr HAVE_LGETXATTR)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(listxattr HAVE_LISTXATTR)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(llistxattr HAVE_LLISTXATTR)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(lsetxattr HAVE_LSETXATTR)
Packit 08bd4c
    IF(HAVE_FGETXATTR AND
Packit 08bd4c
       HAVE_FLISTXATTR AND
Packit 08bd4c
       HAVE_FSETXATTR AND
Packit 08bd4c
       HAVE_GETXATTR AND
Packit 08bd4c
       HAVE_LGETXATTR AND
Packit 08bd4c
       HAVE_LISTXATTR AND
Packit 08bd4c
       HAVE_LLISTXATTR AND
Packit 08bd4c
       HAVE_LSETXATTR)
Packit 08bd4c
      SET(ARCHIVE_XATTR_LINUX TRUE)
Packit 08bd4c
    ENDIF()
Packit 08bd4c
  ELSEIF(HAVE_SYS_EA_H)
Packit 08bd4c
    # AIX xattr support
Packit 08bd4c
    CHECK_FUNCTION_EXISTS(fgetea HAVE_FGETEA)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS(flistea HAVE_FLISTEA)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS(fsetea HAVE_FSETEA)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS(getea HAVE_GETEA)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS(lgetea HAVE_LGETEA)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS(listea HAVE_LISTEA)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS(llistea HAVE_LLISTEA)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS(lsetea HAVE_LSETEA)
Packit 08bd4c
    IF(HAVE_FGETEA AND
Packit 08bd4c
       HAVE_FLISTEA AND
Packit 08bd4c
       HAVE_FSETEA AND
Packit 08bd4c
       HAVE_GETEA AND
Packit 08bd4c
       HAVE_LGETEA AND
Packit 08bd4c
       HAVE_LISTEA AND
Packit 08bd4c
       HAVE_LLISTEA AND
Packit 08bd4c
       HAVE_LSETEA)
Packit 08bd4c
      SET(ARCHIVE_XATTR_AIX TRUE)
Packit 08bd4c
    ENDIF()
Packit 08bd4c
  ENDIF()
Packit 08bd4c
Packit 08bd4c
  IF(ARCHIVE_XATTR_DARWIN)
Packit 08bd4c
    MESSAGE(STATUS "Extended attributes support: Darwin")
Packit 08bd4c
  ELSEIF(ARCHIVE_XATTR_FREEBSD)
Packit 08bd4c
    MESSAGE(STATUS "Extended attributes support: FreeBSD")
Packit 08bd4c
  ELSEIF(ARCHIVE_XATTR_LINUX)
Packit 08bd4c
    MESSAGE(STATUS "Extended attributes support: Linux")
Packit 08bd4c
  ELSEIF(ARCHIVE_XATTR_AIX)
Packit 08bd4c
    MESSAGE(STATUS "Extended attributes support: AIX")
Packit 08bd4c
  ELSE()
Packit 08bd4c
    MESSAGE(STATUS "Extended attributes support: none")
Packit 08bd4c
  ENDIF()
Packit 08bd4c
ELSE(ENABLE_XATTR)
Packit 08bd4c
  SET(ARCHIVE_XATTR_DARWIN FALSE)
Packit 08bd4c
  SET(ARCHIVE_XATTR_FREEBSD FALSE)
Packit 08bd4c
  SET(ARCHIVE_XATTR_LINUX FALSE)
Packit 08bd4c
  SET(ARCHIVE_XATTR_AIX FALSE)
Packit 08bd4c
ENDIF(ENABLE_XATTR)
Packit 08bd4c
Packit 08bd4c
#
Packit 08bd4c
# Check for ACL libraries, headers, and functions
Packit 08bd4c
#
Packit 08bd4c
# The ACL support in libarchive is written against the POSIX1e draft,
Packit 08bd4c
# which was never officially approved and varies quite a bit across
Packit 08bd4c
# platforms.  Worse, some systems have completely non-POSIX acl functions,
Packit 08bd4c
# which makes the following checks rather more complex than I would like.
Packit 08bd4c
#
Packit 08bd4c
IF(ENABLE_ACL)
Packit 08bd4c
  # Solaris and derivates ACLs
Packit 08bd4c
  CHECK_FUNCTION_EXISTS(acl HAVE_ACL)
Packit 08bd4c
  CHECK_FUNCTION_EXISTS(facl HAVE_FACL)
Packit 08bd4c
Packit 08bd4c
  # Libacl
Packit 08bd4c
  CHECK_LIBRARY_EXISTS(acl "acl_get_file" "" HAVE_LIBACL)
Packit 08bd4c
  IF(HAVE_LIBACL)
Packit 08bd4c
    SET(CMAKE_REQUIRED_LIBRARIES "acl")
Packit 08bd4c
    FIND_LIBRARY(ACL_LIBRARY NAMES acl)
Packit 08bd4c
    LIST(APPEND ADDITIONAL_LIBS ${ACL_LIBRARY})
Packit 08bd4c
  ENDIF(HAVE_LIBACL)
Packit 08bd4c
Packit 08bd4c
  CHECK_TYPE_EXISTS(acl_t "sys/types.h;sys/acl.h" HAVE_ACL_T)
Packit 08bd4c
  CHECK_TYPE_EXISTS(acl_entry_t "sys/types.h;sys/acl.h" HAVE_ACL_ENTRY_T)
Packit 08bd4c
  CHECK_TYPE_EXISTS(acl_permset_t "sys/types.h;sys/acl.h" HAVE_ACL_PERMSET_T)
Packit 08bd4c
  CHECK_TYPE_EXISTS(acl_tag_t "sys/types.h;sys/acl.h" HAVE_ACL_TAG_T)
Packit 08bd4c
Packit 08bd4c
  IF(HAVE_ACL AND HAVE_FACL)
Packit 08bd4c
    CHECK_TYPE_EXISTS(aclent_t "sys/acl.h" HAVE_ACLENT_T)
Packit 08bd4c
    IF(HAVE_ACLENT_T)
Packit 08bd4c
      CHECK_SYMBOL_EXISTS(GETACL "sys/acl.h" HAVE_DECL_GETACL)
Packit 08bd4c
      CHECK_SYMBOL_EXISTS(GETACLCNT "sys/acl.h" HAVE_DECL_GETACLCNT)
Packit 08bd4c
      CHECK_SYMBOL_EXISTS(SETACL "sys/acl.h" HAVE_DECL_SETACL)
Packit 08bd4c
      IF(HAVE_DECL_GETACL AND
Packit 08bd4c
         HAVE_DECL_GETACLCNT AND
Packit 08bd4c
         HAVE_DECL_SETACL)
Packit 08bd4c
        SET(ARCHIVE_ACL_SUNOS TRUE)
Packit 08bd4c
      ENDIF()
Packit 08bd4c
      CHECK_TYPE_EXISTS(ace_t "sys/acl.h" HAVE_ACE_T)
Packit 08bd4c
      IF(HAVE_ACE_T)
Packit 08bd4c
        CHECK_SYMBOL_EXISTS(ACE_GETACL "sys/acl.h" HAVE_DECL_ACE_GETACL)
Packit 08bd4c
        CHECK_SYMBOL_EXISTS(ACE_GETACLCNT "sys/acl.h" HAVE_DECL_ACE_GETACLCNT)
Packit 08bd4c
        CHECK_SYMBOL_EXISTS(ACE_SETACL "sys/acl.h" HAVE_DECL_ACE_SETACL)
Packit 08bd4c
        IF(HAVE_DECL_ACE_GETACL AND
Packit 08bd4c
           HAVE_DECL_ACE_GETACLCNT AND
Packit 08bd4c
           HAVE_DECL_ACE_SETACL)
Packit 08bd4c
          SET(ARCHIVE_ACL_SUNOS_NFS4 TRUE)
Packit 08bd4c
        ENDIF()
Packit 08bd4c
      ENDIF(HAVE_ACE_T)
Packit 08bd4c
    ENDIF(HAVE_ACLENT_T)
Packit 08bd4c
  ENDIF(HAVE_ACL AND HAVE_FACL)
Packit 08bd4c
Packit 08bd4c
  IF(HAVE_ACL_T AND HAVE_ACL_ENTRY_T AND HAVE_ACL_PERMSET_T AND HAVE_ACL_TAG_T)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(acl_add_perm HAVE_ACL_ADD_PERM)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(acl_clear_perms HAVE_ACL_CLEAR_PERMS)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(acl_create_entry HAVE_ACL_CREATE_ENTRY)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(acl_delete_def_file HAVE_ACL_DELETE_DEF_FILE)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(acl_free HAVE_ACL_FREE)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(acl_get_entry HAVE_ACL_GET_ENTRY)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(acl_get_fd HAVE_ACL_GET_FD)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(acl_get_file HAVE_ACL_GET_FILE)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(acl_get_permset HAVE_ACL_GET_PERMSET)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(acl_get_qualifier HAVE_ACL_GET_QUALIFIER)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(acl_get_tag_type HAVE_ACL_GET_TAG_TYPE)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(acl_init HAVE_ACL_INIT)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(acl_set_fd HAVE_ACL_SET_FD)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(acl_set_file HAVE_ACL_SET_FILE)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(acl_set_qualifier HAVE_ACL_SET_QUALIFIER)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(acl_set_tag_type HAVE_ACL_SET_TAG_TYPE)
Packit 08bd4c
    IF(HAVE_ACL_ADD_PERM AND
Packit 08bd4c
       HAVE_ACL_CLEAR_PERMS AND
Packit 08bd4c
       HAVE_ACL_CREATE_ENTRY AND
Packit 08bd4c
       HAVE_ACL_DELETE_DEF_FILE AND
Packit 08bd4c
       HAVE_ACL_FREE AND
Packit 08bd4c
       HAVE_ACL_GET_ENTRY AND
Packit 08bd4c
       HAVE_ACL_GET_FD AND
Packit 08bd4c
       HAVE_ACL_GET_FILE AND
Packit 08bd4c
       HAVE_ACL_GET_PERMSET AND
Packit 08bd4c
       HAVE_ACL_GET_QUALIFIER AND
Packit 08bd4c
       HAVE_ACL_GET_TAG_TYPE AND
Packit 08bd4c
       HAVE_ACL_INIT AND
Packit 08bd4c
       HAVE_ACL_SET_FD AND
Packit 08bd4c
       HAVE_ACL_SET_FILE AND
Packit 08bd4c
       HAVE_ACL_SET_QUALIFIER AND
Packit 08bd4c
       HAVE_ACL_SET_TAG_TYPE)
Packit 08bd4c
         SET(HAVE_POSIX_ACL_FUNCS 1)
Packit 08bd4c
    ENDIF()
Packit 08bd4c
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(acl_get_perm HAVE_ACL_GET_PERM)
Packit 08bd4c
Packit 08bd4c
    IF(HAVE_POSIX_ACL_FUNCS AND HAVE_ACL_LIBACL_H AND HAVE_LIBACL AND
Packit 08bd4c
       HAVE_ACL_GET_PERM)
Packit 08bd4c
      SET(ARCHIVE_ACL_LIBACL TRUE)
Packit 08bd4c
    ELSE()
Packit 08bd4c
      CHECK_FUNCTION_EXISTS(acl_add_flag_np HAVE_ACL_ADD_FLAG_NP)
Packit 08bd4c
      CHECK_FUNCTION_EXISTS(acl_clear_flags_np HAVE_ACL_CLEAR_FLAGS_NP)
Packit 08bd4c
      CHECK_FUNCTION_EXISTS(acl_get_brand_np HAVE_ACL_GET_BRAND_NP)
Packit 08bd4c
      CHECK_FUNCTION_EXISTS(acl_get_entry_type_np HAVE_ACL_GET_ENTRY_TYPE_NP)
Packit 08bd4c
      CHECK_FUNCTION_EXISTS(acl_get_flag_np HAVE_ACL_GET_FLAG_NP)
Packit 08bd4c
      CHECK_FUNCTION_EXISTS(acl_get_flagset_np HAVE_ACL_GET_FLAGSET_NP)
Packit 08bd4c
      CHECK_FUNCTION_EXISTS(acl_get_fd_np HAVE_ACL_GET_FD_NP)
Packit 08bd4c
      CHECK_FUNCTION_EXISTS(acl_get_link_np HAVE_ACL_GET_LINK_NP)
Packit 08bd4c
      CHECK_FUNCTION_EXISTS(acl_get_perm_np HAVE_ACL_GET_PERM_NP)
Packit 08bd4c
      CHECK_FUNCTION_EXISTS(acl_is_trivial_np HAVE_ACL_IS_TRIVIAL_NP)
Packit 08bd4c
      CHECK_FUNCTION_EXISTS(acl_set_entry_type_np HAVE_ACL_SET_ENTRY_TYPE_NP)
Packit 08bd4c
      CHECK_FUNCTION_EXISTS(acl_set_fd_np HAVE_ACL_SET_FD_NP)
Packit 08bd4c
      CHECK_FUNCTION_EXISTS(acl_set_link_np HAVE_ACL_SET_LINK_NP)
Packit 08bd4c
      CHECK_FUNCTION_EXISTS(mbr_gid_to_uuid HAVE_MBR_GID_TO_UUID)
Packit 08bd4c
      CHECK_FUNCTION_EXISTS(mbr_uid_to_uuid HAVE_MBR_UID_TO_UUID)
Packit 08bd4c
      CHECK_FUNCTION_EXISTS(mbr_uuid_to_id HAVE_MBR_UUID_TO_ID)
Packit 08bd4c
Packit 08bd4c
      CHECK_C_SOURCE_COMPILES("#include <sys/types.h>
Packit 08bd4c
#include <sys/acl.h>
Packit 08bd4c
int main(void) { return ACL_TYPE_EXTENDED; }" HAVE_DECL_ACL_TYPE_EXTENDED)
Packit 08bd4c
      CHECK_C_SOURCE_COMPILES("#include <sys/types.h>
Packit 08bd4c
#include <sys/acl.h>
Packit 08bd4c
int main(void) { return ACL_SYNCHRONIZE; }" HAVE_DECL_ACL_SYNCHRONIZE)
Packit 08bd4c
      CHECK_SYMBOL_EXISTS(ACL_TYPE_NFS4 "sys/acl.h" HAVE_DECL_ACL_TYPE_NFS4)
Packit 08bd4c
      CHECK_SYMBOL_EXISTS(ACL_USER "sys/acl.h" HAVE_DECL_ACL_USER)
Packit 08bd4c
Packit 08bd4c
      IF(HAVE_POSIX_ACL_FUNCS AND
Packit 08bd4c
         HAVE_ACL_GET_FD_NP AND
Packit 08bd4c
         HAVE_ACL_GET_PERM_NP AND
Packit 08bd4c
         NOT HAVE_ACL_GET_PERM AND
Packit 08bd4c
         HAVE_ACL_SET_FD_NP)
Packit 08bd4c
        IF(HAVE_DECL_ACL_USER)
Packit 08bd4c
          SET(ARCHIVE_ACL_FREEBSD TRUE)
Packit 08bd4c
          IF(HAVE_DECL_ACL_TYPE_NFS4 AND
Packit 08bd4c
             HAVE_ACL_ADD_FLAG_NP AND
Packit 08bd4c
             HAVE_ACL_CLEAR_FLAGS_NP AND
Packit 08bd4c
             HAVE_ACL_GET_BRAND_NP AND
Packit 08bd4c
             HAVE_ACL_GET_ENTRY_TYPE_NP AND
Packit 08bd4c
             HAVE_ACL_GET_FLAGSET_NP AND
Packit 08bd4c
             HAVE_ACL_SET_ENTRY_TYPE_NP)
Packit 08bd4c
            SET(ARCHIVE_ACL_FREEBSD_NFS4 TRUE)
Packit 08bd4c
          ENDIF()
Packit 08bd4c
        ELSEIF(HAVE_DECL_ACL_TYPE_EXTENDED AND
Packit 08bd4c
               HAVE_MEMBERSHIP_H AND
Packit 08bd4c
               HAVE_ACL_ADD_FLAG_NP AND
Packit 08bd4c
               HAVE_ACL_CLEAR_FLAGS_NP AND
Packit 08bd4c
               HAVE_ACL_GET_FLAGSET_NP AND
Packit 08bd4c
               HAVE_ACL_GET_LINK_NP AND
Packit 08bd4c
               HAVE_ACL_SET_LINK_NP AND
Packit 08bd4c
               HAVE_MBR_UID_TO_UUID AND
Packit 08bd4c
               HAVE_MBR_GID_TO_UUID AND
Packit 08bd4c
               HAVE_MBR_UUID_TO_ID)
Packit 08bd4c
          SET(ARCHIVE_ACL_DARWIN TRUE)
Packit 08bd4c
        ENDIF()
Packit 08bd4c
      ENDIF()
Packit 08bd4c
    ENDIF()
Packit 08bd4c
  ENDIF(HAVE_ACL_T AND HAVE_ACL_ENTRY_T AND HAVE_ACL_PERMSET_T AND
Packit 08bd4c
        HAVE_ACL_TAG_T)
Packit 08bd4c
Packit 08bd4c
  # Richacl
Packit 08bd4c
  CHECK_LIBRARY_EXISTS(richacl "richacl_get_file" "" HAVE_LIBRICHACL)
Packit 08bd4c
  IF(HAVE_LIBRICHACL)
Packit 08bd4c
    SET(CMAKE_REQUIRED_LIBRARIES "richacl")
Packit 08bd4c
    FIND_LIBRARY(RICHACL_LIBRARY NAMES richacl)
Packit 08bd4c
    LIST(APPEND ADDITIONAL_LIBS ${RICHACL_LIBRARY})
Packit 08bd4c
  ENDIF(HAVE_LIBRICHACL)
Packit 08bd4c
Packit 08bd4c
  CHECK_STRUCT_HAS_MEMBER("struct richace" e_type "sys/richacl.h"
Packit 08bd4c
    HAVE_STRUCT_RICHACE)
Packit 08bd4c
  CHECK_STRUCT_HAS_MEMBER("struct richacl" a_flags "sys/richacl.h"
Packit 08bd4c
    HAVE_STRUCT_RICHACL)
Packit 08bd4c
Packit 08bd4c
  IF(HAVE_LIBRICHACL AND HAVE_STRUCT_RICHACL AND HAVE_STRUCT_RICHACE)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(richacl_alloc HAVE_RICHACL_ALLOC)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(richacl_equiv_mode HAVE_RICHACL_EQUIV_MODE)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(richacl_free HAVE_RICHACL_FREE)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(richacl_get_fd HAVE_RICHACL_GET_FD)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(richacl_get_file HAVE_RICHACL_GET_FILE)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(richacl_set_fd HAVE_RICHACL_SET_FD)
Packit 08bd4c
    CHECK_FUNCTION_EXISTS_GLIBC(richacl_set_file HAVE_RICHACL_SET_FILE)
Packit 08bd4c
    IF(HAVE_RICHACL_ALLOC AND
Packit 08bd4c
       HAVE_RICHACL_EQUIV_MODE AND
Packit 08bd4c
       HAVE_RICHACL_FREE AND
Packit 08bd4c
       HAVE_RICHACL_GET_FD AND
Packit 08bd4c
       HAVE_RICHACL_GET_FILE AND
Packit 08bd4c
       HAVE_RICHACL_SET_FD AND
Packit 08bd4c
       HAVE_RICHACL_SET_FILE)
Packit 08bd4c
      SET(ARCHIVE_ACL_LIBRICHACL TRUE)
Packit 08bd4c
    ENDIF()
Packit 08bd4c
  ENDIF(HAVE_LIBRICHACL AND HAVE_STRUCT_RICHACL AND HAVE_STRUCT_RICHACE)
Packit 08bd4c
Packit 08bd4c
  IF(ARCHIVE_ACL_DARWIN)
Packit 08bd4c
    MESSAGE(STATUS "ACL support: Darwin (limited NFSv4)")
Packit 08bd4c
  ELSEIF(ARCHIVE_ACL_FREEBSD_NFS4)
Packit 08bd4c
    MESSAGE(STATUS "ACL support: FreeBSD (POSIX.1e and NFSv4)")
Packit 08bd4c
  ELSEIF(ARCHIVE_ACL_FREEBSD)
Packit 08bd4c
    MESSAGE(STATUS "ACL support: FreeBSD (POSIX.1e)")
Packit 08bd4c
  ELSEIF(ARCHIVE_ACL_LIBACL OR ARCHIVE_ACL_LIBRICHACL)
Packit 08bd4c
    IF(ARCHIVE_ACL_LIBACL AND ARCHIVE_ACL_LIBRICHACL)
Packit 08bd4c
      MESSAGE(STATUS "ACL support: libacl (POSIX.1e) + librichacl (NFSv4)")
Packit 08bd4c
    ELSEIF(ARCHIVE_ACL_LIBRICHACL)
Packit 08bd4c
      MESSAGE(STATUS "ACL support: librichacl (NFSv4)")
Packit 08bd4c
    ELSE()
Packit 08bd4c
      MESSAGE(STATUS "ACL support: libacl (POSIX.1e)")
Packit 08bd4c
    ENDIF()
Packit 08bd4c
  ELSEIF(ARCHIVE_ACL_SUNOS_NFS4)
Packit 08bd4c
    MESSAGE(STATUS "ACL support: Solaris (POSIX.1e and NFSv4)")
Packit 08bd4c
  ELSEIF(ARCHIVE_ACL_SUNOS)
Packit 08bd4c
    MESSAGE(STATUS "ACL support: Solaris (POSIX.1e)")
Packit 08bd4c
  ELSE()
Packit 08bd4c
    MESSAGE(STATUS "ACL support: none")
Packit 08bd4c
  ENDIF()
Packit 08bd4c
Packit 08bd4c
ELSE(ENABLE_ACL)
Packit 08bd4c
  # If someone runs cmake, then disables ACL support, we need
Packit 08bd4c
  # to forcibly override the cached values for these.
Packit 08bd4c
  SET(ARCHIVE_ACL_DARWIN FALSE)
Packit 08bd4c
  SET(ARCHIVE_ACL_FREEBSD FALSE)
Packit 08bd4c
  SET(ARCHIVE_ACL_FREEBSD_NFS4 FALSE)
Packit 08bd4c
  SET(ARCHIVE_ACL_LIBACL FALSE)
Packit 08bd4c
  SET(ARCHIVE_ACL_SUNOS FALSE)
Packit 08bd4c
  SET(ARCHIVE_ACL_SUNOS_NFS4 FALSE)
Packit 08bd4c
ENDIF(ENABLE_ACL)
Packit 08bd4c
Packit 08bd4c
#
Packit 08bd4c
# Check MD5/RMD160/SHA support
Packit 08bd4c
# NOTE: Crypto checks must be run last before generating config.h
Packit 08bd4c
#
Packit 08bd4c
CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" LIBC)
Packit 08bd4c
CHECK_CRYPTO("SHA256;SHA384;SHA512" LIBC2)
Packit 08bd4c
CHECK_CRYPTO("SHA256;SHA384;SHA512" LIBC3)
Packit 08bd4c
CHECK_CRYPTO("MD5;SHA1;SHA256;SHA384;SHA512" LIBSYSTEM)
Packit 08bd4c
CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" NETTLE)
Packit 08bd4c
CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" OPENSSL)
Packit 08bd4c
Packit 08bd4c
# Libmd has to be probed after OpenSSL.
Packit 08bd4c
CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA512" LIBMD)
Packit 08bd4c
Packit 08bd4c
CHECK_CRYPTO_WIN("MD5;SHA1;SHA256;SHA384;SHA512")
Packit 08bd4c
Packit 08bd4c
# Generate "config.h" from "build/cmake/config.h.in"
Packit 08bd4c
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/build/cmake/config.h.in
Packit 08bd4c
	${CMAKE_CURRENT_BINARY_DIR}/config.h)
Packit 08bd4c
INCLUDE_DIRECTORIES(BEFORE ${CMAKE_CURRENT_BINARY_DIR})
Packit 08bd4c
ADD_DEFINITIONS(-DHAVE_CONFIG_H)
Packit 08bd4c
Packit 08bd4c
# Handle generation of the libarchive.pc file for pkg-config
Packit 08bd4c
INCLUDE(CreatePkgConfigFile)
Packit 08bd4c
Packit 08bd4c
#
Packit 08bd4c
# Register installation of PDF documents.
Packit 08bd4c
#
Packit 08bd4c
IF(WIN32 AND NOT CYGWIN)
Packit 08bd4c
  #
Packit 08bd4c
  # On Windows platform, It's better that we install PDF documents
Packit 08bd4c
  # on one's computer.
Packit 08bd4c
  # These PDF documents are available in the release package.
Packit 08bd4c
  #
Packit 08bd4c
  IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/doc/pdf)
Packit 08bd4c
    INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc/pdf
Packit 08bd4c
            DESTINATION share/man
Packit 08bd4c
            FILES_MATCHING PATTERN "*.pdf"
Packit 08bd4c
    )
Packit 08bd4c
  ENDIF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/doc/pdf)
Packit 08bd4c
ENDIF(WIN32 AND NOT CYGWIN)
Packit 08bd4c
#
Packit 08bd4c
#
Packit 08bd4c
#
Packit 08bd4c
INCLUDE_DIRECTORIES(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/libarchive)
Packit 08bd4c
#
Packit 08bd4c
IF(MSVC)
Packit 08bd4c
  ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE)
Packit 08bd4c
ENDIF(MSVC)
Packit 08bd4c
Packit 08bd4c
IF(ENABLE_TEST)
Packit 08bd4c
  ADD_CUSTOM_TARGET(run_all_tests)
Packit 08bd4c
ENDIF(ENABLE_TEST)
Packit 08bd4c
Packit 08bd4c
add_subdirectory(libarchive)
Packit 08bd4c
add_subdirectory(cat)
Packit 08bd4c
add_subdirectory(tar)
Packit 08bd4c
add_subdirectory(cpio)