head	1.22;
access;
symbols
	libarchive-3-8-8:1.1.1.21
	pkgsrc-2026Q2:1.21.0.2
	pkgsrc-2026Q2-base:1.21
	libarchive-3-8-7:1.1.1.20
	libarchive-3-8-6:1.1.1.19
	pkgsrc-2026Q1:1.20.0.2
	pkgsrc-2026Q1-base:1.20
	libarchive-3-8-5:1.1.1.19
	libarchive-3-8-4:1.1.1.18
	pkgsrc-2025Q4:1.19.0.2
	pkgsrc-2025Q4-base:1.19
	libarchive-3-8-3:1.1.1.18
	libarchive-3-8-2:1.1.1.17
	pkgsrc-2025Q3:1.17.0.2
	pkgsrc-2025Q3-base:1.17
	libarchive-3-8-1:1.1.1.16
	pkgsrc-2025Q2:1.16.0.2
	pkgsrc-2025Q2-base:1.16
	libarchive-3-8-0:1.1.1.15
	libarchive-3-7-9:1.1.1.14
	pkgsrc-2025Q1:1.14.0.4
	pkgsrc-2025Q1-base:1.14
	pkgsrc-2024Q4:1.14.0.2
	pkgsrc-2024Q4-base:1.14
	libarchive-3-7-7:1.1.1.13
	pkgsrc-2024Q3:1.13.0.2
	pkgsrc-2024Q3-base:1.13
	libarchive-3-7-5:1.1.1.12
	pkgsrc-2024Q2:1.12.0.2
	pkgsrc-2024Q2-base:1.12
	libarchive-3-7-4:1.1.1.11
	libarchive-3-7-3:1.1.1.10
	pkgsrc-2024Q1:1.10.0.2
	pkgsrc-2024Q1-base:1.10
	libarchive-3-7-2:1.1.1.9
	pkgsrc-2023Q4:1.9.0.30
	pkgsrc-2023Q4-base:1.9
	pkgsrc-2023Q3:1.9.0.28
	pkgsrc-2023Q3-base:1.9
	pkgsrc-2023Q2:1.9.0.26
	pkgsrc-2023Q2-base:1.9
	pkgsrc-2023Q1:1.9.0.24
	pkgsrc-2023Q1-base:1.9
	pkgsrc-2022Q4:1.9.0.22
	pkgsrc-2022Q4-base:1.9
	pkgsrc-2022Q3:1.9.0.20
	pkgsrc-2022Q3-base:1.9
	pkgsrc-2022Q2:1.9.0.18
	pkgsrc-2022Q2-base:1.9
	pkgsrc-2022Q1:1.9.0.16
	pkgsrc-2022Q1-base:1.9
	pkgsrc-2021Q4:1.9.0.14
	pkgsrc-2021Q4-base:1.9
	pkgsrc-2021Q3:1.9.0.12
	pkgsrc-2021Q3-base:1.9
	pkgsrc-2021Q2:1.9.0.10
	pkgsrc-2021Q2-base:1.9
	pkgsrc-2021Q1:1.9.0.8
	pkgsrc-2021Q1-base:1.9
	pkgsrc-2020Q4:1.9.0.6
	pkgsrc-2020Q4-base:1.9
	pkgsrc-2020Q3:1.9.0.4
	pkgsrc-2020Q3-base:1.9
	pkgsrc-2020Q2:1.9.0.2
	pkgsrc-2020Q2-base:1.9
	pkgsrc-2020Q1:1.8.0.4
	pkgsrc-2020Q1-base:1.8
	pkgsrc-2019Q4:1.8.0.6
	pkgsrc-2019Q4-base:1.8
	pkgsrc-2019Q3:1.8.0.2
	pkgsrc-2019Q3-base:1.8
	libarchive-3-4-0:1.1.1.8
	libarchive-3-3-3:1.1.1.7
	pkgsrc-2019Q2:1.7.0.2
	pkgsrc-2019Q2-base:1.7
	pkgsrc-2019Q1:1.6.0.16
	pkgsrc-2019Q1-base:1.6
	pkgsrc-2018Q4:1.6.0.14
	pkgsrc-2018Q4-base:1.6
	pkgsrc-2018Q3:1.6.0.12
	pkgsrc-2018Q3-base:1.6
	pkgsrc-2018Q2:1.6.0.10
	pkgsrc-2018Q2-base:1.6
	pkgsrc-2018Q1:1.6.0.8
	pkgsrc-2018Q1-base:1.6
	pkgsrc-2017Q4:1.6.0.6
	pkgsrc-2017Q4-base:1.6
	pkgsrc-2017Q3:1.6.0.4
	pkgsrc-2017Q3-base:1.6
	libarchive-3-3-2:1.1.1.6
	pkgsrc-2017Q2:1.5.0.4
	pkgsrc-2017Q2-base:1.5
	pkgsrc-2017Q1:1.5.0.2
	pkgsrc-2017Q1-base:1.5
	libarchive-3-3-1:1.1.1.5
	pkgsrc-2016Q4:1.3.0.6
	pkgsrc-2016Q4-base:1.3
	pkgsrc-2016Q3:1.3.0.4
	pkgsrc-2016Q3-base:1.3
	pkgsrc-2016Q2:1.3.0.2
	pkgsrc-2016Q2-base:1.3
	libarchive-3-2-1:1.1.1.4
	pkgsrc-2016Q1:1.2.0.10
	pkgsrc-2016Q1-base:1.2
	pkgsrc-2015Q4:1.2.0.8
	pkgsrc-2015Q4-base:1.2
	pkgsrc-2015Q3:1.2.0.6
	pkgsrc-2015Q3-base:1.2
	pkgsrc-2015Q2:1.2.0.4
	pkgsrc-2015Q2-base:1.2
	pkgsrc-2015Q1:1.2.0.2
	pkgsrc-2015Q1-base:1.2
	pkgsrc-2014Q4:1.1.1.3.0.36
	pkgsrc-2014Q4-base:1.1.1.3
	pkgsrc-2014Q3:1.1.1.3.0.34
	pkgsrc-2014Q3-base:1.1.1.3
	pkgsrc-2014Q2:1.1.1.3.0.32
	pkgsrc-2014Q2-base:1.1.1.3
	pkgsrc-2014Q1:1.1.1.3.0.30
	pkgsrc-2014Q1-base:1.1.1.3
	pkgsrc-2013Q4:1.1.1.3.0.28
	pkgsrc-2013Q4-base:1.1.1.3
	pkgsrc-2013Q3:1.1.1.3.0.26
	pkgsrc-2013Q3-base:1.1.1.3
	pkgsrc-2013Q2:1.1.1.3.0.24
	pkgsrc-2013Q2-base:1.1.1.3
	pkgsrc-2013Q1:1.1.1.3.0.22
	pkgsrc-2013Q1-base:1.1.1.3
	pkgsrc-2012Q4:1.1.1.3.0.20
	pkgsrc-2012Q4-base:1.1.1.3
	pkgsrc-2012Q3:1.1.1.3.0.18
	pkgsrc-2012Q3-base:1.1.1.3
	pkgsrc-2012Q2:1.1.1.3.0.16
	pkgsrc-2012Q2-base:1.1.1.3
	pkgsrc-2012Q1:1.1.1.3.0.14
	pkgsrc-2012Q1-base:1.1.1.3
	pkgsrc-2011Q4:1.1.1.3.0.12
	pkgsrc-2011Q4-base:1.1.1.3
	pkgsrc-2011Q3:1.1.1.3.0.10
	pkgsrc-2011Q3-base:1.1.1.3
	pkgsrc-2011Q2:1.1.1.3.0.8
	pkgsrc-2011Q2-base:1.1.1.3
	pkgsrc-2011Q1:1.1.1.3.0.6
	pkgsrc-2011Q1-base:1.1.1.3
	pkgsrc-2010Q4:1.1.1.3.0.4
	pkgsrc-2010Q4-base:1.1.1.3
	pkgsrc-2010Q3:1.1.1.3.0.2
	pkgsrc-2010Q3-base:1.1.1.3
	libarchive-2-8-4:1.1.1.3
	pkgsrc-2010Q2:1.1.1.2.0.4
	pkgsrc-2010Q2-base:1.1.1.2
	pkgsrc-2010Q1:1.1.1.2.0.2
	pkgsrc-2010Q1-base:1.1.1.2
	libarchive-2-8-3:1.1.1.2
	libarchive-2-8-2:1.1.1.2
	libarchive-2-8-0:1.1.1.1
	KIENTZLE:1.1.1;
locks; strict;
comment	@# @;


1.22
date	2026.06.24.06.29.50;	author adam;	state Exp;
branches;
next	1.21;
commitid	keXVOnvWIwV061LG;

1.21
date	2026.04.15.08.46.32;	author adam;	state Exp;
branches;
next	1.20;
commitid	pL26mrnh4kOo62CG;

1.20
date	2026.01.06.11.55.21;	author adam;	state Exp;
branches;
next	1.19;
commitid	lOosf75XWhczkkpG;

1.19
date	2025.11.20.06.08.23;	author adam;	state Exp;
branches;
next	1.18;
commitid	kB7NF5kSlmUaVfjG;

1.18
date	2025.11.02.08.52.11;	author adam;	state Exp;
branches;
next	1.17;
commitid	hdaVwMAEUWR8pXgG;

1.17
date	2025.07.01.15.14.42;	author adam;	state Exp;
branches;
next	1.16;
commitid	sA2cBFYBXpUBv31G;

1.16
date	2025.05.21.15.25.47;	author adam;	state Exp;
branches;
next	1.15;
commitid	6aTN21WjRYk8TMVF;

1.15
date	2025.04.28.10.31.33;	author adam;	state Exp;
branches;
next	1.14;
commitid	Tocq615J6mYPZNSF;

1.14
date	2024.10.19.05.39.53;	author adam;	state Exp;
branches;
next	1.13;
commitid	fYRSlpIWMYluweuF;

1.13
date	2024.09.15.07.02.17;	author adam;	state Exp;
branches;
next	1.12;
commitid	x365AQIKhret4SpF;

1.12
date	2024.04.30.06.05.16;	author adam;	state Exp;
branches;
next	1.11;
commitid	id0E8i4RwCC4c88F;

1.11
date	2024.04.12.15.39.46;	author adam;	state Exp;
branches;
next	1.10;
commitid	52ilmjFHKDf0XR5F;

1.10
date	2024.01.18.18.00.11;	author adam;	state Exp;
branches;
next	1.9;
commitid	hNXpsHx3SuHqsXUE;

1.9
date	2020.05.26.09.16.39;	author nia;	state Exp;
branches;
next	1.8;
commitid	nNhsdZACz3PjmJ9C;

1.8
date	2019.09.22.09.55.06;	author joerg;	state Exp;
branches;
next	1.7;
commitid	FdPvRjF4OzwBwZDB;

1.7
date	2019.04.10.08.24.03;	author adam;	state Exp;
branches;
next	1.6;
commitid	LnliQ9ieqYkikMiB;

1.6
date	2017.08.01.22.26.22;	author joerg;	state Exp;
branches;
next	1.5;
commitid	32clTfkmVE8bPy1A;

1.5
date	2017.03.12.06.45.16;	author joerg;	state Exp;
branches;
next	1.4;
commitid	vPKaizPtVY6ebeJz;

1.4
date	2017.02.25.21.11.18;	author joerg;	state Exp;
branches;
next	1.3;
commitid	rW8QfCWrsCO1snHz;

1.3
date	2016.06.20.17.24.55;	author joerg;	state Exp;
branches;
next	1.2;
commitid	ArUvympBjfBseebz;

1.2
date	2015.01.17.12.44.47;	author adam;	state Exp;
branches;
next	1.1;
commitid	yy7e1hLrfmA2pn6y;

1.1
date	2010.02.20.03.48.47;	author joerg;	state Exp;
branches
	1.1.1.1;
next	;

1.1.1.1
date	2010.02.20.03.48.47;	author joerg;	state Exp;
branches;
next	1.1.1.2;

1.1.1.2
date	2010.03.14.17.56.25;	author joerg;	state Exp;
branches;
next	1.1.1.3;

1.1.1.3
date	2010.07.09.11.53.07;	author joerg;	state Exp;
branches;
next	1.1.1.4;

1.1.1.4
date	2016.06.20.17.11.11;	author joerg;	state Exp;
branches;
next	1.1.1.5;
commitid	rRgm3BqbmbI8aebz;

1.1.1.5
date	2017.02.25.20.54.05;	author joerg;	state Exp;
branches;
next	1.1.1.6;
commitid	ReqPI0ibLYjdmnHz;

1.1.1.6
date	2017.08.01.22.21.09;	author joerg;	state Exp;
branches;
next	1.1.1.7;
commitid	XQwPAFJku336Ny1A;

1.1.1.7
date	2019.09.22.09.47.00;	author joerg;	state Exp;
branches;
next	1.1.1.8;
commitid	N0KxAXOYyULduZDB;

1.1.1.8
date	2019.09.22.09.51.28;	author joerg;	state Exp;
branches;
next	1.1.1.9;
commitid	5kDbfPbiV3INvZDB;

1.1.1.9
date	2024.01.18.17.37.41;	author adam;	state Exp;
branches;
next	1.1.1.10;
commitid	zDULEPUODGjTkXUE;

1.1.1.10
date	2024.04.12.15.27.38;	author adam;	state Exp;
branches;
next	1.1.1.11;
commitid	tQWTddCoxBumSR5F;

1.1.1.11
date	2024.04.30.05.50.46;	author adam;	state Exp;
branches;
next	1.1.1.12;
commitid	e4DnFoZdQV9Z688F;

1.1.1.12
date	2024.09.15.06.45.18;	author adam;	state Exp;
branches;
next	1.1.1.13;
commitid	pOuXKsbh8iPCYRpF;

1.1.1.13
date	2024.10.19.05.27.28;	author adam;	state Exp;
branches;
next	1.1.1.14;
commitid	v1iXM4j1Na52seuF;

1.1.1.14
date	2025.04.28.09.43.57;	author adam;	state Exp;
branches;
next	1.1.1.15;
commitid	1zB7ffc4d2qCJNSF;

1.1.1.15
date	2025.05.21.15.11.13;	author adam;	state Exp;
branches;
next	1.1.1.16;
commitid	Nzqt2UgtvkVXNMVF;

1.1.1.16
date	2025.07.01.14.58.49;	author adam;	state Exp;
branches;
next	1.1.1.17;
commitid	wKXYoBc9F9j8q31G;

1.1.1.17
date	2025.11.02.08.32.27;	author adam;	state Exp;
branches;
next	1.1.1.18;
commitid	8C56Xg3dc0HriXgG;

1.1.1.18
date	2025.11.20.05.51.41;	author adam;	state Exp;
branches;
next	1.1.1.19;
commitid	LC6NMc2P0QpnPfjG;

1.1.1.19
date	2026.01.06.11.40.39;	author adam;	state Exp;
branches;
next	1.1.1.20;
commitid	Q4rjOheYoLWofkpG;

1.1.1.20
date	2026.04.15.08.40.06;	author adam;	state Exp;
branches;
next	1.1.1.21;
commitid	enlkxxj5Vxhi42CG;

1.1.1.21
date	2026.06.24.05.38.52;	author adam;	state Exp;
branches;
next	;
commitid	zmhI9f4umm2AO0LG;


desc
@@


1.22
log
@libarchive: updated to 3.8.8

Libarchive 3.8.8 is a security, bugfix and minor feature release.

New features:

add support for reading encrypted zipx formats (bzip2, lzma, ppmd, xz, zstd)

Fix overview:
https://github.com/libarchive/libarchive/releases/tag/v3.8.8
@
text
@#
cmake_minimum_required(VERSION 3.17 FATAL_ERROR)

PROJECT(libarchive C)
#
# Include standard installation directories
include(GNUInstallDirs)
#
SET(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/build/cmake")
if(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${libarchive_BINARY_DIR}/bin)
endif()
#
# Set the Build type for make based generators.
# You can choose following types:
#   Debug          : Debug build
#   Release        : Release build
#   RelWithDebInfo : Release build with Debug Info
#   MinSizeRel     : Release Min Size build
#   None           : No build type
IF(NOT CMAKE_BUILD_TYPE)
  SET(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build Type" FORCE)
ENDIF(NOT CMAKE_BUILD_TYPE)
# Set a value type to properly display CMAKE_BUILD_TYPE on GUI if the
# value type is "UNINITIALIZED".
GET_PROPERTY(cached_type CACHE CMAKE_BUILD_TYPE PROPERTY TYPE)
IF("${cached_type}" STREQUAL "UNINITIALIZED")
  SET(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING "Build Type" FORCE)
ENDIF("${cached_type}" STREQUAL "UNINITIALIZED")
# Check the Build Type.
# Convert the CMAKE_BUILD_TYPE to uppercase to perform a case-insensitive comparison.
string(TOUPPER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_UPPER)
IF(NOT "${CMAKE_BUILD_TYPE_UPPER}"
       MATCHES "^(DEBUG|RELEASE|RELWITHDEBINFO|MINSIZEREL|NONE)\$")
  MESSAGE(FATAL_ERROR
          "Unknown keyword for CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}\n"
          "Acceptable keywords: Debug, Release, RelWithDebInfo, MinSizeRel, None")
ENDIF(NOT "${CMAKE_BUILD_TYPE_UPPER}"
       MATCHES "^(DEBUG|RELEASE|RELWITHDEBINFO|MINSIZEREL|NONE)\$")

# On MacOS, prefer MacPorts libraries to system libraries.
# I haven't come up with a compelling argument for this to be conditional.
list(APPEND CMAKE_PREFIX_PATH /opt/local)
# Enable @@rpath in the install name.
# detail in "cmake  --help-policy CMP0042"
SET(CMAKE_MACOSX_RPATH ON)

#
# Version - read from 'version' file.
#
FILE(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/build/version _version)
STRING(REGEX REPLACE
 "^([0-9])[0-9][0-9][0-9][0-9][0-9][0-9][a-z]*$" "\\1" _major ${_version})
STRING(REGEX REPLACE
 "^[0-9]([0-9][0-9][0-9])[0-9][0-9][0-9][a-z]*$" "\\1" _minor ${_version})
STRING(REGEX REPLACE
 "^[0-9][0-9][0-9][0-9]([0-9][0-9][0-9])[a-z]*$" "\\1" _revision ${_version})
STRING(REGEX REPLACE
 "^[0-9][0-9][0-9][0-9][0-9][0-9][0-9]([a-z]*)$" "\\1" _quality ${_version})
SET(_version_number ${_major}${_minor}${_revision})
STRING(REGEX REPLACE "[0]*([^0]*[0-9])$" "\\1" _trimmed_minor ${_minor})
STRING(REGEX REPLACE "[0]*([^0]*[0-9])$" "\\1" _trimmed_revision ${_revision})
#
SET(VERSION                    "${_major}.${_trimmed_minor}.${_trimmed_revision}${_quality}")
SET(BSDCPIO_VERSION_STRING     "${VERSION}")
SET(BSDTAR_VERSION_STRING      "${VERSION}")
SET(BSDCAT_VERSION_STRING      "${VERSION}")
SET(BSDUNZIP_VERSION_STRING    "${VERSION}")
SET(LIBARCHIVE_VERSION_NUMBER  "${_version_number}")
SET(LIBARCHIVE_VERSION_STRING  "${VERSION}")

# INTERFACE_VERSION increments with every release
# libarchive 2.7 == interface version 9 = 2 + 7
# libarchive 2.8 == interface version 10 = 2 + 8
# libarchive 2.9 == interface version 11 = 2 + 9
# libarchive 3.0 == interface version 12
# libarchive 3.1 == interface version 13
math(EXPR INTERFACE_VERSION  "13 + ${_minor}")

# Set SOVERSION so it matches libtool's conventions
# libtool accepts a string "current:revision:age"; in libarchive, that's set to
# - current: ${INTERFACE_VERSION} = 13 + ${_minor}
# - revision: ${_revision}
# - age: ${_minor}
# Since libtool computes SOVERSION as "current - age", it's just '13' again
math(EXPR SOVERSION "${INTERFACE_VERSION} - ${_minor}")
set(SOVERSION_FULL "${SOVERSION}.${_trimmed_minor}.${_trimmed_revision}")

# Override CMake's default shared library versioning scheme, which uses SOVERSION and VERSION,
# to match libtool's conventions (see https://github.com/mesonbuild/meson/issues/1451)
# - compatibility version: current + 1 = ${INTERFACE_VERSION} + 1
# - current version: ${current + 1}.${revision}
math(EXPR MACHO_COMPATIBILITY_VERSION "${INTERFACE_VERSION} + 1")
set(MACHO_CURRENT_VERSION "${MACHO_COMPATIBILITY_VERSION}.${_revision}")

# Enable CMAKE_PUSH_CHECK_STATE() and CMAKE_POP_CHECK_STATE() macros
# saving and restoring the state of the variables.
INCLUDE(CMakePushCheckState)

# Enable the pkg-config helpers.
INCLUDE(FindPkgConfig)

# Initialize the state of the variables. This initialization is not
# necessary but this shows you what value the variables initially have.
SET(CMAKE_REQUIRED_DEFINITIONS)
SET(CMAKE_REQUIRED_INCLUDES)
SET(CMAKE_REQUIRED_LIBRARIES)
SET(CMAKE_REQUIRED_FLAGS)
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
  OPTION(ENABLE_WERROR "Treat warnings as errors - default is ON for Debug, OFF otherwise." ON)
else ()
  OPTION(ENABLE_WERROR "Treat warnings as errors - default is ON for Debug, OFF otherwise." OFF)
endif ()

# Especially for early development, we want to be a little
# aggressive about diagnosing build problems; this can get
# relaxed somewhat in final shipping versions.
IF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR
    CMAKE_C_COMPILER_ID MATCHES "^Clang$" AND NOT MSVC)
  SET(CMAKE_REQUIRED_FLAGS "-Wall -Wformat -Wformat-security")
  #################################################################
  # Set compile flags for all build types.
  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wformat -Wformat-security")
  if (ENABLE_WERROR)
    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
  endif ()
  #################################################################
  # Set compile flags for debug build.
  # This is added into CMAKE_C_FLAGS when CMAKE_BUILD_TYPE is "Debug"
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wextra")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wunused")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wshadow")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wmissing-prototypes")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wcast-qual")
  # Ideally this will be a compile/link time check, yet there's no obvious way
  # how considering how old our minimum required cmake version is. The official
  # cmake.org side does not host the manual pages even. Normally we can use
  # either of the following two, yet neither is supported as of 3.0.2
  # - check_linker_flag - does not exist
  # - try_compile - does not support linker flags
  IF(CMAKE_SYSTEM_NAME MATCHES "Darwin")
    SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-dead_strip")
    SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-dead_strip")
  ELSEIF(CMAKE_SYSTEM_NAME MATCHES "SunOS")
    # SunOS linker doesn't support --gc-sections
  ELSE()
    # Place the functions and data into separate sections, allowing the linker
    # to garbage collect the unused ones.
    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections")
    SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections")
    SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gc-sections")
    # Printing the discarded section is "too much", so enable on demand.
    #SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -Wl,--print-gc-sections")
    #SET(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} -Wl,--print-gc-sections")
  ENDIF()
ENDIF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR
       CMAKE_C_COMPILER_ID MATCHES "^Clang$" AND NOT MSVC)
IF (CMAKE_C_COMPILER_ID MATCHES "^XL$")
  SET(CMAKE_C_COMPILER "xlc_r")
  SET(CMAKE_REQUIRED_FLAGS "-qflag=e:e -qformat=sec")
  #################################################################
  # Set compile flags for all build types.
  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -qflag=e:e -qformat=sec")
  if (ENABLE_WERROR)
    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -qhalt=w")
  endif ()
  #################################################################
  # Set compile flags for debug build.
  # This is added into CMAKE_C_FLAGS when CMAKE_BUILD_TYPE is "Debug"
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -qflag=w:w")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -qinfo=pro:use")
ENDIF(CMAKE_C_COMPILER_ID MATCHES "^XL$")
IF (MSVC)
  if (ENABLE_WERROR)
    # /WX option is the same as gcc's -Werror option.
    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /WX")
  endif ()
  #################################################################
  # Set compile flags for debug build.
  # This is added into CMAKE_C_FLAGS when CMAKE_BUILD_TYPE is "Debug"
  # Enable level 4 C4062: The enumerate has no associated handler in a switch
  #                       statement and there is no default that can catch it.
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14062")
  # Enable level 4 C4254: A larger bit field was assigned to a smaller bit
  #                       field.
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14254")
  # Enable level 4 C4295: An array was initialized but the last character in
  #                       the array is not a null; accessing the array may
  #                       produce unexpected results.
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14295")
  # Enable level 4 C4296: An unsigned variable was used in a comparison
  #                       operation with zero.
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14296")
  # Enable level 4 C4389: An operation involved signed and unsigned variables.
  #                       This could result in a loss of data.
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14389")
  # Enable level 4 C4505: The given function is local and not referenced in
  #                       the body of the module; therefore, the function is
  #                       dead code.
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14505")
  # Enable level 4 C4514: The optimizer removed an inline function that is not
  #                       called.
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14514")
  # Enable level 4 C4702: Unreachable code.
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14702")
  # Enable level 4 C4706: The test value in a conditional expression was the
  #                       result of an assignment.
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14706")
  # /Oi option enables built-in functions.
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /Oi")
  #################################################################
  # Set compile flags for release build.
  SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Oi")
ENDIF (MSVC)

# Enable CTest/CDash support
include(CTest)

option(BUILD_SHARED_LIBS "Build shared libraries" ON)

OPTION(ENABLE_MBEDTLS "Enable use of mbed TLS" OFF)
OPTION(ENABLE_NETTLE "Enable use of Nettle" OFF)
OPTION(ENABLE_OPENSSL "Enable use of OpenSSL" ON)
OPTION(ENABLE_LIBB2 "Enable the use of the system LIBB2 library if found" ON)
OPTION(ENABLE_LZ4 "Enable the use of the system LZ4 library if found" ON)
OPTION(ENABLE_LZO "Enable the use of the system LZO library if found" OFF)
OPTION(ENABLE_LZMA "Enable the use of the system LZMA library if found" ON)
OPTION(ENABLE_ZSTD "Enable the use of the system zstd library if found" ON)

OPTION(ENABLE_ZLIB "Enable the use of the system ZLIB library if found" ON)
OPTION(ENABLE_BZip2 "Enable the use of the system BZip2 library if found" ON)
OPTION(ENABLE_LIBXML2 "Enable the use of the system libxml2 library if found" ON)
OPTION(ENABLE_EXPAT "Enable the use of the system EXPAT library if found" ON)
OPTION(ENABLE_WIN32_XMLLITE "Enable the use of the Windows XmlLite library if found" ON)
OPTION(ENABLE_PCREPOSIX "Enable the use of the system PCREPOSIX library if found" ON)
OPTION(ENABLE_PCRE2POSIX "Enable the use of the system PCRE2POSIX library if found" ON)
OPTION(ENABLE_LIBGCC "Enable the use of the system LibGCC library if found" ON)
# CNG is used for encrypt/decrypt Zip archives on Windows.
OPTION(ENABLE_CNG "Enable the use of CNG(Crypto Next Generation)" ON)

OPTION(ENABLE_TAR "Enable tar building" ON)
OPTION(ENABLE_TAR_SHARED "Enable dynamic build of tar" FALSE)
OPTION(ENABLE_CPIO "Enable cpio building" ON)
OPTION(ENABLE_CPIO_SHARED "Enable dynamic build of cpio" FALSE)
OPTION(ENABLE_CAT "Enable cat building" ON)
OPTION(ENABLE_CAT_SHARED "Enable dynamic build of cat" FALSE)
IF(WIN32 AND NOT CYGWIN)
	SET(ENABLE_UNZIP FALSE)
	SET(ENABLE_UNZIP_SHARED FALSE)
ELSE()
	OPTION(ENABLE_UNZIP "Enable unzip building" ON)
	OPTION(ENABLE_UNZIP_SHARED "Enable dynamic build of unzip" FALSE)
ENDIF()
OPTION(ENABLE_XATTR "Enable extended attribute support" ON)
OPTION(ENABLE_ACL "Enable ACL support" ON)
OPTION(ENABLE_ICONV "Enable iconv support" ON)
OPTION(ENABLE_TEST "Enable unit and regression tests" ON)
OPTION(ENABLE_COVERAGE "Enable code coverage (GCC only, automatically sets ENABLE_TEST to ON)" FALSE)
OPTION(ENABLE_INSTALL "Enable installing of libraries" ON)

IF(WIN32 AND MSVC)
  OPTION(MSVC_USE_STATIC_CRT "Use static CRT" OFF)
ENDIF()

SET(POSIX_REGEX_LIB "AUTO" CACHE STRING "Choose what library should provide POSIX regular expression support")
SET(ENABLE_SAFESEH "AUTO" CACHE STRING "Enable use of /SAFESEH linker flag (MSVC only)")
SET(WINDOWS_VERSION "WIN10" CACHE STRING "Set Windows version to use (Windows only)")

IF(ENABLE_COVERAGE)
	include(LibarchiveCodeCoverage)
ENDIF(ENABLE_COVERAGE)

IF(ENABLE_TEST)
	ENABLE_TESTING()
ENDIF(ENABLE_TEST)

IF(WIN32)
  IF(WINDOWS_VERSION STREQUAL "WIN10")
    SET(NTDDI_VERSION 0x0A000000)
    SET(_WIN32_WINNT 0x0A00)
    SET(WINVER 0x0A00)
  ELSEIF(WINDOWS_VERSION STREQUAL "WIN8")
    SET(NTDDI_VERSION 0x06020000)
    SET(_WIN32_WINNT 0x0602)
    SET(WINVER 0x0602)
  ELSEIF(WINDOWS_VERSION STREQUAL "WIN7")
    SET(NTDDI_VERSION 0x06010000)
    SET(_WIN32_WINNT 0x0601)
    SET(WINVER 0x0601)
  ELSEIF(WINDOWS_VERSION STREQUAL "WS08")
    SET(NTDDI_VERSION 0x06000100)
    SET(_WIN32_WINNT 0x0600)
    SET(WINVER 0x0600)
  ELSE(WINDOWS_VERSION STREQUAL "WIN10")
    # Default to Windows Server 2003 API if we don't recognize the specifier
    SET(NTDDI_VERSION 0x05020000)
    SET(_WIN32_WINNT 0x0502)
    SET(WINVER 0x0502)
  ENDIF(WINDOWS_VERSION STREQUAL "WIN10")
ENDIF(WIN32)

IF(MSVC)
  IF(ENABLE_SAFESEH STREQUAL "YES")
    SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH")
    SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SAFESEH")
    SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /SAFESEH")
    SET(ENV{LDFLAGS} "$ENV{LDFLAGS} /SAFESEH")
  ELSEIF(ENABLE_SAFESEH STREQUAL "NO")
    SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO")
    SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SAFESEH:NO")
    SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /SAFESEH:NO")
    SET(ENV{LDFLAGS} "$ENV{LDFLAGS} /SAFESEH:NO")
  ENDIF(ENABLE_SAFESEH STREQUAL "YES")
ENDIF(MSVC)

IF("${CMAKE_C_PLATFORM_ID}" MATCHES "^(HP-UX)$")
  ADD_DEFINITIONS(-D_XOPEN_SOURCE=500) # Ask wchar.h for mbstate_t
ENDIF()

IF(MINGW)
  ADD_DEFINITIONS(-D__USE_MINGW_ANSI_STDIO)
  ADD_DEFINITIONS(-D__MINGW_USE_VC2005_COMPAT)
ENDIF()

#
INCLUDE(CheckCSourceCompiles)
INCLUDE(CheckCSourceRuns)
INCLUDE(CheckFileOffsetBits)
INCLUDE(CheckFuncs)
INCLUDE(CheckHeaderDirent)
INCLUDE(CheckIncludeFile)
INCLUDE(CheckIncludeFiles)
INCLUDE(CheckLibraryExists)
INCLUDE(CheckStructHasMember)
INCLUDE(CheckSymbolExists)
INCLUDE(CheckTypeExists)
INCLUDE(CheckTypeSize)

#
# Generate list.h
#
MACRO (GENERATE_LIST_H _listfile _cmlist _target __list_sources)
  SET(_argv ${ARGV})
  # Remove _listfile, _cmlist, and _target from _argv
  LIST(REMOVE_AT _argv 0 1 2)
  # Convert source paths to absolute so discover_tests.cmake can find them
  # regardless of the working directory when cmake -P runs.
  SET(_gl_abs_sources "")
  FOREACH(_gl_src ${_argv})
    IF(IS_ABSOLUTE "${_gl_src}")
      LIST(APPEND _gl_abs_sources "${_gl_src}")
    ELSE()
      LIST(APPEND _gl_abs_sources "${CMAKE_CURRENT_SOURCE_DIR}/${_gl_src}")
    ENDIF()
  ENDFOREACH()
  # Stamp out discover_tests.cmake with source list and output path baked in.
  SET(SOURCES "${_gl_abs_sources}")
  SET(OUTPUT "${_listfile}")
  CONFIGURE_FILE(
    ${CMAKE_SOURCE_DIR}/build/cmake/discover_tests.cmake.in
    ${CMAKE_CURRENT_BINARY_DIR}/discover_tests.cmake
    @@ONLY)
  UNSET(SOURCES)
  UNSET(OUTPUT)
  # list.h is regenerated at build time whenever any test .c file changes.
  ADD_CUSTOM_COMMAND(
    OUTPUT "${_listfile}"
    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/discover_tests.cmake
    DEPENDS ${_gl_abs_sources}
    COMMENT "Generating ${_listfile}"
    VERBATIM)
  # Attaching list.h to the target tells CMake to build it before compiling.
  TARGET_SOURCES(${_target} PRIVATE "${_listfile}")
ENDMACRO (GENERATE_LIST_H)

#
# Register individual tests with CTest by scanning DEFINE_TEST() declarations.
#
MACRO (DISCOVER_TESTS _component __list_sources)
  IF(ENABLE_TEST)
    SET(_sources ${ARGV})
    LIST(REMOVE_AT _sources 0)
    FOREACH (_src ${_sources})
      IF (_src MATCHES "test_[^/]+\\.c$")
        FILE(STRINGS "${_src}" _lines REGEX "^DEFINE_TEST\(.*\)")
        FOREACH (_line ${_lines})
          STRING(REGEX MATCH "DEFINE_TEST\((.*)\)" _full_match ${_line})
          # CMake REGEX seems to handle ( and \( rather inconsistently...
          # So we go through an extra dance to definitively strip the parens
          STRING(REPLACE "(" "" _test_name_with_paren "${CMAKE_MATCH_1}")
          STRING(REPLACE ")" "" _test_name "${_test_name_with_paren}")
          SET(_full_test_name "${_component}_${_test_name}")
          ADD_TEST(NAME ${_full_test_name}
                   COMMAND ${_component}_test -vv
                                   -r ${CMAKE_CURRENT_SOURCE_DIR}
                                   -s
                                   ${_test_name})
          SET_TESTS_PROPERTIES(${_full_test_name} PROPERTIES SKIP_RETURN_CODE 2)
        ENDFOREACH (_line)
      ENDIF (_src MATCHES "test_[^/]+\\.c$")
    ENDFOREACH (_src)
  ENDIF(ENABLE_TEST)
ENDMACRO (DISCOVER_TESTS __list_sources)

#
# Generate installation rules for man pages.
#
MACRO (INSTALL_MAN __mans)
  IF(ENABLE_INSTALL)
    FOREACH (_man ${ARGV})
      STRING(REGEX REPLACE "^.+[.]([1-9])" "\\1" _mansect ${_man})
      INSTALL(FILES ${_man} DESTINATION "share/man/man${_mansect}")
    ENDFOREACH (_man)
  ENDIF(ENABLE_INSTALL)
ENDMACRO (INSTALL_MAN __mans)
#
# Find out what macro is needed to use libraries on Windows.
#
MACRO (TRY_MACRO_FOR_LIBRARY INCLUDES LIBRARIES
       TRY_TYPE SAMPLE_SOURCE MACRO_LIST)
  IF(WIN32 AND NOT CYGWIN)
    CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
    SET(CMAKE_REQUIRED_INCLUDES ${INCLUDES})
    SET(CMAKE_REQUIRED_LIBRARIES ${LIBRARIES})
    FOREACH(VAR ${MACRO_LIST})
      # Clear ${VAR} from CACHE If the libraries which ${VAR} was
      # checked with are changed.
      SET(VAR_WITH_LIB "${VAR}_WITH_LIB")
      GET_PROPERTY(PREV_VAR_WITH_LIB VARIABLE PROPERTY ${VAR_WITH_LIB})
      IF(NOT "${PREV_VAR_WITH_LIB}" STREQUAL "${LIBRARIES}")
        UNSET(${VAR} CACHE)
      ENDIF(NOT "${PREV_VAR_WITH_LIB}" STREQUAL "${LIBRARIES}")
      # Check if the library can be used with the macro.
      IF("${TRY_TYPE}" MATCHES "COMPILES")
        CHECK_C_SOURCE_COMPILES("${SAMPLE_SOURCE}" ${VAR})
      ELSEIF("${TRY_TYPE}" MATCHES "RUNS")
        IF(CMAKE_CROSSCOMPILING)
          MESSAGE(WARNING "Cannot test run \"${VAR}\" when cross-compiling")
        ELSE(CMAKE_CROSSCOMPILING)
          CHECK_C_SOURCE_RUNS("${SAMPLE_SOURCE}" ${VAR})
        ENDIF(CMAKE_CROSSCOMPILING)
      ELSE("${TRY_TYPE}" MATCHES "COMPILES")
        MESSAGE(FATAL_ERROR "UNKNOWN KEYWORD \"${TRY_TYPE}\" FOR TRY_TYPE")
      ENDIF("${TRY_TYPE}" MATCHES "COMPILES")
      # Save the libraries which ${VAR} is checked with.
      SET(${VAR_WITH_LIB} "${LIBRARIES}" CACHE INTERNAL
          "Macro ${VAR} is checked with")
    ENDFOREACH(VAR)
    CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
  ENDIF(WIN32 AND NOT CYGWIN)
ENDMACRO (TRY_MACRO_FOR_LIBRARY)
#
# Check compress/decompress libraries
#
IF(WIN32 AND NOT CMAKE_CL_64 AND NOT CYGWIN)
  # GnuWin32 is only for Win32, not Win64.
  SET(__GNUWIN32PATH "C:/Program Files/GnuWin32")
ENDIF(WIN32 AND NOT CMAKE_CL_64 AND NOT CYGWIN)
IF(DEFINED __GNUWIN32PATH AND EXISTS "${__GNUWIN32PATH}")
  # You have to add a path available DLL file into PATH environment variable.
  # Maybe DLL path is "C:/Program Files/GnuWin32/bin".
  # The zlib and the bzip2 Setup program have installed programs and DLLs into
  # "C:/Program Files/GnuWin32" by default.
  # This is convenience setting for Windows.
  SET(CMAKE_PREFIX_PATH ${__GNUWIN32PATH} $(CMAKE_PREFIX_PATH))
  #
  # If you didn't use Setup program or installed into nonstandard path,
  # cmake cannot find out your zlib or bzip2 libraries and include files,
  # you should execute cmake with  -DCMAKE_PREFIX_PATH option.
  #   e.g.
  #     cmake -DCMAKE_PREFIX_PATH=<your-GnuWin32-path> <path-to-source>
  #
  # If compiling error occurred in zconf.h, You may need patch to zconf.h.
  #--- zconf.h.orig	2005-07-21 00:40:26.000000000
  #+++ zconf.h	2009-01-19 11:39:10.093750000
  #@@@@ -286,7 +286,7 @@@@
  #
  # #if 1           /* HAVE_UNISTD_H -- this line is updated by ./configure */
  # #  include <sys/types.h> /* for off_t */
  #-#  include <unistd.h>    /* for SEEK_* and off_t */
  #+#  include <stdio.h>    /* for SEEK_* and off_t */
  # #  ifdef VMS
  # #    include <unixio.h>   /* for off_t */
  # #  endif
ENDIF(DEFINED __GNUWIN32PATH AND EXISTS "${__GNUWIN32PATH}")

SET(ADDITIONAL_LIBS "")
#
# Find ZLIB
#
IF(ENABLE_ZLIB)
  # Require zlib >= 1.2.1, see: https://github.com/libarchive/libarchive/issues/615
  # zlib 1.2.0 should also work, but it is difficult to test for. Let's require
  # zlib >= 1.2.1 for consistency with the autoconf build.
  FIND_PACKAGE(ZLIB 1.2.1)
ELSE()
  SET(ZLIB_FOUND FALSE) # Override cached value
ENDIF()
IF(ZLIB_FOUND)
  SET(HAVE_LIBZ 1)
  SET(HAVE_ZLIB_H 1)
  INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR})
  LIST(APPEND ADDITIONAL_LIBS ${ZLIB_LIBRARIES})
  IF(WIN32 AND NOT CYGWIN)
    #
    # Test if ZLIB_WINAPI macro is needed to use.
    #
    TRY_MACRO_FOR_LIBRARY(
      "${ZLIB_INCLUDE_DIR}" "${ZLIB_LIBRARIES}"
      RUNS
      "#include <zlib.h>\nint main() {uLong f = zlibCompileFlags(); return (f&(1U<<10))?0:-1; }"
      ZLIB_WINAPI)
    IF(ZLIB_WINAPI)
      ADD_DEFINITIONS(-DZLIB_WINAPI)
    ELSE(ZLIB_WINAPI)
      # Test if a macro is needed for the library.
      TRY_MACRO_FOR_LIBRARY(
        "${ZLIB_INCLUDE_DIR}" "${ZLIB_LIBRARIES}"
        COMPILES
        "#include <zlib.h>\nint main() {return zlibVersion()?1:0; }"
        "ZLIB_DLL;WITHOUT_ZLIB_DLL")
      IF(ZLIB_DLL)
        ADD_DEFINITIONS(-DZLIB_DLL)
      ENDIF(ZLIB_DLL)
    ENDIF(ZLIB_WINAPI)
  ENDIF(WIN32 AND NOT CYGWIN)
ENDIF(ZLIB_FOUND)
MARK_AS_ADVANCED(CLEAR ZLIB_INCLUDE_DIR)
MARK_AS_ADVANCED(CLEAR ZLIB_LIBRARY)
#
# Find BZip2
#
IF(ENABLE_BZip2)
  FIND_PACKAGE(BZip2)
ELSE()
  SET(BZIP2_FOUND FALSE) # Override cached value
ENDIF()
IF(BZIP2_FOUND)
  SET(HAVE_LIBBZ2 1)
  SET(HAVE_BZLIB_H 1)
  INCLUDE_DIRECTORIES(${BZIP2_INCLUDE_DIR})
  LIST(APPEND ADDITIONAL_LIBS ${BZIP2_LIBRARIES})
  # Test if a macro is needed for the library.
  TRY_MACRO_FOR_LIBRARY(
    "${BZIP2_INCLUDE_DIR}" "${BZIP2_LIBRARIES}"
    COMPILES
    "#include <bzlib.h>\nint main() {return BZ2_bzlibVersion()?1:0; }"
    "USE_BZIP2_DLL;USE_BZIP2_STATIC")
  IF(USE_BZIP2_DLL)
    ADD_DEFINITIONS(-DUSE_BZIP2_DLL)
  ELSEIF(USE_BZIP2_STATIC)
    ADD_DEFINITIONS(-DUSE_BZIP2_STATIC)
  ENDIF(USE_BZIP2_DLL)
ENDIF(BZIP2_FOUND)
MARK_AS_ADVANCED(CLEAR BZIP2_INCLUDE_DIR)
MARK_AS_ADVANCED(CLEAR BZIP2_LIBRARIES)


#
# Find LZMA
#
IF(ENABLE_LZMA)
  FIND_PACKAGE(LibLZMA)
ELSE()
  SET(LIBLZMA_FOUND FALSE) # Override cached value
ENDIF()

IF(LIBLZMA_FOUND)
  SET(HAVE_LIBLZMA 1)
  SET(HAVE_LZMA_H 1)
  CMAKE_PUSH_CHECK_STATE()
  SET(CMAKE_REQUIRED_INCLUDES ${LIBLZMA_INCLUDE_DIR})
  SET(CMAKE_REQUIRED_LIBRARIES ${LIBLZMA_LIBRARIES})
  INCLUDE_DIRECTORIES(${LIBLZMA_INCLUDE_DIRS})
  LIST(APPEND ADDITIONAL_LIBS ${LIBLZMA_LIBRARIES})
  # Test if a macro is needed for the library.
  TRY_MACRO_FOR_LIBRARY(
    "${LIBLZMA_INCLUDE_DIRS}" "${LIBLZMA_LIBRARIES}"
    COMPILES
    "#include <lzma.h>\nint main() {return (int)lzma_version_number(); }"
    "WITHOUT_LZMA_API_STATIC;LZMA_API_STATIC")
  CHECK_C_SOURCE_COMPILES(
    "#include <lzma.h>\n#if LZMA_VERSION < 50020000\n#error unsupported\n#endif\nint main(void){int ignored __attribute__((unused)); ignored = lzma_stream_encoder_mt(0, 0); return 0;}"
    HAVE_LZMA_STREAM_ENCODER_MT)
  IF(NOT WITHOUT_LZMA_API_STATIC AND LZMA_API_STATIC)
    ADD_DEFINITIONS(-DLZMA_API_STATIC)
  ENDIF(NOT WITHOUT_LZMA_API_STATIC AND LZMA_API_STATIC)
  CMAKE_POP_CHECK_STATE()
ELSE(LIBLZMA_FOUND)
# LZMA not found and will not be used.
  SET(HAVE_LZMA_STREAM_ENCODER_MT 0)
ENDIF(LIBLZMA_FOUND)
MARK_AS_ADVANCED(CLEAR LIBLZMA_INCLUDE_DIR)
MARK_AS_ADVANCED(CLEAR LIBLZMA_LIBRARY)

#
# Find LZO2
#
IF(ENABLE_LZO)
  IF (LZO2_INCLUDE_DIR)
    # Already in cache, be silent
    SET(LZO2_FIND_QUIETLY TRUE)
  ENDIF (LZO2_INCLUDE_DIR)

  FIND_PATH(LZO2_INCLUDE_DIR lzo/lzoconf.h)
  FIND_LIBRARY(LZO2_LIBRARY NAMES lzo2 liblzo2)
  INCLUDE(FindPackageHandleStandardArgs)
  FIND_PACKAGE_HANDLE_STANDARD_ARGS(LZO2 DEFAULT_MSG LZO2_LIBRARY LZO2_INCLUDE_DIR)
ELSE(ENABLE_LZO)
  SET(LZO2_FOUND FALSE) # Override cached value
ENDIF(ENABLE_LZO)
IF(LZO2_FOUND)
  SET(HAVE_LIBLZO2 1)
  SET(HAVE_LZO_LZOCONF_H 1)
  SET(HAVE_LZO_LZO1X_H 1)
  INCLUDE_DIRECTORIES(${LZO2_INCLUDE_DIR})
  LIST(APPEND ADDITIONAL_LIBS ${LZO2_LIBRARY})
  #
  # TODO: test for static library.
  #
ENDIF(LZO2_FOUND)
MARK_AS_ADVANCED(CLEAR LZO2_INCLUDE_DIR)
MARK_AS_ADVANCED(CLEAR LZO2_LIBRARY)
#
# Find libb2
#
IF(ENABLE_LIBB2)
  IF (LIBB2_INCLUDE_DIR)
    # Already in cache, be silent
    SET(LIBB2_FIND_QUIETLY TRUE)
  ENDIF (LIBB2_INCLUDE_DIR)

  FIND_PATH(LIBB2_INCLUDE_DIR blake2.h)
  FIND_LIBRARY(LIBB2_LIBRARY NAMES b2 libb2)
  INCLUDE(FindPackageHandleStandardArgs)
  FIND_PACKAGE_HANDLE_STANDARD_ARGS(LIBB2 DEFAULT_MSG LIBB2_LIBRARY LIBB2_INCLUDE_DIR)
ELSE(ENABLE_LIBB2)
  SET(LIBB2_FOUND FALSE) # Override cached value
  UNSET(LIBB2_PKGCONFIG_VERSION CACHE)
ENDIF(ENABLE_LIBB2)
IF(LIBB2_FOUND)
  SET(HAVE_LIBB2 1)
  SET(HAVE_BLAKE2_H 1)
  SET(ARCHIVE_BLAKE2 FALSE)
  LIST(APPEND ADDITIONAL_LIBS ${LIBB2_LIBRARY})
  INCLUDE_DIRECTORIES(${LIBB2_INCLUDE_DIR})
  CMAKE_PUSH_CHECK_STATE()
  SET(CMAKE_REQUIRED_LIBRARIES ${LIBB2_LIBRARY})
  SET(CMAKE_REQUIRED_INCLUDES ${LIBB2_INCLUDE_DIR})
  CHECK_FUNCTION_EXISTS(blake2sp_init HAVE_LIBB2)
  CMAKE_POP_CHECK_STATE()
  pkg_check_modules(LIBB2 libb2)
  IF(LIBB2_VERSION)
    SET(LIBB2_PKGCONFIG_VERSION LIBB2_VERSION)
  ENDIF(LIBB2_VERSION)
ELSE(LIBB2_FOUND)
  SET(ARCHIVE_BLAKE2 TRUE)
  UNSET(LIBB2_PKGCONFIG_VERSION CACHE)
ENDIF(LIBB2_FOUND)
#
# Find LZ4
#
IF(ENABLE_LZ4)
  IF (LZ4_INCLUDE_DIR)
    # Already in cache, be silent
    SET(LZ4_FIND_QUIETLY TRUE)
  ENDIF (LZ4_INCLUDE_DIR)

  FIND_PATH(LZ4_INCLUDE_DIR lz4.h)
  FIND_LIBRARY(LZ4_LIBRARY NAMES lz4 liblz4)
  INCLUDE(FindPackageHandleStandardArgs)
  FIND_PACKAGE_HANDLE_STANDARD_ARGS(LZ4 DEFAULT_MSG LZ4_LIBRARY LZ4_INCLUDE_DIR)
ELSE(ENABLE_LZ4)
  SET(LZ4_FOUND FALSE) # Override cached value
ENDIF(ENABLE_LZ4)
IF(LZ4_FOUND)
  SET(HAVE_LIBLZ4 1)
  SET(HAVE_LZ4_H 1)
  CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
  SET(CMAKE_REQUIRED_INCLUDES ${LZ4_INCLUDE_DIR})
  CHECK_INCLUDE_FILES("lz4hc.h" HAVE_LZ4HC_H)
  CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
  INCLUDE_DIRECTORIES(${LZ4_INCLUDE_DIR})
  LIST(APPEND ADDITIONAL_LIBS ${LZ4_LIBRARY})
  #
  # TODO: test for static library.
  #
ENDIF(LZ4_FOUND)
MARK_AS_ADVANCED(CLEAR LZ4_INCLUDE_DIR)
MARK_AS_ADVANCED(CLEAR LZ4_LIBRARY)
#
# Find Zstd
#
IF(ENABLE_ZSTD)
  IF (ZSTD_INCLUDE_DIR)
    # Already in cache, be silent
    SET(ZSTD_FIND_QUIETLY TRUE)
  ENDIF (ZSTD_INCLUDE_DIR)

  IF(UNIX)
    FIND_PACKAGE(PkgConfig QUIET)
    PKG_SEARCH_MODULE(PC_ZSTD libzstd)
  ENDIF()

  FIND_PATH(ZSTD_INCLUDE_DIR zstd.h HINTS ${PC_ZSTD_INCLUDEDIR} ${PC_ZSTD_INCLUDE_DIRS})
  FIND_LIBRARY(ZSTD_LIBRARY NAMES zstd libzstd zstd_static HINTS ${PC_ZSTD_LIBDIR} ${PC_ZSTD_LIBRARY_DIRS})
  INCLUDE(FindPackageHandleStandardArgs)
  FIND_PACKAGE_HANDLE_STANDARD_ARGS(ZSTD DEFAULT_MSG ZSTD_LIBRARY ZSTD_INCLUDE_DIR)
ELSE(ENABLE_ZSTD)
  SET(ZSTD_FOUND FALSE) # Override cached value
ENDIF(ENABLE_ZSTD)
IF(ZSTD_FOUND)
  SET(HAVE_ZSTD_H 1)
  INCLUDE_DIRECTORIES(${ZSTD_INCLUDE_DIR})
  LIST(APPEND ADDITIONAL_LIBS ${ZSTD_LIBRARY})
  CMAKE_PUSH_CHECK_STATE()
  SET(CMAKE_REQUIRED_LIBRARIES ${ZSTD_LIBRARY})
  SET(CMAKE_REQUIRED_INCLUDES ${ZSTD_INCLUDE_DIR})
  CHECK_FUNCTION_EXISTS(ZSTD_decompressStream HAVE_LIBZSTD)
  CHECK_FUNCTION_EXISTS(ZSTD_compressStream HAVE_ZSTD_compressStream)
  CHECK_FUNCTION_EXISTS(ZSTD_minCLevel HAVE_ZSTD_minCLevel)
  #
  # TODO: test for static library.
  #
  CMAKE_POP_CHECK_STATE()
ENDIF(ZSTD_FOUND)
MARK_AS_ADVANCED(CLEAR ZSTD_INCLUDE_DIR)
MARK_AS_ADVANCED(CLEAR ZSTD_LIBRARY)

#
# Check headers
#
CHECK_HEADER_DIRENT()

SET(INCLUDES "")
MACRO (LA_CHECK_INCLUDE_FILE header var)
      CHECK_INCLUDE_FILES("${INCLUDES};${header}" ${var})
      IF (${var})
      	 SET(INCLUDES ${INCLUDES} ${header})
      ENDIF (${var})
ENDMACRO (LA_CHECK_INCLUDE_FILE)

# Some FreeBSD headers assume sys/types.h was already included.
LA_CHECK_INCLUDE_FILE("sys/types.h" HAVE_SYS_TYPES_H)

# Alphabetize the rest unless there's a compelling reason
LA_CHECK_INCLUDE_FILE("acl/libacl.h" HAVE_ACL_LIBACL_H)
LA_CHECK_INCLUDE_FILE("attr/xattr.h" HAVE_ATTR_XATTR_H)
LA_CHECK_INCLUDE_FILE("ctype.h" HAVE_CTYPE_H)
LA_CHECK_INCLUDE_FILE("copyfile.h" HAVE_COPYFILE_H)
LA_CHECK_INCLUDE_FILE("direct.h" HAVE_DIRECT_H)
LA_CHECK_INCLUDE_FILE("dlfcn.h" HAVE_DLFCN_H)
LA_CHECK_INCLUDE_FILE("errno.h" HAVE_ERRNO_H)
LA_CHECK_INCLUDE_FILE("ext2fs/ext2_fs.h" HAVE_EXT2FS_EXT2_FS_H)

CHECK_C_SOURCE_COMPILES("#include <sys/ioctl.h>
#include <ext2fs/ext2_fs.h>
int main(void) { return EXT2_IOC_GETFLAGS; }" HAVE_WORKING_EXT2_IOC_GETFLAGS)

LA_CHECK_INCLUDE_FILE("fcntl.h" HAVE_FCNTL_H)
LA_CHECK_INCLUDE_FILE("fnmatch.h" HAVE_FNMATCH_H)
LA_CHECK_INCLUDE_FILE("grp.h" HAVE_GRP_H)
LA_CHECK_INCLUDE_FILE("inttypes.h" HAVE_INTTYPES_H)
LA_CHECK_INCLUDE_FILE("io.h" HAVE_IO_H)
LA_CHECK_INCLUDE_FILE("langinfo.h" HAVE_LANGINFO_H)
LA_CHECK_INCLUDE_FILE("limits.h" HAVE_LIMITS_H)
LA_CHECK_INCLUDE_FILE("linux/types.h" HAVE_LINUX_TYPES_H)
LA_CHECK_INCLUDE_FILE("linux/fiemap.h" HAVE_LINUX_FIEMAP_H)
LA_CHECK_INCLUDE_FILE("linux/fs.h" HAVE_LINUX_FS_H)

CHECK_C_SOURCE_COMPILES("#include <sys/ioctl.h>
#include <linux/fs.h>
int main(void) { return FS_IOC_GETFLAGS; }" HAVE_WORKING_FS_IOC_GETFLAGS)

LA_CHECK_INCLUDE_FILE("intsafe.h" HAVE_INTSAFE_H)
LA_CHECK_INCLUDE_FILE("linux/magic.h" HAVE_LINUX_MAGIC_H)
LA_CHECK_INCLUDE_FILE("locale.h" HAVE_LOCALE_H)
LA_CHECK_INCLUDE_FILE("membership.h" HAVE_MEMBERSHIP_H)
LA_CHECK_INCLUDE_FILE("memory.h" HAVE_MEMORY_H)
LA_CHECK_INCLUDE_FILE("paths.h" HAVE_PATHS_H)
LA_CHECK_INCLUDE_FILE("poll.h" HAVE_POLL_H)
LA_CHECK_INCLUDE_FILE("process.h" HAVE_PROCESS_H)
LA_CHECK_INCLUDE_FILE("pthread.h" HAVE_PTHREAD_H)
LA_CHECK_INCLUDE_FILE("pwd.h" HAVE_PWD_H)
LA_CHECK_INCLUDE_FILE("readpassphrase.h" HAVE_READPASSPHRASE_H)
LA_CHECK_INCLUDE_FILE("regex.h" HAVE_REGEX_H)
LA_CHECK_INCLUDE_FILE("signal.h" HAVE_SIGNAL_H)
LA_CHECK_INCLUDE_FILE("spawn.h" HAVE_SPAWN_H)
LA_CHECK_INCLUDE_FILE("stdarg.h" HAVE_STDARG_H)
LA_CHECK_INCLUDE_FILE("stdckdint.h" HAVE_STDCKDINT_H)
LA_CHECK_INCLUDE_FILE("stdint.h" HAVE_STDINT_H)
LA_CHECK_INCLUDE_FILE("stdio.h" HAVE_STDIO_H)
LA_CHECK_INCLUDE_FILE("stdlib.h" HAVE_STDLIB_H)
LA_CHECK_INCLUDE_FILE("string.h" HAVE_STRING_H)
LA_CHECK_INCLUDE_FILE("strings.h" HAVE_STRINGS_H)
LA_CHECK_INCLUDE_FILE("sys/acl.h" HAVE_SYS_ACL_H)
LA_CHECK_INCLUDE_FILE("sys/cdefs.h" HAVE_SYS_CDEFS_H)
LA_CHECK_INCLUDE_FILE("sys/extattr.h" HAVE_SYS_EXTATTR_H)
LA_CHECK_INCLUDE_FILE("sys/ioctl.h" HAVE_SYS_IOCTL_H)
LA_CHECK_INCLUDE_FILE("sys/mkdev.h" HAVE_SYS_MKDEV_H)
LA_CHECK_INCLUDE_FILE("sys/mount.h" HAVE_SYS_MOUNT_H)
LA_CHECK_INCLUDE_FILE("sys/param.h" HAVE_SYS_PARAM_H)
LA_CHECK_INCLUDE_FILE("sys/poll.h" HAVE_SYS_POLL_H)
LA_CHECK_INCLUDE_FILE("sys/richacl.h" HAVE_SYS_RICHACL_H)
LA_CHECK_INCLUDE_FILE("sys/select.h" HAVE_SYS_SELECT_H)
LA_CHECK_INCLUDE_FILE("sys/stat.h" HAVE_SYS_STAT_H)
LA_CHECK_INCLUDE_FILE("sys/statfs.h" HAVE_SYS_STATFS_H)
LA_CHECK_INCLUDE_FILE("sys/statvfs.h" HAVE_SYS_STATVFS_H)
LA_CHECK_INCLUDE_FILE("sys/sysmacros.h" HAVE_SYS_SYSMACROS_H)
LA_CHECK_INCLUDE_FILE("sys/time.h" HAVE_SYS_TIME_H)
LA_CHECK_INCLUDE_FILE("sys/utime.h" HAVE_SYS_UTIME_H)
LA_CHECK_INCLUDE_FILE("sys/utsname.h" HAVE_SYS_UTSNAME_H)
LA_CHECK_INCLUDE_FILE("sys/vfs.h" HAVE_SYS_VFS_H)
LA_CHECK_INCLUDE_FILE("sys/wait.h" HAVE_SYS_WAIT_H)
LA_CHECK_INCLUDE_FILE("sys/xattr.h" HAVE_SYS_XATTR_H)
LA_CHECK_INCLUDE_FILE("time.h" HAVE_TIME_H)
LA_CHECK_INCLUDE_FILE("unistd.h" HAVE_UNISTD_H)
LA_CHECK_INCLUDE_FILE("utime.h" HAVE_UTIME_H)
LA_CHECK_INCLUDE_FILE("wchar.h" HAVE_WCHAR_H)
LA_CHECK_INCLUDE_FILE("wctype.h" HAVE_WCTYPE_H)
LA_CHECK_INCLUDE_FILE("windows.h" HAVE_WINDOWS_H)
IF(ENABLE_CNG)
  LA_CHECK_INCLUDE_FILE("bcrypt.h" HAVE_BCRYPT_H)
  IF(HAVE_BCRYPT_H)
    LIST(APPEND ADDITIONAL_LIBS "bcrypt")
    # bcrypt supports these algorithms on all available versions
    SET(ARCHIVE_CRYPTO_MD5        1)
    SET(ARCHIVE_CRYPTO_MD5_WIN    1)
    SET(ARCHIVE_CRYPTO_SHA1       1)
    SET(ARCHIVE_CRYPTO_SHA1_WIN   1)
    SET(ARCHIVE_CRYPTO_SHA256     1)
    SET(ARCHIVE_CRYPTO_SHA256_WIN 1)
    SET(ARCHIVE_CRYPTO_SHA384     1)
    SET(ARCHIVE_CRYPTO_SHA384_WIN 1)
    SET(ARCHIVE_CRYPTO_SHA512     1)
    SET(ARCHIVE_CRYPTO_SHA512_WIN 1)
  ENDIF(HAVE_BCRYPT_H)
ELSE(ENABLE_CNG)
  UNSET(HAVE_BCRYPT_H CACHE)
ENDIF(ENABLE_CNG)
# Following files need windows.h, so we should test it after windows.h test.
LA_CHECK_INCLUDE_FILE("winioctl.h" HAVE_WINIOCTL_H)

#
# Check whether use of __EXTENSIONS__ is safe.
# We need some macro such as _GNU_SOURCE to use extension functions.
#
SET(_INCLUDE_FILES)
FOREACH (it ${_HEADER})
   SET(_INCLUDE_FILES "${_INCLUDE_FILES}#include <${it}>\n")
ENDFOREACH (it)

CHECK_C_SOURCE_COMPILES(
  "#define __EXTENSIONS__ 1
   ${_INCLUDE_FILES}
   int main() { return 0;}"
 SAFE_TO_DEFINE_EXTENSIONS)

#
# Find mbed TLS
#
IF(ENABLE_MBEDTLS)
  FIND_PACKAGE(MbedTLS)
  IF(MBEDTLS_FOUND)
    SET(HAVE_LIBMBEDCRYPTO 1)
    LIST(APPEND ADDITIONAL_LIBS ${MBEDCRYPTO_LIBRARY})
    INCLUDE_DIRECTORIES(${MBEDTLS_INCLUDE_DIRS})

    CMAKE_PUSH_CHECK_STATE()
    LIST(APPEND CMAKE_REQUIRED_INCLUDES ${MBEDTLS_INCLUDE_DIRS})
    LA_CHECK_INCLUDE_FILE("mbedtls/aes.h" HAVE_MBEDTLS_AES_H)
    LA_CHECK_INCLUDE_FILE("mbedtls/md.h" HAVE_MBEDTLS_MD_H)
    LA_CHECK_INCLUDE_FILE("mbedtls/pkcs5.h" HAVE_MBEDTLS_PKCS5_H)
    LA_CHECK_INCLUDE_FILE("mbedtls/version.h" HAVE_MBEDTLS_VERSION_H)
    CMAKE_POP_CHECK_STATE()

  ENDIF(MBEDTLS_FOUND)
  MARK_AS_ADVANCED(CLEAR MBEDTLS_INCLUDE_DIRS)
  MARK_AS_ADVANCED(CLEAR MBEDCRYPTO_LIBRARY)
ENDIF(ENABLE_MBEDTLS)

#
# Find Nettle
#
IF(ENABLE_NETTLE)
  FIND_PACKAGE(Nettle)
  IF(NETTLE_FOUND)
    SET(HAVE_LIBNETTLE 1)
    LIST(APPEND ADDITIONAL_LIBS ${NETTLE_LIBRARIES})
    INCLUDE_DIRECTORIES(${NETTLE_INCLUDE_DIR})

    CMAKE_PUSH_CHECK_STATE()
    LIST(APPEND CMAKE_REQUIRED_INCLUDES ${NETTLE_INCLUDE_DIR})
    LA_CHECK_INCLUDE_FILE("nettle/aes.h" HAVE_NETTLE_AES_H)
    LA_CHECK_INCLUDE_FILE("nettle/hmac.h" HAVE_NETTLE_HMAC_H)
    LA_CHECK_INCLUDE_FILE("nettle/md5.h" HAVE_NETTLE_MD5_H)
    LA_CHECK_INCLUDE_FILE("nettle/pbkdf2.h" HAVE_NETTLE_PBKDF2_H)
    LA_CHECK_INCLUDE_FILE("nettle/ripemd160.h" HAVE_NETTLE_RIPEMD160_H)
    LA_CHECK_INCLUDE_FILE("nettle/sha.h" HAVE_NETTLE_SHA_H)
    LA_CHECK_INCLUDE_FILE("nettle/version.h" HAVE_NETTLE_VERSION_H)
    CMAKE_POP_CHECK_STATE()

  ENDIF(NETTLE_FOUND)
  MARK_AS_ADVANCED(CLEAR NETTLE_INCLUDE_DIR)
  MARK_AS_ADVANCED(CLEAR NETTLE_LIBRARIES)
ENDIF(ENABLE_NETTLE)

#
# Find OpenSSL
# (Except on Mac, where OpenSSL is deprecated.)
#
IF(ENABLE_OPENSSL AND NOT CMAKE_SYSTEM_NAME MATCHES "Darwin")
  FIND_PACKAGE(OpenSSL)
  IF(OPENSSL_FOUND)
    SET(HAVE_LIBCRYPTO 1)
    INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR})
    LIST(APPEND ADDITIONAL_LIBS ${OPENSSL_CRYPTO_LIBRARY})

    CMAKE_PUSH_CHECK_STATE()
    SET(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
    SET(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
    LA_CHECK_INCLUDE_FILE("openssl/evp.h" HAVE_OPENSSL_EVP_H)
    LA_CHECK_INCLUDE_FILE("openssl/opensslv.h" HAVE_OPENSSL_OPENSSLV_H)
    CHECK_FUNCTION_EXISTS(PKCS5_PBKDF2_HMAC_SHA1 HAVE_PKCS5_PBKDF2_HMAC_SHA1)
    CMAKE_POP_CHECK_STATE()

  ENDIF(OPENSSL_FOUND)
ELSE()
  SET(OPENSSL_FOUND FALSE) # Override cached value
ENDIF()

# FreeBSD libmd
IF(NOT OPENSSL_FOUND)
  CHECK_LIBRARY_EXISTS(md "MD5Init" "" LIBMD_FOUND)
  IF(LIBMD_FOUND)
    CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
    SET(CMAKE_REQUIRED_LIBRARIES "md")
    FIND_LIBRARY(LIBMD_LIBRARY NAMES md)
    LIST(APPEND ADDITIONAL_LIBS ${LIBMD_LIBRARY})
    CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
  ENDIF(LIBMD_FOUND)
ENDIF(NOT OPENSSL_FOUND)

# libbsd for readpassphrase on Haiku
IF("${CMAKE_SYSTEM_NAME}" MATCHES "Haiku")
  MESSAGE(STATUS "Adding libbsd for Haiku")

  CMAKE_PUSH_CHECK_STATE()
  SET(CMAKE_REQUIRED_LIBRARIES "bsd")
  FIND_LIBRARY(LIBBSD_LIBRARY NAMES bsd)
  LIST(APPEND ADDITIONAL_LIBS ${LIBBSD_LIBRARY})
  CMAKE_POP_CHECK_STATE()

ENDIF("${CMAKE_SYSTEM_NAME}" MATCHES "Haiku")

#
# How to prove that CRYPTO functions, which have several names on various
# platforms, just see if archive_digest.c can compile and link against
# required libraries.
#
MACRO(CHECK_CRYPTO ALGORITHMS IMPLEMENTATION)
    FOREACH(ALGORITHM ${ALGORITHMS})
      IF(NOT ARCHIVE_CRYPTO_${ALGORITHM})
      STRING(TOLOWER "${ALGORITHM}" lower_algorithm)
      STRING(TOUPPER "${ALGORITHM}" algorithm)
      IF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND NOT OPENSSL_FOUND)
        SET(ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} FALSE)
      ELSEIF("${IMPLEMENTATION}" MATCHES "^MBEDTLS$" AND NOT MBEDTLS_FOUND)
        SET(ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} FALSE)
      ELSEIF("${IMPLEMENTATION}" MATCHES "^NETTLE$" AND NOT NETTLE_FOUND)
        SET(ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} FALSE)
      ENDIF("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND NOT OPENSSL_FOUND)

      IF(NOT DEFINED ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
        # Probe the local implementation for whether this
	# crypto implementation is available on this platform.
	SET(TRY_CRYPTO_REQUIRED_INCLUDES
	  "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}/libarchive;${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp")
	SET(TRY_CRYPTO_REQUIRED_LIBS)
	IF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)
	    SET(TRY_CRYPTO_REQUIRED_INCLUDES
	      "${TRY_CRYPTO_REQUIRED_INCLUDES};${OPENSSL_INCLUDE_DIR}")
	    SET(TRY_CRYPTO_REQUIRED_LIBS
	        "-DLINK_LIBRARIES:STRING=${OPENSSL_LIBRARIES}")
	ELSEIF("${IMPLEMENTATION}" MATCHES "^MBEDTLS$" AND MBEDTLS_FOUND)
	    SET(TRY_CRYPTO_REQUIRED_INCLUDES
	      "${TRY_CRYPTO_REQUIRED_INCLUDES};${MBEDTLS_INCLUDE_DIRS}")
	    SET(TRY_CRYPTO_REQUIRED_LIBS
	      "-DLINK_LIBRARIES:STRING=${MBEDCRYPTO_LIBRARY}")
	ELSEIF("${IMPLEMENTATION}" MATCHES "^NETTLE$" AND NETTLE_FOUND)
	    SET(TRY_CRYPTO_REQUIRED_INCLUDES
	      "${TRY_CRYPTO_REQUIRED_INCLUDES};${NETTLE_INCLUDE_DIR}")
	    SET(TRY_CRYPTO_REQUIRED_LIBS
	        "-DLINK_LIBRARIES:STRING=${NETTLE_LIBRARY}")
	ELSEIF("${IMPLEMENTATION}" MATCHES "^LIBMD$" AND LIBMD_FOUND)
	    SET(TRY_CRYPTO_REQUIRED_LIBS
	        "-DLINK_LIBRARIES:STRING=${LIBMD_LIBRARY}")
	ENDIF("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)

    CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/build/cmake/config.h.in
      ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/confdefs.h)
	FILE(READ "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/confdefs.h"
	     CONFDEFS_H)
	FILE(READ "${CMAKE_CURRENT_SOURCE_DIR}/libarchive/archive_digest.c"
	     ARCHIVE_CRYPTO_C)

	SET(SOURCE "${CONFDEFS_H}

#define ARCHIVE_${algorithm}_COMPILE_TEST
#define ARCHIVE_CRYPTO_${algorithm}_${IMPLEMENTATION}
#define PLATFORM_CONFIG_H \"check_crypto_md.h\"

${ARCHIVE_CRYPTO_C}

int
main(int argc, char **argv)
{
  archive_${lower_algorithm}_ctx ctx;
  archive_${lower_algorithm}_init(&ctx);
  archive_${lower_algorithm}_update(&ctx, *argv, argc);
  archive_${lower_algorithm}_final(&ctx, NULL);
  return 0;
}
")

  FILE(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_crypto_md.h" "")
	FILE(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_crypto_md.c" "${SOURCE}")
	MESSAGE(STATUS "Checking support for ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION}")

	TRY_COMPILE(ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION}
	  ${CMAKE_BINARY_DIR}
	  ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_crypto_md.c
	  CMAKE_FLAGS
	   "${TRY_CRYPTO_REQUIRED_LIBS}"
	   "${TRY_CRYPTO_REQUIRED_INCLUDES}"
	  OUTPUT_VARIABLE OUTPUT)

	# Inform user whether or not we found it; if not, log why we didn't.
        IF (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
          MESSAGE(STATUS "Checking support for ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} -- found")
		  SET(ARCHIVE_CRYPTO_${ALGORITHM} 1)
        ELSE (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
          MESSAGE(STATUS "Checking support for ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} -- not found")
          FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
    	    "Checking support for ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} failed with the following output:\n"
    	    "${OUTPUT}\n"
    	    "Source file was:\n${SOURCE}\n")
        ENDIF (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
      ENDIF(NOT DEFINED ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})

      # Add appropriate libs/includes depending on whether the implementation
      # was found on this platform.
      IF (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
        IF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)
          INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR})
	  LIST(APPEND ADDITIONAL_LIBS ${OPENSSL_LIBRARIES})
	   LIST(REMOVE_DUPLICATES ADDITIONAL_LIBS)
        ENDIF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)
      ENDIF (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
      ENDIF(NOT ARCHIVE_CRYPTO_${ALGORITHM})
    ENDFOREACH(ALGORITHM ${ALGORITHMS})
ENDMACRO(CHECK_CRYPTO ALGORITHMS IMPLEMENTATION)

#
# Find iconv
# POSIX defines the second arg as const char **
# and requires it to be in libc.  But we can accept
# a non-const argument here and can support iconv()
# being in libiconv.
#
MACRO(CHECK_ICONV LIB TRY_ICONV_CONST)
  IF(NOT HAVE_ICONV)
    CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
    IF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR
        CMAKE_C_COMPILER_ID MATCHES "^Clang$")
      #
      # During checking iconv proto type, we should use -Werror to avoid the
      # success of iconv detection with a warning, which would be a false
      # positive.  So this is needed for all build modes, even in release mode.
      #
      SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Werror")
    ENDIF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR
           CMAKE_C_COMPILER_ID MATCHES "^Clang$")
    IF (CMAKE_C_COMPILER_ID MATCHES "^XL$")
      SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -qhalt=w -qflag=w:w")
    ENDIF (CMAKE_C_COMPILER_ID MATCHES "^XL$")
    IF (MSVC)
      # NOTE: /WX option is the same as gcc's -Werror option.
      SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} /WX")
    ENDIF (MSVC)
    #
    CHECK_C_SOURCE_COMPILES(
      "#include <stdlib.h>
       #include <iconv.h>
       int main() {
          ${TRY_ICONV_CONST} char *ccp;
          iconv_t cd = iconv_open(\"\", \"\");
          iconv(cd, &ccp, (size_t *)0, (char **)0, (size_t *)0);
          iconv_close(cd);
          return 0;
       }"
     HAVE_ICONV_${LIB}_${TRY_ICONV_CONST})
    IF(HAVE_ICONV_${LIB}_${TRY_ICONV_CONST})
      SET(HAVE_ICONV true)
      SET(ICONV_CONST ${TRY_ICONV_CONST})
    ENDIF(HAVE_ICONV_${LIB}_${TRY_ICONV_CONST})
    CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
  ENDIF(NOT HAVE_ICONV)
ENDMACRO(CHECK_ICONV TRY_ICONV_CONST)

IF(ENABLE_ICONV)
  CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
  FIND_PATH(ICONV_INCLUDE_DIR iconv.h)
  IF(ICONV_INCLUDE_DIR)
    #SET(INCLUDES ${INCLUDES} "iconv.h")
    SET(HAVE_ICONV_H 1)
    INCLUDE_DIRECTORIES(${ICONV_INCLUDE_DIR})
    SET(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR})
    CHECK_ICONV("libc" "const")
    CHECK_ICONV("libc" "")

    # If iconv isn't in libc and we have a libiconv, try that.
    FIND_LIBRARY(LIBICONV_PATH NAMES iconv libiconv)
    IF(NOT HAVE_ICONV AND LIBICONV_PATH)
      LIST(APPEND CMAKE_REQUIRED_LIBRARIES ${LIBICONV_PATH})
      # Test if a macro is needed for the library.
      TRY_MACRO_FOR_LIBRARY(
        "${ICONV_INCLUDE_DIR}" "${LIBICONV_PATH}"
        COMPILES
        "#include <iconv.h>\nint main() {return iconv_close((iconv_t)0);}"
        "WITHOUT_LIBICONV_STATIC;LIBICONV_STATIC")
      IF(NOT WITHOUT_LIBICONV_STATIC AND LIBICONV_STATIC)
        ADD_DEFINITIONS(-DLIBICONV_STATIC)
      ENDIF(NOT WITHOUT_LIBICONV_STATIC AND LIBICONV_STATIC)
      #
      # Set up CMAKE_REQUIRED_* for CHECK_ICONV
      #
      SET(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR})
      SET(CMAKE_REQUIRED_LIBRARIES ${LIBICONV_PATH})
      IF(LIBICONV_STATIC)
        # LIBICONV_STATIC is necessary for the success of CHECK_ICONV
        # on Windows.
        SET(CMAKE_REQUIRED_DEFINITIONS "-DLIBICONV_STATIC")
      ELSE(LIBICONV_STATIC)
        SET(CMAKE_REQUIRED_DEFINITIONS)
      ENDIF(LIBICONV_STATIC)
      CHECK_ICONV("libiconv" "const")
      CHECK_ICONV("libiconv" "")
      IF (HAVE_ICONV)
        SET(HAVE_LIBICONV 1)
        LIST(APPEND ADDITIONAL_LIBS ${LIBICONV_PATH})
      ENDIF(HAVE_ICONV)
    ENDIF(NOT HAVE_ICONV AND LIBICONV_PATH)
  ENDIF(ICONV_INCLUDE_DIR)
  #
  # Find locale_charset() for libiconv.
  #
  IF(LIBICONV_PATH)
    SET(CMAKE_REQUIRED_DEFINITIONS)
    SET(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR})
    SET(CMAKE_REQUIRED_LIBRARIES)
    CHECK_INCLUDE_FILES("localcharset.h" HAVE_LOCALCHARSET_H)
    FIND_LIBRARY(LIBCHARSET_PATH NAMES charset libcharset)
    IF(LIBCHARSET_PATH)
      SET(CMAKE_REQUIRED_LIBRARIES ${LIBCHARSET_PATH})
      IF(WIN32 AND NOT CYGWIN)
        # Test if a macro is needed for the library.
        TRY_MACRO_FOR_LIBRARY(
          "${ICONV_INCLUDE_DIR}" "${LIBCHARSET_PATH}"
          COMPILES
          "#include <localcharset.h>\nint main() {return locale_charset()?1:0;}"
          "WITHOUT_LIBCHARSET_STATIC;LIBCHARSET_STATIC")
        IF(NOT WITHOUT_LIBCHARSET_STATIC AND LIBCHARSET_STATIC)
          ADD_DEFINITIONS(-DLIBCHARSET_STATIC)
        ENDIF(NOT WITHOUT_LIBCHARSET_STATIC AND LIBCHARSET_STATIC)
        IF(WITHOUT_LIBCHARSET_STATIC OR LIBCHARSET_STATIC)
          SET(HAVE_LOCALE_CHARSET ON CACHE INTERNAL
              "Have function locale_charset")
        ENDIF(WITHOUT_LIBCHARSET_STATIC OR LIBCHARSET_STATIC)
      ELSE(WIN32 AND NOT CYGWIN)
        CHECK_FUNCTION_EXISTS_GLIBC(locale_charset HAVE_LOCALE_CHARSET)
      ENDIF(WIN32 AND NOT CYGWIN)
      IF(HAVE_LOCALE_CHARSET)
        LIST(APPEND ADDITIONAL_LIBS ${LIBCHARSET_PATH})
      ENDIF(HAVE_LOCALE_CHARSET)
    ENDIF(LIBCHARSET_PATH)
  ENDIF(LIBICONV_PATH)
  CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
ELSE(ENABLE_ICONV)
  # Make sure ICONV variables are not in CACHE after ENABLE_ICONV disabled
  # (once enabled).
  UNSET(HAVE_LOCALE_CHARSET CACHE)
  UNSET(HAVE_ICONV CACHE)
  UNSET(HAVE_LIBICONV CACHE)
  UNSET(HAVE_ICONV_libc_ CACHE)
  UNSET(HAVE_ICONV_libc_const CACHE)
  UNSET(HAVE_ICONV_libiconv_ CACHE)
  UNSET(HAVE_ICONV_libiconv_const CACHE)
  UNSET(ICONV_INCLUDE_DIR CACHE)
  UNSET(LIBICONV_PATH CACHE)
  UNSET(LIBICONV_DLL CACHE)
  UNSET(LIBICONV_STATIC CACHE)
  UNSET(LIBCHARSET_DLL CACHE)
  UNSET(LIBCHARSET_STATIC CACHE)
ENDIF(ENABLE_ICONV)

#
# Find Libxml2
#
IF(ENABLE_LIBXML2 AND HAVE_ICONV)
  FIND_PACKAGE(LibXml2)
ELSE()
  SET(LIBXML2_FOUND FALSE)
ENDIF()
IF(LIBXML2_FOUND)
  CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
  INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR})
  LIST(APPEND ADDITIONAL_LIBS ${LIBXML2_LIBRARIES})
  SET(HAVE_LIBXML2 1)
  # libxml2's include files use iconv.h
  SET(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR} ${LIBXML2_INCLUDE_DIR})
  CHECK_INCLUDE_FILES("libxml/xmlreader.h" HAVE_LIBXML_XMLREADER_H)
  CHECK_INCLUDE_FILES("libxml/xmlwriter.h" HAVE_LIBXML_XMLWRITER_H)
  CHECK_INCLUDE_FILES("libxml/xmlversion.h" HAVE_LIBXML_XMLVERSION_H)
  # Test if a macro is needed for the library.
  TRY_MACRO_FOR_LIBRARY(
    "${ICONV_INCLUDE_DIR};${LIBXML2_INCLUDE_DIR}"
    "ws2_32.lib;${ZLIB_LIBRARIES};${LIBICONV_PATH};${LIBXML2_LIBRARIES}"
    COMPILES
    "#include <stddef.h>\n#include <libxml/xmlreader.h>\nint main() {return xmlTextReaderRead((xmlTextReaderPtr)(void *)0);}"
    "WITHOUT_LIBXML_STATIC;LIBXML_STATIC")
  IF(NOT WITHOUT_LIBXML_STATIC AND LIBXML_STATIC)
    ADD_DEFINITIONS(-DLIBXML_STATIC)
  ENDIF(NOT WITHOUT_LIBXML_STATIC AND LIBXML_STATIC)
  CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
ELSE(LIBXML2_FOUND)
  #
  # Find Expat
  #
  IF(ENABLE_EXPAT)
    FIND_PACKAGE(EXPAT)
  ELSE()
    SET(EXPAT_FOUND FALSE)
  ENDIF()
  IF(EXPAT_FOUND)
    CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
    INCLUDE_DIRECTORIES(${EXPAT_INCLUDE_DIR})
    LIST(APPEND ADDITIONAL_LIBS ${EXPAT_LIBRARIES})
    SET(HAVE_LIBEXPAT 1)
    LA_CHECK_INCLUDE_FILE("expat.h" HAVE_EXPAT_H)
    CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
  ELSE(EXPAT_FOUND)
    IF(WIN32 AND ENABLE_WIN32_XMLLITE)
      # Check linkage as well; versions of mingw-w64 before v11.0.0
      # do not contain an import library for xmllite.
      cmake_push_check_state()
      SET(CMAKE_REQUIRED_LIBRARIES "xmllite" "uuid")
      check_c_source_compiles("
      #include <initguid.h>
      #include <xmllite.h>
      int main() {
        return CreateXmlReader(&IID_IXmlReader, NULL, NULL);
      }
      " HAVE_XMLLITE_H)
      cmake_pop_check_state()
      IF(HAVE_XMLLITE_H)
        SET(XMLLITE_FOUND TRUE)
        LIST(APPEND ADDITIONAL_LIBS "xmllite" "uuid")
      ENDIF()
    ENDIF()
  ENDIF(EXPAT_FOUND)
ENDIF(LIBXML2_FOUND)
MARK_AS_ADVANCED(CLEAR LIBXML2_INCLUDE_DIR)
MARK_AS_ADVANCED(CLEAR LIBXML2_LIBRARIES)

#
# POSIX Regular Expression support
#
IF(POSIX_REGEX_LIB MATCHES "^(AUTO|LIBC|LIBREGEX)$")
  #
  # If PCREPOSIX is not found or not requested, try using regex
  # from libc or libregex
  #
  FIND_PATH(REGEX_INCLUDE_DIR regex.h)
  IF(REGEX_INCLUDE_DIR)
    CHECK_FUNCTION_EXISTS_GLIBC(regcomp HAVE_REGCOMP_LIBC)
    #
    # If libc does not provide regex, find libregex.
    #
    IF(NOT HAVE_REGCOMP_LIBC)
      CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
      FIND_LIBRARY(REGEX_LIBRARY regex)
      IF(REGEX_LIBRARY)
        SET(CMAKE_REQUIRED_LIBRARIES ${REGEX_LIBRARY})
        CHECK_FUNCTION_EXISTS_GLIBC(regcomp HAVE_REGCOMP_LIBREGEX)
        IF(HAVE_REGCOMP_LIBREGEX)
          LIST(APPEND ADDITIONAL_LIBS ${REGEX_LIBRARY})
          #
          # If regex.h is not found, retry looking for regex.h at
          # REGEX_INCLUDE_DIR
          #
          IF(NOT HAVE_REGEX_H)
            UNSET(HAVE_REGEX_H CACHE)
            INCLUDE_DIRECTORIES(${REGEX_INCLUDE_DIR})
            SET(CMAKE_REQUIRED_INCLUDES ${REGEX_INCLUDE_DIR})
            LA_CHECK_INCLUDE_FILE("regex.h" HAVE_REGEX_H)
          ENDIF(NOT HAVE_REGEX_H)
          # Test if a macro is needed for the library.
          TRY_MACRO_FOR_LIBRARY(
            "${REGEX_INCLUDE_DIR}" "${REGEX_LIBRARY}"
            COMPILES
            "#include <stddef.h>\n#include <regex.h>\nint main() {regex_t r;return regcomp(&r, \"\", 0);}"
            "USE_REGEX_DLL;USE_REGEX_STATIC")
          IF(USE_REGEX_DLL)
            ADD_DEFINITIONS(-DUSE_REGEX_DLL)
          ELSEIF(USE_REGEX_STATIC)
            ADD_DEFINITIONS(-DUSE_REGEX_STATIC)
          ENDIF(USE_REGEX_DLL)
        ENDIF(HAVE_REGCOMP_LIBREGEX)
      ENDIF(REGEX_LIBRARY)
      CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
    ENDIF(NOT HAVE_REGCOMP_LIBC)
  ENDIF(REGEX_INCLUDE_DIR)
  IF(HAVE_REGCOMP_LIBC OR HAVE_REGCOMP_LIBREGEX)
    SET(FOUND_POSIX_REGEX_LIB 1)
  ENDIF(HAVE_REGCOMP_LIBC OR HAVE_REGCOMP_LIBREGEX)
ENDIF(POSIX_REGEX_LIB MATCHES "^(AUTO|LIBC|LIBREGEX)$")

IF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCREPOSIX)$")
  #
  # If requested, try finding library for PCREPOSIX
  #
  IF(ENABLE_LIBGCC)
    FIND_PACKAGE(LIBGCC)
  ELSE()
    MESSAGE(FATAL_ERROR "libgcc not found.")
    SET(LIBGCC_FOUND FALSE) # Override cached value
  ENDIF()
  IF(ENABLE_PCREPOSIX)
    FIND_PACKAGE(PCREPOSIX)
  ELSE()
    SET(PCREPOSIX_FOUND FALSE) # Override cached value
  ENDIF()
  IF(PCREPOSIX_FOUND)
    INCLUDE_DIRECTORIES(${PCRE_INCLUDE_DIR})
    LIST(APPEND ADDITIONAL_LIBS ${PCREPOSIX_LIBRARIES})
    # Test if a macro is needed for the library.
    TRY_MACRO_FOR_LIBRARY(
      "${PCRE_INCLUDE_DIR}" "${PCREPOSIX_LIBRARIES}"
      COMPILES
      "#include <pcreposix.h>\nint main() {regex_t r;return regcomp(&r, \"\", 0);}"
      "WITHOUT_PCRE_STATIC;PCRE_STATIC")
    IF(NOT WITHOUT_PCRE_STATIC AND PCRE_STATIC)
      ADD_DEFINITIONS(-DPCRE_STATIC)
	ELSEIF(NOT WITHOUT_PCRE_STATIC AND NOT PCRE_STATIC AND PCRE_FOUND)
	  # Determine if pcre static libraries are to be used.
      LIST(APPEND ADDITIONAL_LIBS ${PCRE_LIBRARIES})
      SET(TMP_LIBRARIES ${PCREPOSIX_LIBRARIES} ${PCRE_LIBRARIES})
      MESSAGE(STATUS "trying again with -lpcre included")
      TRY_MACRO_FOR_LIBRARY(
        "${PCRE_INCLUDE_DIR}" "${TMP_LIBRARIES}"
        COMPILES
        "#include <pcreposix.h>\nint main() {regex_t r;return regcomp(&r, \"\", 0);}"
        "WITHOUT_PCRE_STATIC;PCRE_STATIC")
      IF(NOT WITHOUT_PCRE_STATIC AND PCRE_STATIC)
        ADD_DEFINITIONS(-DPCRE_STATIC)
      ELSEIF(NOT WITHOUT_PCRE_STATIC AND NOT PCRE_STATIC AND MSVC AND LIBGCC_FOUND)
        # When doing a Visual Studio build using pcre static libraries
        # built using the mingw toolchain, -lgcc is needed to resolve
        # ___chkstk_ms.
        MESSAGE(STATUS "Visual Studio build detected, trying again with -lgcc included")
        LIST(APPEND ADDITIONAL_LIBS ${LIBGCC_LIBRARIES})
        SET(TMP_LIBRARIES ${PCREPOSIX_LIBRARIES} ${PCRE_LIBRARIES} ${LIBGCC_LIBRARIES})
          TRY_MACRO_FOR_LIBRARY(
            "${PCRE_INCLUDE_DIR}" "${TMP_LIBRARIES}"
            COMPILES
            "#include <pcreposix.h>\nint main() {regex_t r;return regcomp(&r, \"\", 0);}"
            "WITHOUT_PCRE_STATIC;PCRE_STATIC")
          IF(NOT WITHOUT_PCRE_STATIC AND PCRE_STATIC)
            ADD_DEFINITIONS(-DPCRE_STATIC)
          ENDIF(NOT WITHOUT_PCRE_STATIC AND PCRE_STATIC)
      ENDIF(NOT WITHOUT_PCRE_STATIC AND PCRE_STATIC)
    ENDIF(NOT WITHOUT_PCRE_STATIC AND PCRE_STATIC)
  ENDIF(PCREPOSIX_FOUND)
  MARK_AS_ADVANCED(CLEAR PCRE_INCLUDE_DIR)
  MARK_AS_ADVANCED(CLEAR PCREPOSIX_LIBRARIES)
  MARK_AS_ADVANCED(CLEAR PCRE_LIBRARIES)
  MARK_AS_ADVANCED(CLEAR LIBGCC_LIBRARIES)
ENDIF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCREPOSIX)$")

IF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCRE2POSIX)$")
  #
  # If requested, try finding library for PCRE2POSIX
  #
  IF(ENABLE_LIBGCC)
    FIND_PACKAGE(LIBGCC)
  ELSE()
    MESSAGE(FATAL_ERROR "libgcc not found.")
    SET(LIBGCC_FOUND FALSE) # Override cached value
  ENDIF()
  IF(ENABLE_PCRE2POSIX)
    FIND_PACKAGE(PCRE2POSIX)
  ELSE()
    SET(PCRE2POSIX_FOUND FALSE) # Override cached value
  ENDIF()
  IF(PCRE2POSIX_FOUND)
    INCLUDE_DIRECTORIES(${PCRE2_INCLUDE_DIR})
    LIST(APPEND ADDITIONAL_LIBS ${PCRE2POSIX_LIBRARIES})
    # Test if a macro is needed for the library.
    TRY_MACRO_FOR_LIBRARY(
      "${PCRE2_INCLUDE_DIR}" "${PCRE2POSIX_LIBRARIES}"
      COMPILES
      "#include <pcre2posix.h>\nint main() {regex_t r;return pcre2_regcomp(&r, \"\", 0);}"
      "WITHOUT_PCRE2_STATIC;PCRE2_STATIC")
    IF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC)
      ADD_DEFINITIONS(-DPCRE2_STATIC)
	ELSEIF(NOT WITHOUT_PCRE2_STATIC AND NOT PCRE2_STATIC AND PCRE2_FOUND)
	  # Determine if pcre2 static libraries are to be used.
      LIST(APPEND ADDITIONAL_LIBS ${PCRE2_LIBRARIES})
      SET(TMP_LIBRARIES ${PCRE2POSIX_LIBRARIES} ${PCRE2_LIBRARIES})
      MESSAGE(STATUS "trying again with -lpcre2-8 included")
      TRY_MACRO_FOR_LIBRARY(
        "${PCRE2_INCLUDE_DIR}" "${TMP_LIBRARIES}"
        COMPILES
        "#include <pcre2posix.h>\nint main() {regex_t r;return pcre2_regcomp(&r, \"\", 0);}"
        "WITHOUT_PCRE2_STATIC;PCRE2_STATIC")
      IF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC)
        ADD_DEFINITIONS(-DPCRE2_STATIC)
      ELSEIF(NOT WITHOUT_PCRE2_STATIC AND NOT PCRE2_STATIC AND MSVC AND LIBGCC_FOUND)
        # When doing a Visual Studio build using pcre2 static libraries
        # built using the mingw toolchain, -lgcc is needed to resolve
        # ___chkstk_ms.
        MESSAGE(STATUS "Visual Studio build detected, trying again with -lgcc included")
        LIST(APPEND ADDITIONAL_LIBS ${LIBGCC_LIBRARIES})
        SET(TMP_LIBRARIES ${PCRE2POSIX_LIBRARIES} ${PCRE2_LIBRARIES} ${LIBGCC_LIBRARIES})
          TRY_MACRO_FOR_LIBRARY(
            "${PCRE2_INCLUDE_DIR}" "${TMP_LIBRARIES}"
            COMPILES
            "#include <pcre2posix.h>\nint main() {regex_t r;return pcre2_regcomp(&r, \"\", 0);}"
            "WITHOUT_PCRE2_STATIC;PCRE2_STATIC")
          IF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC)
            ADD_DEFINITIONS(-DPCRE2_STATIC)
          ENDIF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC)
      ENDIF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC)
    ENDIF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC)
  ENDIF(PCRE2POSIX_FOUND)
  MARK_AS_ADVANCED(CLEAR PCRE2_INCLUDE_DIR)
  MARK_AS_ADVANCED(CLEAR PCRE2POSIX_LIBRARIES)
  MARK_AS_ADVANCED(CLEAR PCRE2_LIBRARIES)
  MARK_AS_ADVANCED(CLEAR LIBGCC_LIBRARIES)
ENDIF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCRE2POSIX)$")

#
# Check functions
#
CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
IF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR
    CMAKE_C_COMPILER_ID MATCHES "^Clang$")
  #
  # During checking functions, we should use -fno-builtin to avoid the
  # failure of function detection which failure is an error "conflicting
  # types for built-in function" caused by using -Werror option.
  #
  SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fno-builtin")
ENDIF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR
       CMAKE_C_COMPILER_ID MATCHES "^Clang$")
CHECK_SYMBOL_EXISTS(_CrtSetReportMode "crtdbg.h" HAVE__CrtSetReportMode)
CHECK_FUNCTION_EXISTS_GLIBC(arc4random_buf HAVE_ARC4RANDOM_BUF)
CHECK_FUNCTION_EXISTS_GLIBC(chflags HAVE_CHFLAGS)
CHECK_FUNCTION_EXISTS_GLIBC(chown HAVE_CHOWN)
CHECK_FUNCTION_EXISTS_GLIBC(chroot HAVE_CHROOT)
CHECK_FUNCTION_EXISTS_GLIBC(closefrom HAVE_CLOSEFROM)
CHECK_FUNCTION_EXISTS_GLIBC(close_range HAVE_CLOSE_RANGE)
CHECK_FUNCTION_EXISTS_GLIBC(ctime_r HAVE_CTIME_R)
CHECK_FUNCTION_EXISTS_GLIBC(fchdir HAVE_FCHDIR)
CHECK_FUNCTION_EXISTS_GLIBC(fchflags HAVE_FCHFLAGS)
CHECK_FUNCTION_EXISTS_GLIBC(fchmod HAVE_FCHMOD)
CHECK_FUNCTION_EXISTS_GLIBC(fchown HAVE_FCHOWN)
CHECK_FUNCTION_EXISTS_GLIBC(fcntl HAVE_FCNTL)
CHECK_FUNCTION_EXISTS_GLIBC(fdopendir HAVE_FDOPENDIR)
CHECK_FUNCTION_EXISTS_GLIBC(fnmatch HAVE_FNMATCH)
CHECK_FUNCTION_EXISTS_GLIBC(fork HAVE_FORK)
CHECK_FUNCTION_EXISTS_GLIBC(fstat HAVE_FSTAT)
CHECK_FUNCTION_EXISTS_GLIBC(fstatat HAVE_FSTATAT)
CHECK_FUNCTION_EXISTS_GLIBC(fstatfs HAVE_FSTATFS)
CHECK_FUNCTION_EXISTS_GLIBC(fstatvfs HAVE_FSTATVFS)
CHECK_FUNCTION_EXISTS_GLIBC(ftruncate HAVE_FTRUNCATE)
CHECK_FUNCTION_EXISTS_GLIBC(futimens HAVE_FUTIMENS)
CHECK_FUNCTION_EXISTS_GLIBC(futimes HAVE_FUTIMES)
CHECK_FUNCTION_EXISTS_GLIBC(futimesat HAVE_FUTIMESAT)
CHECK_FUNCTION_EXISTS_GLIBC(getegid HAVE_GETEGID)
CHECK_FUNCTION_EXISTS_GLIBC(geteuid HAVE_GETEUID)
CHECK_FUNCTION_EXISTS_GLIBC(getgrgid_r HAVE_GETGRGID_R)
CHECK_FUNCTION_EXISTS_GLIBC(getgrnam_r HAVE_GETGRNAM_R)
CHECK_FUNCTION_EXISTS_GLIBC(getline HAVE_GETLINE)
CHECK_FUNCTION_EXISTS_GLIBC(getpid HAVE_GETPID)
CHECK_FUNCTION_EXISTS_GLIBC(getpwnam_r HAVE_GETPWNAM_R)
CHECK_FUNCTION_EXISTS_GLIBC(getpwuid_r HAVE_GETPWUID_R)
CHECK_FUNCTION_EXISTS_GLIBC(getresgid HAVE_GETRESGID)
CHECK_FUNCTION_EXISTS_GLIBC(getresuid HAVE_GETRESUID)
CHECK_FUNCTION_EXISTS_GLIBC(getvfsbyname HAVE_GETVFSBYNAME)
CHECK_FUNCTION_EXISTS_GLIBC(gmtime_r HAVE_GMTIME_R)
CHECK_FUNCTION_EXISTS_GLIBC(issetugid HAVE_ISSETUGID)
CHECK_FUNCTION_EXISTS_GLIBC(lchflags HAVE_LCHFLAGS)
CHECK_FUNCTION_EXISTS_GLIBC(lchmod HAVE_LCHMOD)
CHECK_FUNCTION_EXISTS_GLIBC(lchown HAVE_LCHOWN)
CHECK_FUNCTION_EXISTS_GLIBC(link HAVE_LINK)
CHECK_FUNCTION_EXISTS_GLIBC(linkat HAVE_LINKAT)
CHECK_FUNCTION_EXISTS_GLIBC(localtime_r HAVE_LOCALTIME_R)
CHECK_FUNCTION_EXISTS_GLIBC(lstat HAVE_LSTAT)
CHECK_FUNCTION_EXISTS_GLIBC(lutimes HAVE_LUTIMES)
CHECK_FUNCTION_EXISTS_GLIBC(mbrtowc HAVE_MBRTOWC)
CHECK_FUNCTION_EXISTS_GLIBC(memmove HAVE_MEMMOVE)
CHECK_FUNCTION_EXISTS_GLIBC(mkdir HAVE_MKDIR)
CHECK_FUNCTION_EXISTS_GLIBC(mkfifo HAVE_MKFIFO)
CHECK_FUNCTION_EXISTS_GLIBC(mknod HAVE_MKNOD)
CHECK_FUNCTION_EXISTS_GLIBC(mkstemp HAVE_MKSTEMP)
CHECK_FUNCTION_EXISTS_GLIBC(nl_langinfo HAVE_NL_LANGINFO)
CHECK_FUNCTION_EXISTS_GLIBC(openat HAVE_OPENAT)
CHECK_FUNCTION_EXISTS_GLIBC(pipe HAVE_PIPE)
CHECK_FUNCTION_EXISTS_GLIBC(poll HAVE_POLL)
CHECK_FUNCTION_EXISTS_GLIBC(posix_spawn HAVE_POSIX_SPAWN)
CHECK_FUNCTION_EXISTS_GLIBC(posix_spawnp HAVE_POSIX_SPAWNP)
CHECK_FUNCTION_EXISTS_GLIBC(readlink HAVE_READLINK)
CHECK_FUNCTION_EXISTS_GLIBC(readpassphrase HAVE_READPASSPHRASE)
CHECK_FUNCTION_EXISTS_GLIBC(select HAVE_SELECT)
CHECK_FUNCTION_EXISTS_GLIBC(setenv HAVE_SETENV)
CHECK_FUNCTION_EXISTS_GLIBC(setlocale HAVE_SETLOCALE)
CHECK_FUNCTION_EXISTS_GLIBC(sigaction HAVE_SIGACTION)
CHECK_FUNCTION_EXISTS_GLIBC(statfs HAVE_STATFS)
CHECK_FUNCTION_EXISTS_GLIBC(statvfs HAVE_STATVFS)
CHECK_FUNCTION_EXISTS_GLIBC(strchr HAVE_STRCHR)
CHECK_FUNCTION_EXISTS_GLIBC(strdup HAVE_STRDUP)
CHECK_FUNCTION_EXISTS_GLIBC(strerror HAVE_STRERROR)
CHECK_FUNCTION_EXISTS_GLIBC(strncpy_s HAVE_STRNCPY_S)
CHECK_FUNCTION_EXISTS_GLIBC(strnlen HAVE_STRNLEN)
CHECK_FUNCTION_EXISTS_GLIBC(strrchr HAVE_STRRCHR)
CHECK_FUNCTION_EXISTS_GLIBC(symlink HAVE_SYMLINK)
CHECK_FUNCTION_EXISTS_GLIBC(sysconf HAVE_SYSCONF)
CHECK_FUNCTION_EXISTS_GLIBC(tcgetattr HAVE_TCGETATTR)
CHECK_FUNCTION_EXISTS_GLIBC(tcsetattr HAVE_TCSETATTR)
CHECK_FUNCTION_EXISTS_GLIBC(timegm HAVE_TIMEGM)
CHECK_FUNCTION_EXISTS_GLIBC(tzset HAVE_TZSET)
CHECK_FUNCTION_EXISTS_GLIBC(unlinkat HAVE_UNLINKAT)
CHECK_FUNCTION_EXISTS_GLIBC(unsetenv HAVE_UNSETENV)
CHECK_FUNCTION_EXISTS_GLIBC(utime HAVE_UTIME)
CHECK_FUNCTION_EXISTS_GLIBC(utimes HAVE_UTIMES)
CHECK_FUNCTION_EXISTS_GLIBC(utimensat HAVE_UTIMENSAT)
CHECK_FUNCTION_EXISTS_GLIBC(vfork HAVE_VFORK)
CHECK_FUNCTION_EXISTS_GLIBC(wcrtomb HAVE_WCRTOMB)
check_symbol_exists(wcscmp wchar.h HAVE_WCSCMP)
check_symbol_exists(wcscpy wchar.h HAVE_WCSCPY)
check_symbol_exists(wcslen wchar.h HAVE_WCSLEN)
CHECK_FUNCTION_EXISTS_GLIBC(wctomb HAVE_WCTOMB)
CHECK_FUNCTION_EXISTS_GLIBC(_fseeki64 HAVE__FSEEKI64)
CHECK_FUNCTION_EXISTS_GLIBC(_get_timezone HAVE__GET_TIMEZONE)
CHECK_SYMBOL_EXISTS(ctime_s "time.h" HAVE_CTIME_S)
CHECK_SYMBOL_EXISTS(gmtime_s "time.h" HAVE_GMTIME_S)
CHECK_SYMBOL_EXISTS(localtime_s "time.h" HAVE_LOCALTIME_S)
CHECK_SYMBOL_EXISTS(_mkgmtime "time.h" HAVE__MKGMTIME)

SET(CMAKE_REQUIRED_LIBRARIES "")
CHECK_FUNCTION_EXISTS(cygwin_conv_path HAVE_CYGWIN_CONV_PATH)
CHECK_FUNCTION_EXISTS(fseeko HAVE_FSEEKO)
CHECK_FUNCTION_EXISTS(strerror_r HAVE_STRERROR_R)
CHECK_FUNCTION_EXISTS(strftime HAVE_STRFTIME)
CHECK_FUNCTION_EXISTS(vprintf HAVE_VPRINTF)
CHECK_FUNCTION_EXISTS(wmemcmp HAVE_WMEMCMP)
CHECK_FUNCTION_EXISTS(wmemcpy HAVE_WMEMCPY)
CHECK_FUNCTION_EXISTS(wmemmove HAVE_WMEMMOVE)

CMAKE_POP_CHECK_STATE()	# Restore the state of the variables

CHECK_C_SOURCE_COMPILES(
  "#include <sys/types.h>\n#include <sys/mount.h>\nint main(void) { struct vfsconf v; return sizeof(v);}"
  HAVE_STRUCT_VFSCONF)

CHECK_C_SOURCE_COMPILES(
  "#include <sys/types.h>\n#include <sys/mount.h>\nint main(void) { struct xvfsconf v; return sizeof(v);}"
  HAVE_STRUCT_XVFSCONF)

CHECK_C_SOURCE_COMPILES(
  "#include <sys/types.h>\n#include <sys/mount.h>\nint main(void) { struct statfs s; return sizeof(s);}"
  HAVE_STRUCT_STATFS)

# dirfd can be either a function or a macro.
CHECK_C_SOURCE_COMPILES(
  "#include <dirent.h>\nint main() {DIR *d = opendir(\".\"); return dirfd(d);}"
  HAVE_DIRFD)

# Only detect readlinkat() if we also have AT_FDCWD in unistd.h.
# NOTE: linux requires fcntl.h for AT_FDCWD.
CHECK_C_SOURCE_COMPILES(
  "#include <fcntl.h>\n#include <unistd.h>\nint main() {char buf[10]; return readlinkat(AT_FDCWD, \"\", buf, 0);}"
  HAVE_READLINKAT)

# To verify major(), we need to both include the header
# of interest and verify that the result can be linked.
# CHECK_FUNCTION_EXISTS doesn't accept a header argument,
# CHECK_SYMBOL_EXISTS doesn't test linkage.
CHECK_C_SOURCE_COMPILES(
  "#include <sys/mkdev.h>\nint main() { return major(256); }"
  MAJOR_IN_MKDEV)
CHECK_C_SOURCE_COMPILES(
  "#include <sys/sysmacros.h>\nint main() { return major(256); }"
  MAJOR_IN_SYSMACROS)

IF(HAVE_STRERROR_R)
  SET(HAVE_DECL_STRERROR_R 1)
ENDIF(HAVE_STRERROR_R)

#
# Check defines
#
SET(headers "limits.h")
IF(HAVE_STDINT_H)
  LIST(APPEND headers "stdint.h")
ENDIF(HAVE_STDINT_H)
IF(HAVE_INTTYPES_H)
  LIST(APPEND headers "inttypes.h")
ENDIF(HAVE_INTTYPES_H)
CHECK_SYMBOL_EXISTS(EFTYPE           "errno.h"    HAVE_EFTYPE)
CHECK_SYMBOL_EXISTS(EILSEQ           "errno.h"    HAVE_EILSEQ)
CHECK_SYMBOL_EXISTS(D_MD_ORDER       "langinfo.h" HAVE_D_MD_ORDER)
CHECK_SYMBOL_EXISTS(INT32_MAX        "${headers}" HAVE_DECL_INT32_MAX)
CHECK_SYMBOL_EXISTS(INT32_MIN        "${headers}" HAVE_DECL_INT32_MIN)
CHECK_SYMBOL_EXISTS(INT64_MAX        "${headers}" HAVE_DECL_INT64_MAX)
CHECK_SYMBOL_EXISTS(INT64_MIN        "${headers}" HAVE_DECL_INT64_MIN)
CHECK_SYMBOL_EXISTS(INTMAX_MAX       "${headers}" HAVE_DECL_INTMAX_MAX)
CHECK_SYMBOL_EXISTS(INTMAX_MIN       "${headers}" HAVE_DECL_INTMAX_MIN)
CHECK_SYMBOL_EXISTS(UINT32_MAX       "${headers}" HAVE_DECL_UINT32_MAX)
CHECK_SYMBOL_EXISTS(UINT64_MAX       "${headers}" HAVE_DECL_UINT64_MAX)
CHECK_SYMBOL_EXISTS(UINTMAX_MAX      "${headers}" HAVE_DECL_UINTMAX_MAX)
CHECK_SYMBOL_EXISTS(SIZE_MAX         "${headers}" HAVE_DECL_SIZE_MAX)
CHECK_SYMBOL_EXISTS(SSIZE_MAX        "limits.h"   HAVE_DECL_SSIZE_MAX)

#
# Check struct members
#
# Check for tm_gmtoff in struct tm
CHECK_STRUCT_HAS_MEMBER("struct tm" tm_gmtoff
    "time.h" HAVE_STRUCT_TM_TM_GMTOFF)
CHECK_STRUCT_HAS_MEMBER("struct tm" __tm_gmtoff
    "time.h" HAVE_STRUCT_TM___TM_GMTOFF)

IF(HAVE_STRUCT_STATFS)
# Check for f_namemax in struct statfs
CHECK_STRUCT_HAS_MEMBER("struct statfs" f_namemax
    "sys/param.h;sys/mount.h" HAVE_STRUCT_STATFS_F_NAMEMAX)
# Check for f_iosize in struct statfs
CHECK_STRUCT_HAS_MEMBER("struct statfs" f_iosize
    "sys/param.h;sys/mount.h" HAVE_STRUCT_STATFS_F_IOSIZE)
ENDIF(HAVE_STRUCT_STATFS)

# Check for birthtime in struct stat
CHECK_STRUCT_HAS_MEMBER("struct stat" st_birthtime
    "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_BIRTHTIME)

# Check for high-resolution timestamps in struct stat
CHECK_STRUCT_HAS_MEMBER("struct stat" st_birthtimespec.tv_nsec
    "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC)
CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtimespec.tv_nsec
    "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC)
CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtim.tv_nsec
    "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC)
CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtime_n
    "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIME_N)
CHECK_STRUCT_HAS_MEMBER("struct stat" st_umtime
    "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_UMTIME)
CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtime_usec
    "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIME_USEC)
# Check for block size support in struct stat
CHECK_STRUCT_HAS_MEMBER("struct stat" st_blksize
    "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_BLKSIZE)
# Check for st_flags in struct stat (BSD fflags)
CHECK_STRUCT_HAS_MEMBER("struct stat" st_flags
    "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_FLAGS)

IF(HAVE_SYS_STATVFS_H)
  CHECK_STRUCT_HAS_MEMBER("struct statvfs" f_iosize
    "sys/types.h;sys/statvfs.h" HAVE_STRUCT_STATVFS_F_IOSIZE)
ENDIF()

#
#
CHECK_STRUCT_HAS_MEMBER("struct tm" tm_sec
    "sys/types.h;sys/time.h;time.h" HAVE_SYS_TIME_H)

#
# Check for integer types
#
#
CHECK_TYPE_SIZE("short" SIZEOF_SHORT)
CHECK_TYPE_SIZE("int" SIZEOF_INT)
CHECK_TYPE_SIZE("long" SIZEOF_LONG)
CHECK_TYPE_SIZE("long long"     SIZEOF_LONG_LONG)

CHECK_TYPE_SIZE("unsigned short" SIZEOF_UNSIGNED_SHORT)
CHECK_TYPE_SIZE("unsigned" SIZEOF_UNSIGNED)
CHECK_TYPE_SIZE("unsigned long" SIZEOF_UNSIGNED_LONG)
CHECK_TYPE_SIZE("unsigned long long" SIZEOF_UNSIGNED_LONG_LONG)

CHECK_TYPE_SIZE("__int64" __INT64)
CHECK_TYPE_SIZE("unsigned __int64" UNSIGNED___INT64)

CHECK_TYPE_SIZE(int16_t INT16_T)
CHECK_TYPE_SIZE(int32_t INT32_T)
CHECK_TYPE_SIZE(int64_t INT64_T)
CHECK_TYPE_SIZE(intmax_t INTMAX_T)
CHECK_TYPE_SIZE(uint8_t UINT8_T)
CHECK_TYPE_SIZE(uint16_t UINT16_T)
CHECK_TYPE_SIZE(uint32_t UINT32_T)
CHECK_TYPE_SIZE(uint64_t UINT64_T)
CHECK_TYPE_SIZE(uintmax_t UINTMAX_T)

CHECK_TYPE_SIZE(dev_t       DEV_T)
IF(NOT HAVE_DEV_T)
  IF(MSVC)
    SET(dev_t "unsigned int")
  ENDIF(MSVC)
ENDIF(NOT HAVE_DEV_T)
#
CHECK_TYPE_SIZE(gid_t       GID_T)
IF(NOT HAVE_GID_T)
  IF(WIN32)
    SET(gid_t "short")
  ELSE(WIN32)
    SET(gid_t "unsigned int")
  ENDIF(WIN32)
ENDIF(NOT HAVE_GID_T)
#
CHECK_TYPE_SIZE(id_t        ID_T)
IF(NOT HAVE_ID_T)
  IF(WIN32)
    SET(id_t "short")
  ELSE(WIN32)
    SET(id_t "unsigned int")
  ENDIF(WIN32)
ENDIF(NOT HAVE_ID_T)
#
CHECK_TYPE_SIZE(mode_t      MODE_T)
IF(NOT HAVE_MODE_T)
  IF(WIN32)
    SET(mode_t "unsigned short")
  ELSE(WIN32)
    SET(mode_t "int")
  ENDIF(WIN32)
ENDIF(NOT HAVE_MODE_T)
#
CHECK_TYPE_SIZE(off_t       OFF_T)
IF(NOT HAVE_OFF_T)
  SET(off_t "__int64")
ENDIF(NOT HAVE_OFF_T)
#
CHECK_TYPE_SIZE(size_t      SIZE_T)
IF(NOT HAVE_SIZE_T)
  IF("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
    SET(size_t "uint64_t")
  ELSE("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
    SET(size_t   "uint32_t")
  ENDIF("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
ENDIF(NOT HAVE_SIZE_T)
#
CHECK_TYPE_SIZE(ssize_t     SSIZE_T)
IF(NOT HAVE_SSIZE_T)
  IF("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
    SET(ssize_t "int64_t")
  ELSE("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
    SET(ssize_t "long")
  ENDIF("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
ENDIF(NOT HAVE_SSIZE_T)
#
CHECK_TYPE_SIZE(uid_t       UID_T)
IF(NOT HAVE_UID_T)
  IF(WIN32)
    SET(uid_t "short")
  ELSE(WIN32)
    SET(uid_t "unsigned int")
  ENDIF(WIN32)
ENDIF(NOT HAVE_UID_T)
#
CHECK_TYPE_SIZE(pid_t       PID_T)
IF(NOT HAVE_PID_T)
  IF(WIN32)
    SET(pid_t "int")
  ELSE(WIN32)
    MESSAGE(FATAL_ERROR "pid_t doesn't exist on this platform?")
  ENDIF(WIN32)
ENDIF(NOT HAVE_PID_T)
#
CHECK_TYPE_SIZE(intptr_t   INTPTR_T)
IF(NOT HAVE_INTPTR_T)
  IF("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
    SET(intptr_t "int64_t")
  ELSE()
    SET(intptr_t "int32_t")
  ENDIF()
ENDIF(NOT HAVE_INTPTR_T)
#
CHECK_TYPE_SIZE(uintptr_t   UINTPTR_T)
IF(NOT HAVE_UINTPTR_T)
  IF("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
    SET(uintptr_t "uint64_t")
  ELSE()
    SET(uintptr_t "uint32_t")
  ENDIF()
ENDIF(NOT HAVE_UINTPTR_T)
#
CHECK_TYPE_SIZE(wchar_t     SIZEOF_WCHAR_T)
IF(HAVE_SIZEOF_WCHAR_T)
  SET(HAVE_WCHAR_T 1)
ENDIF(HAVE_SIZEOF_WCHAR_T)
#
# Check if _FILE_OFFSET_BITS macro needed for large files
#
CHECK_FILE_OFFSET_BITS()

#
# Check for Extended Attribute libraries, headers, and functions
#
IF(ENABLE_XATTR)
  CHECK_LIBRARY_EXISTS(attr "setxattr" "" HAVE_LIBATTR)
  IF(HAVE_LIBATTR)
    SET(CMAKE_REQUIRED_LIBRARIES "attr")
	  pkg_check_modules(LIBATTR libattr)
	  IF(LIBATTR_VERSION)
	    SET(LIBATTR_PKGCONFIG_VERSION ${LIBATTR_VERSION})
	  ENDIF(LIBATTR_VERSION)
  ELSE(HAVE_LIBATTR)
    CHECK_LIBRARY_EXISTS(gnu "setxattr" "" HAVE_LIBATTR_GNU)
    IF(HAVE_LIBATTR_GNU)
      SET(CMAKE_REQUIRED_LIBRARIES "gnu")
    ENDIF()
    UNSET(LIBATTR_PKGCONFIG_VERSION CACHE)
  ENDIF(HAVE_LIBATTR)
  CHECK_SYMBOL_EXISTS(EXTATTR_NAMESPACE_USER "sys/types.h;sys/extattr.h" HAVE_DECL_EXTATTR_NAMESPACE_USER)
  CHECK_SYMBOL_EXISTS(XATTR_NOFOLLOW "sys/xattr.h" HAVE_DECL_XATTR_NOFOLLOW)
  IF(HAVE_SYS_XATTR_H AND HAVE_DECL_XATTR_NOFOLLOW)
    CHECK_FUNCTION_EXISTS(fgetxattr HAVE_FGETXATTR)
    CHECK_FUNCTION_EXISTS(flistxattr HAVE_FLISTXATTR)
    CHECK_FUNCTION_EXISTS(fsetxattr HAVE_FSETXATTR)
    CHECK_FUNCTION_EXISTS(getxattr HAVE_GETXATTR)
    CHECK_FUNCTION_EXISTS(listxattr HAVE_LISTXATTR)
    CHECK_FUNCTION_EXISTS(setxattr HAVE_SETXATTR)
    IF(HAVE_FGETXATTR AND
       HAVE_FLISTXATTR AND
       HAVE_FSETXATTR AND
       HAVE_GETXATTR AND
       HAVE_LISTXATTR AND
       HAVE_SETXATTR)
      SET(ARCHIVE_XATTR_DARWIN TRUE)
    ENDIF()
  ELSEIF(HAVE_SYS_EXTATTR_H AND HAVE_DECL_EXTATTR_NAMESPACE_USER)
    # FreeBSD xattr support
    CHECK_FUNCTION_EXISTS(extattr_get_fd HAVE_EXTATTR_GET_FD)
    CHECK_FUNCTION_EXISTS(extattr_get_file HAVE_EXTATTR_GET_FILE)
    CHECK_FUNCTION_EXISTS(extattr_get_link HAVE_EXTATTR_GET_LINK)
    CHECK_FUNCTION_EXISTS(extattr_list_fd HAVE_EXTATTR_LIST_FD)
    CHECK_FUNCTION_EXISTS(extattr_list_file HAVE_EXTATTR_LIST_FILE)
    CHECK_FUNCTION_EXISTS(extattr_list_link HAVE_EXTATTR_LIST_LINK)
    CHECK_FUNCTION_EXISTS(extattr_set_fd HAVE_EXTATTR_SET_FD)
    CHECK_FUNCTION_EXISTS(extattr_set_link HAVE_EXTATTR_SET_LINK)
    IF(HAVE_EXTATTR_GET_FD AND
       HAVE_EXTATTR_GET_FILE AND
       HAVE_EXTATTR_GET_LINK AND
       HAVE_EXTATTR_LIST_FD AND
       HAVE_EXTATTR_LIST_FILE AND
       HAVE_EXTATTR_LIST_LINK AND
       HAVE_EXTATTR_SET_FD AND
       HAVE_EXTATTR_SET_LINK)
      SET(ARCHIVE_XATTR_FREEBSD TRUE)
    ENDIF()
  ELSEIF(HAVE_SYS_XATTR_H OR HAVE_ATTR_XATTR_H)
    # Linux xattr support
    CHECK_FUNCTION_EXISTS_GLIBC(fgetxattr HAVE_FGETXATTR)
    CHECK_FUNCTION_EXISTS_GLIBC(flistxattr HAVE_FLISTXATTR)
    CHECK_FUNCTION_EXISTS_GLIBC(fsetxattr HAVE_FSETXATTR)
    CHECK_FUNCTION_EXISTS_GLIBC(getxattr HAVE_GETXATTR)
    CHECK_FUNCTION_EXISTS_GLIBC(lgetxattr HAVE_LGETXATTR)
    CHECK_FUNCTION_EXISTS_GLIBC(listxattr HAVE_LISTXATTR)
    CHECK_FUNCTION_EXISTS_GLIBC(llistxattr HAVE_LLISTXATTR)
    CHECK_FUNCTION_EXISTS_GLIBC(lsetxattr HAVE_LSETXATTR)
    IF(HAVE_FGETXATTR AND
       HAVE_FLISTXATTR AND
       HAVE_FSETXATTR AND
       HAVE_GETXATTR AND
       HAVE_LGETXATTR AND
       HAVE_LISTXATTR AND
       HAVE_LLISTXATTR AND
       HAVE_LSETXATTR)
      SET(ARCHIVE_XATTR_LINUX TRUE)
    ENDIF()
  ELSEIF(HAVE_SYS_EA_H)
    # AIX xattr support
    CHECK_FUNCTION_EXISTS(fgetea HAVE_FGETEA)
    CHECK_FUNCTION_EXISTS(flistea HAVE_FLISTEA)
    CHECK_FUNCTION_EXISTS(fsetea HAVE_FSETEA)
    CHECK_FUNCTION_EXISTS(getea HAVE_GETEA)
    CHECK_FUNCTION_EXISTS(lgetea HAVE_LGETEA)
    CHECK_FUNCTION_EXISTS(listea HAVE_LISTEA)
    CHECK_FUNCTION_EXISTS(llistea HAVE_LLISTEA)
    CHECK_FUNCTION_EXISTS(lsetea HAVE_LSETEA)
    IF(HAVE_FGETEA AND
       HAVE_FLISTEA AND
       HAVE_FSETEA AND
       HAVE_GETEA AND
       HAVE_LGETEA AND
       HAVE_LISTEA AND
       HAVE_LLISTEA AND
       HAVE_LSETEA)
      SET(ARCHIVE_XATTR_AIX TRUE)
    ENDIF()
  ENDIF()

  IF(ARCHIVE_XATTR_DARWIN)
    MESSAGE(STATUS "Extended attributes support: Darwin")
  ELSEIF(ARCHIVE_XATTR_FREEBSD)
    MESSAGE(STATUS "Extended attributes support: FreeBSD")
  ELSEIF(ARCHIVE_XATTR_LINUX)
    MESSAGE(STATUS "Extended attributes support: Linux")
  ELSEIF(ARCHIVE_XATTR_AIX)
    MESSAGE(STATUS "Extended attributes support: AIX")
  ELSE()
    MESSAGE(STATUS "Extended attributes support: none")
  ENDIF()
ELSE(ENABLE_XATTR)
  SET(ARCHIVE_XATTR_DARWIN FALSE)
  SET(ARCHIVE_XATTR_FREEBSD FALSE)
  SET(ARCHIVE_XATTR_LINUX FALSE)
  SET(ARCHIVE_XATTR_AIX FALSE)
ENDIF(ENABLE_XATTR)

#
# Check for ACL libraries, headers, and functions
#
# The ACL support in libarchive is written against the POSIX1e draft,
# which was never officially approved and varies quite a bit across
# platforms.  Worse, some systems have completely non-POSIX acl functions,
# which makes the following checks rather more complex than I would like.
#
IF(ENABLE_ACL)
  # Solaris and derivates ACLs
  CHECK_FUNCTION_EXISTS(acl HAVE_ACL)
  CHECK_FUNCTION_EXISTS(facl HAVE_FACL)

  # Libacl
  CHECK_LIBRARY_EXISTS(acl "acl_get_file" "" HAVE_LIBACL)
  IF(HAVE_LIBACL)
    SET(CMAKE_REQUIRED_LIBRARIES "acl")
    FIND_LIBRARY(ACL_LIBRARY NAMES acl)
    LIST(APPEND ADDITIONAL_LIBS ${ACL_LIBRARY})
	  pkg_check_modules(LIBACL libacl)
	  IF(LIBACL_VERSION)
	    SET(LIBACL_PKGCONFIG_VERSION ${LIBACL_VERSION})
	  ENDIF(LIBACL_VERSION)
  ELSE(HAVE_LIBACL)
    UNSET(LIBACL_PKGCONFIG_VERSION CACHE)
  ENDIF(HAVE_LIBACL)

  CHECK_TYPE_EXISTS(acl_t "sys/types.h;sys/acl.h" HAVE_ACL_T)
  CHECK_TYPE_EXISTS(acl_entry_t "sys/types.h;sys/acl.h" HAVE_ACL_ENTRY_T)
  CHECK_TYPE_EXISTS(acl_permset_t "sys/types.h;sys/acl.h" HAVE_ACL_PERMSET_T)
  CHECK_TYPE_EXISTS(acl_tag_t "sys/types.h;sys/acl.h" HAVE_ACL_TAG_T)

  IF(HAVE_ACL AND HAVE_FACL)
    CHECK_TYPE_EXISTS(aclent_t "sys/acl.h" HAVE_ACLENT_T)
    IF(HAVE_ACLENT_T)
      CHECK_SYMBOL_EXISTS(GETACL "sys/acl.h" HAVE_DECL_GETACL)
      CHECK_SYMBOL_EXISTS(GETACLCNT "sys/acl.h" HAVE_DECL_GETACLCNT)
      CHECK_SYMBOL_EXISTS(SETACL "sys/acl.h" HAVE_DECL_SETACL)
      IF(HAVE_DECL_GETACL AND
         HAVE_DECL_GETACLCNT AND
         HAVE_DECL_SETACL)
        SET(ARCHIVE_ACL_SUNOS TRUE)
      ENDIF()
      CHECK_TYPE_EXISTS(ace_t "sys/acl.h" HAVE_ACE_T)
      IF(HAVE_ACE_T)
        CHECK_SYMBOL_EXISTS(ACE_GETACL "sys/acl.h" HAVE_DECL_ACE_GETACL)
        CHECK_SYMBOL_EXISTS(ACE_GETACLCNT "sys/acl.h" HAVE_DECL_ACE_GETACLCNT)
        CHECK_SYMBOL_EXISTS(ACE_SETACL "sys/acl.h" HAVE_DECL_ACE_SETACL)
        IF(HAVE_DECL_ACE_GETACL AND
           HAVE_DECL_ACE_GETACLCNT AND
           HAVE_DECL_ACE_SETACL)
          SET(ARCHIVE_ACL_SUNOS_NFS4 TRUE)
        ENDIF()
      ENDIF(HAVE_ACE_T)
    ENDIF(HAVE_ACLENT_T)
  ENDIF(HAVE_ACL AND HAVE_FACL)

  IF(HAVE_ACL_T AND HAVE_ACL_ENTRY_T AND HAVE_ACL_PERMSET_T AND HAVE_ACL_TAG_T)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_add_perm HAVE_ACL_ADD_PERM)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_clear_perms HAVE_ACL_CLEAR_PERMS)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_create_entry HAVE_ACL_CREATE_ENTRY)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_delete_def_file HAVE_ACL_DELETE_DEF_FILE)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_free HAVE_ACL_FREE)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_get_entry HAVE_ACL_GET_ENTRY)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_get_fd HAVE_ACL_GET_FD)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_get_file HAVE_ACL_GET_FILE)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_get_permset HAVE_ACL_GET_PERMSET)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_get_qualifier HAVE_ACL_GET_QUALIFIER)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_get_tag_type HAVE_ACL_GET_TAG_TYPE)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_init HAVE_ACL_INIT)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_set_fd HAVE_ACL_SET_FD)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_set_file HAVE_ACL_SET_FILE)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_set_qualifier HAVE_ACL_SET_QUALIFIER)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_set_tag_type HAVE_ACL_SET_TAG_TYPE)
    IF(HAVE_ACL_ADD_PERM AND
       HAVE_ACL_CLEAR_PERMS AND
       HAVE_ACL_CREATE_ENTRY AND
       HAVE_ACL_DELETE_DEF_FILE AND
       HAVE_ACL_FREE AND
       HAVE_ACL_GET_ENTRY AND
       HAVE_ACL_GET_FD AND
       HAVE_ACL_GET_FILE AND
       HAVE_ACL_GET_PERMSET AND
       HAVE_ACL_GET_QUALIFIER AND
       HAVE_ACL_GET_TAG_TYPE AND
       HAVE_ACL_INIT AND
       HAVE_ACL_SET_FD AND
       HAVE_ACL_SET_FILE AND
       HAVE_ACL_SET_QUALIFIER AND
       HAVE_ACL_SET_TAG_TYPE)
         SET(HAVE_POSIX_ACL_FUNCS 1)
    ENDIF()

    CHECK_FUNCTION_EXISTS_GLIBC(acl_get_perm HAVE_ACL_GET_PERM)

    IF(HAVE_POSIX_ACL_FUNCS AND HAVE_ACL_LIBACL_H AND HAVE_LIBACL AND
       HAVE_ACL_GET_PERM)
      SET(ARCHIVE_ACL_LIBACL TRUE)
    ELSE()
      CHECK_FUNCTION_EXISTS(acl_add_flag_np HAVE_ACL_ADD_FLAG_NP)
      CHECK_FUNCTION_EXISTS(acl_clear_flags_np HAVE_ACL_CLEAR_FLAGS_NP)
      CHECK_FUNCTION_EXISTS(acl_get_brand_np HAVE_ACL_GET_BRAND_NP)
      CHECK_FUNCTION_EXISTS(acl_get_entry_type_np HAVE_ACL_GET_ENTRY_TYPE_NP)
      CHECK_FUNCTION_EXISTS(acl_get_flag_np HAVE_ACL_GET_FLAG_NP)
      CHECK_FUNCTION_EXISTS(acl_get_flagset_np HAVE_ACL_GET_FLAGSET_NP)
      CHECK_FUNCTION_EXISTS(acl_get_fd_np HAVE_ACL_GET_FD_NP)
      CHECK_FUNCTION_EXISTS(acl_get_link_np HAVE_ACL_GET_LINK_NP)
      CHECK_FUNCTION_EXISTS(acl_get_perm_np HAVE_ACL_GET_PERM_NP)
      CHECK_FUNCTION_EXISTS(acl_is_trivial_np HAVE_ACL_IS_TRIVIAL_NP)
      CHECK_FUNCTION_EXISTS(acl_set_entry_type_np HAVE_ACL_SET_ENTRY_TYPE_NP)
      CHECK_FUNCTION_EXISTS(acl_set_fd_np HAVE_ACL_SET_FD_NP)
      CHECK_FUNCTION_EXISTS(acl_set_link_np HAVE_ACL_SET_LINK_NP)
      CHECK_FUNCTION_EXISTS(mbr_gid_to_uuid HAVE_MBR_GID_TO_UUID)
      CHECK_FUNCTION_EXISTS(mbr_uid_to_uuid HAVE_MBR_UID_TO_UUID)
      CHECK_FUNCTION_EXISTS(mbr_uuid_to_id HAVE_MBR_UUID_TO_ID)

      CHECK_C_SOURCE_COMPILES("#include <sys/types.h>
#include <sys/acl.h>
int main(void) { return ACL_TYPE_EXTENDED; }" HAVE_DECL_ACL_TYPE_EXTENDED)
      CHECK_C_SOURCE_COMPILES("#include <sys/types.h>
#include <sys/acl.h>
int main(void) { return ACL_SYNCHRONIZE; }" HAVE_DECL_ACL_SYNCHRONIZE)
      CHECK_SYMBOL_EXISTS(ACL_TYPE_NFS4 "sys/acl.h" HAVE_DECL_ACL_TYPE_NFS4)
      CHECK_SYMBOL_EXISTS(ACL_USER "sys/acl.h" HAVE_DECL_ACL_USER)

      IF(HAVE_POSIX_ACL_FUNCS AND
         HAVE_ACL_GET_FD_NP AND
         HAVE_ACL_GET_PERM_NP AND
         NOT HAVE_ACL_GET_PERM AND
         HAVE_ACL_SET_FD_NP)
        IF(HAVE_DECL_ACL_USER)
          SET(ARCHIVE_ACL_FREEBSD TRUE)
          IF(HAVE_DECL_ACL_TYPE_NFS4 AND
             HAVE_ACL_ADD_FLAG_NP AND
             HAVE_ACL_CLEAR_FLAGS_NP AND
             HAVE_ACL_GET_BRAND_NP AND
             HAVE_ACL_GET_ENTRY_TYPE_NP AND
             HAVE_ACL_GET_FLAGSET_NP AND
             HAVE_ACL_SET_ENTRY_TYPE_NP)
            SET(ARCHIVE_ACL_FREEBSD_NFS4 TRUE)
          ENDIF()
        ELSEIF(HAVE_DECL_ACL_TYPE_EXTENDED AND
               HAVE_MEMBERSHIP_H AND
               HAVE_ACL_ADD_FLAG_NP AND
               HAVE_ACL_CLEAR_FLAGS_NP AND
               HAVE_ACL_GET_FLAGSET_NP AND
               HAVE_ACL_GET_LINK_NP AND
               HAVE_ACL_SET_LINK_NP AND
               HAVE_MBR_UID_TO_UUID AND
               HAVE_MBR_GID_TO_UUID AND
               HAVE_MBR_UUID_TO_ID)
          SET(ARCHIVE_ACL_DARWIN TRUE)
        ENDIF()
      ENDIF()
    ENDIF()
  ENDIF(HAVE_ACL_T AND HAVE_ACL_ENTRY_T AND HAVE_ACL_PERMSET_T AND
        HAVE_ACL_TAG_T)

  # Richacl
  CHECK_LIBRARY_EXISTS(richacl "richacl_get_file" "" HAVE_LIBRICHACL)
  IF(HAVE_LIBRICHACL)
    SET(CMAKE_REQUIRED_LIBRARIES "richacl")
    FIND_LIBRARY(RICHACL_LIBRARY NAMES richacl)
    LIST(APPEND ADDITIONAL_LIBS ${RICHACL_LIBRARY})
	  pkg_check_modules(LIBRICHACL librichacl)
	  IF(LIBRICHACL_VERSION)
	    SET(LIBRICHACL_PKGCONFIG_VERSION ${LIBRICHACL_VERSION})
	  ENDIF(LIBRICHACL_VERSION)
  ELSE(HAVE_LIBRICHACL)
    UNSET(LIBRICHACL_PKGCONFIG_VERSION CACHE)
  ENDIF(HAVE_LIBRICHACL)

  CHECK_STRUCT_HAS_MEMBER("struct richace" e_type "sys/richacl.h"
    HAVE_STRUCT_RICHACE)
  CHECK_STRUCT_HAS_MEMBER("struct richacl" a_flags "sys/richacl.h"
    HAVE_STRUCT_RICHACL)

  IF(HAVE_LIBRICHACL AND HAVE_STRUCT_RICHACL AND HAVE_STRUCT_RICHACE)
    CHECK_FUNCTION_EXISTS_GLIBC(richacl_alloc HAVE_RICHACL_ALLOC)
    CHECK_FUNCTION_EXISTS_GLIBC(richacl_equiv_mode HAVE_RICHACL_EQUIV_MODE)
    CHECK_FUNCTION_EXISTS_GLIBC(richacl_free HAVE_RICHACL_FREE)
    CHECK_FUNCTION_EXISTS_GLIBC(richacl_get_fd HAVE_RICHACL_GET_FD)
    CHECK_FUNCTION_EXISTS_GLIBC(richacl_get_file HAVE_RICHACL_GET_FILE)
    CHECK_FUNCTION_EXISTS_GLIBC(richacl_set_fd HAVE_RICHACL_SET_FD)
    CHECK_FUNCTION_EXISTS_GLIBC(richacl_set_file HAVE_RICHACL_SET_FILE)
    IF(HAVE_RICHACL_ALLOC AND
       HAVE_RICHACL_EQUIV_MODE AND
       HAVE_RICHACL_FREE AND
       HAVE_RICHACL_GET_FD AND
       HAVE_RICHACL_GET_FILE AND
       HAVE_RICHACL_SET_FD AND
       HAVE_RICHACL_SET_FILE)
      SET(ARCHIVE_ACL_LIBRICHACL TRUE)
    ENDIF()
  ENDIF(HAVE_LIBRICHACL AND HAVE_STRUCT_RICHACL AND HAVE_STRUCT_RICHACE)

  IF(ARCHIVE_ACL_DARWIN)
    MESSAGE(STATUS "ACL support: Darwin (limited NFSv4)")
  ELSEIF(ARCHIVE_ACL_FREEBSD_NFS4)
    MESSAGE(STATUS "ACL support: FreeBSD (POSIX.1e and NFSv4)")
  ELSEIF(ARCHIVE_ACL_FREEBSD)
    MESSAGE(STATUS "ACL support: FreeBSD (POSIX.1e)")
  ELSEIF(ARCHIVE_ACL_LIBACL OR ARCHIVE_ACL_LIBRICHACL)
    IF(ARCHIVE_ACL_LIBACL AND ARCHIVE_ACL_LIBRICHACL)
      MESSAGE(STATUS "ACL support: libacl (POSIX.1e) + librichacl (NFSv4)")
    ELSEIF(ARCHIVE_ACL_LIBRICHACL)
      MESSAGE(STATUS "ACL support: librichacl (NFSv4)")
    ELSE()
      MESSAGE(STATUS "ACL support: libacl (POSIX.1e)")
    ENDIF()
  ELSEIF(ARCHIVE_ACL_SUNOS_NFS4)
    MESSAGE(STATUS "ACL support: Solaris (POSIX.1e and NFSv4)")
  ELSEIF(ARCHIVE_ACL_SUNOS)
    MESSAGE(STATUS "ACL support: Solaris (POSIX.1e)")
  ELSE()
    MESSAGE(STATUS "ACL support: none")
  ENDIF()

ELSE(ENABLE_ACL)
  # If someone runs cmake, then disables ACL support, we need
  # to forcibly override the cached values for these.
  SET(ARCHIVE_ACL_DARWIN FALSE)
  SET(ARCHIVE_ACL_FREEBSD FALSE)
  SET(ARCHIVE_ACL_FREEBSD_NFS4 FALSE)
  SET(ARCHIVE_ACL_LIBACL FALSE)
  SET(ARCHIVE_ACL_SUNOS FALSE)
  SET(ARCHIVE_ACL_SUNOS_NFS4 FALSE)
ENDIF(ENABLE_ACL)

#
# Check MD5/RMD160/SHA support
# NOTE: Crypto checks must be run last before generating config.h
#
IF(CMAKE_SYSTEM_NAME MATCHES "Darwin")
  CHECK_CRYPTO("MD5;SHA1;SHA256;SHA384;SHA512" LIBSYSTEM)
ELSE()
  CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" LIBC)
  CHECK_CRYPTO("SHA256;SHA384;SHA512" LIBC2)
  CHECK_CRYPTO("SHA256;SHA384;SHA512" LIBC3)
  CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" MBEDTLS)
  CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" NETTLE)
  CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" OPENSSL)

  # Libmd has to be probed after OpenSSL.
  CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA512" LIBMD)
ENDIF()

# Check visibility annotations
SET(OLD_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fvisibility=hidden -Werror")
CHECK_C_SOURCE_COMPILES("void __attribute__((visibility(\"default\"))) foo(void);
int main() { return 0; }" HAVE_VISIBILITY_ATTR)
IF (HAVE_VISIBILITY_ATTR)
  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
  ADD_DEFINITIONS(-D__LIBARCHIVE_ENABLE_VISIBILITY)
ENDIF(HAVE_VISIBILITY_ATTR)
SET(CMAKE_REQUIRED_FLAGS "${OLD_CMAKE_REQUIRED_FLAGS}")

# Generate "config.h" from "build/cmake/config.h.in"
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/build/cmake/config.h.in
	${CMAKE_CURRENT_BINARY_DIR}/config.h)
INCLUDE_DIRECTORIES(BEFORE ${CMAKE_CURRENT_BINARY_DIR})
ADD_DEFINITIONS(-DHAVE_CONFIG_H)

# Handle generation of the libarchive.pc file for pkg-config
INCLUDE(CreatePkgConfigFile)

#
# Register installation of PDF documents.
#
IF(WIN32 AND NOT CYGWIN AND ENABLE_INSTALL)
  #
  # On Windows platform, It's better that we install PDF documents
  # on one's computer.
  # These PDF documents are available in the release package.
  #
  IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/doc/pdf)
    INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc/pdf
            DESTINATION share/man
            FILES_MATCHING PATTERN "*.pdf"
    )
  ENDIF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/doc/pdf)
ENDIF(WIN32 AND NOT CYGWIN AND ENABLE_INSTALL)
#
#
#
INCLUDE_DIRECTORIES(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/libarchive)
#
IF(MSVC)
  ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE)
ENDIF(MSVC)

OPTION(DONT_FAIL_ON_CRC_ERROR "Ignore CRC errors during parsing (For fuzzing)" OFF)
IF(DONT_FAIL_ON_CRC_ERROR)
  ADD_DEFINITIONS(-DDONT_FAIL_ON_CRC_ERROR=1)
ENDIF(DONT_FAIL_ON_CRC_ERROR)

IF(ENABLE_TEST)
  ADD_CUSTOM_TARGET(run_all_tests)
ENDIF(ENABLE_TEST)

add_subdirectory(libarchive)
add_subdirectory(cat)
add_subdirectory(tar)
add_subdirectory(cpio)
add_subdirectory(unzip)
@


1.21
log
@libarchive: updated to 3.8.7

Libarchive 3.8.7 is a security and bugfix release.

Notable fixes:

CAB: fix NULL pointer dereference during skip
CAB: Fix Heap OOB Write in CAB LZX decoder
cpio: various fixes and improvements
contrib/untar: fix out-of-bounds read
iso9660: fix undefined behavior
iso9660: fix posibble heap buffer overflow on 32-bit systems
libarchive: fix handling of option failures
libarchive: do not continue with truncated numbers
libarchive: lzop and grzip filter support
RAR: fix LZSS window size mismatch after PPMd block
@
text
@d344 1
a344 1
MACRO (GENERATE_LIST_H _listfile _cmlist __list_sources)
d346 60
a405 15
  # Remove _listfile and _cmlist from _argv
  LIST(REMOVE_AT _argv 0 1)
  IF (NOT EXISTS "${_listfile}" OR
     ${_cmlist} IS_NEWER_THAN "${_listfile}")

    MESSAGE(STATUS "Generating ${_listfile}")
    FILE(WRITE ${_listfile} "")
    FOREACH (testfile ${_argv})
      IF (testfile MATCHES "^test_[^/]+[.]c$")
        FILE(STRINGS ${testfile} testvar REGEX "^DEFINE_TEST")
        FOREACH (deftest ${testvar})
          FILE(APPEND ${_listfile} "${deftest}\n")
        ENDFOREACH (deftest)
      ENDIF (testfile MATCHES "^test_[^/]+[.]c$")
    ENDFOREACH (testfile)
a406 3
  ENDIF (NOT EXISTS "${_listfile}" OR
     ${_cmlist} IS_NEWER_THAN "${_listfile}")
ENDMACRO (GENERATE_LIST_H)
d708 1
a708 1
  FIND_LIBRARY(ZSTD_LIBRARY NAMES zstd libzstd HINTS ${PC_ZSTD_LIBDIR} ${PC_ZSTD_LIBRARY_DIRS})
d777 1
d792 1
d828 11
a843 1
LA_CHECK_INCLUDE_FILE("wincrypt.h" HAVE_WINCRYPT_H)
d871 1
d877 2
d894 1
d903 2
d920 2
d927 2
d949 2
d954 2
a1066 79
# CRYPTO functions on Windows is defined at archive_windows.c, thus we do not
# need the test what the functions can be mapped to archive_{crypto name}_init,
# archive_{crypto name}_update and archive_{crypto name}_final.
# The functions on Windows use CALG_{crypto name} macro to create a crypt object
# and then we need to know what CALG_{crypto name} macros is available to show
# ARCHIVE_CRYPTO_{crypto name}_WIN macros because Windows 2000 and earlier version
# of Windows XP do not support SHA256, SHA384 and SHA512.
#
MACRO(CHECK_CRYPTO_WIN CRYPTO_LIST)
  IF(WIN32 AND NOT CYGWIN)
    FOREACH(CRYPTO ${CRYPTO_LIST})
      IF(NOT ARCHIVE_CRYPTO_${CRYPTO})
      IF(NOT DEFINED ARCHIVE_CRYPTO_${CRYPTO}_WIN)
	STRING(TOUPPER "${CRYPTO}" crypto)
	SET(ALGID "")
	IF ("${CRYPTO}" MATCHES "^MD5$")
	    SET(ALGID "CALG_MD5")
	ENDIF ("${CRYPTO}" MATCHES "^MD5$")
	IF ("${CRYPTO}" MATCHES "^SHA1$")
	    SET(ALGID "CALG_SHA1")
	ENDIF ("${CRYPTO}" MATCHES "^SHA1$")
	IF ("${CRYPTO}" MATCHES "^SHA256$")
	    SET(ALGID "CALG_SHA_256")
	ENDIF ("${CRYPTO}" MATCHES "^SHA256$")
	IF ("${CRYPTO}" MATCHES "^SHA384$")
	    SET(ALGID "CALG_SHA_384")
	ENDIF ("${CRYPTO}" MATCHES "^SHA384$")
	IF ("${CRYPTO}" MATCHES "^SHA512$")
	    SET(ALGID "CALG_SHA_512")
	ENDIF ("${CRYPTO}" MATCHES "^SHA512$")

    CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/build/cmake/config.h.in
      ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/confdefs.h)
	FILE(READ "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/confdefs.h"
	     CONFDEFS_H)

	SET(SOURCE "${CONFDEFS_H}

#define ${crypto}_COMPILE_TEST
#include <windows.h>
#include <wincrypt.h>

int
main(int argc, char **argv)
{
	return ${ALGID};
}
")
	SET(SOURCE_FILE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_crypto_win.c")

	FILE(WRITE "${SOURCE_FILE}" "${SOURCE}")
	MESSAGE(STATUS "Checking support for ARCHIVE_CRYPTO_${CRYPTO}_WIN")

	TRY_COMPILE(ARCHIVE_CRYPTO_${CRYPTO}_WIN
	  ${CMAKE_BINARY_DIR}
	  ${SOURCE_FILE}
	  CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}/libarchive"
	  OUTPUT_VARIABLE OUTPUT)

	IF (ARCHIVE_CRYPTO_${CRYPTO}_WIN)
	    MESSAGE(STATUS
	        "Checking support for ARCHIVE_CRYPTO_${CRYPTO}_WIN -- found")
		SET(ARCHIVE_CRYPTO_${CRYPTO} 1)
	ELSE (ARCHIVE_CRYPTO_${CRYPTO}_WIN)
	    MESSAGE(STATUS
	         "Checking support for ARCHIVE_CRYPTO_${CRYPTO}_WIN -- not found")
    	    FILE(APPEND
	        ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
                "Checking support for ARCHIVE_CRYPTO_${CRYPTO}_WIN failed with the following output:\n"
        	"${OUTPUT}\n"
        	"Source file was:\n${SOURCE}\n")
	ENDIF (ARCHIVE_CRYPTO_${CRYPTO}_WIN)
      ENDIF(NOT DEFINED ARCHIVE_CRYPTO_${CRYPTO}_WIN)
      ENDIF(NOT ARCHIVE_CRYPTO_${CRYPTO})
    ENDFOREACH(CRYPTO)
  ENDIF(WIN32 AND NOT CYGWIN)
ENDMACRO(CHECK_CRYPTO_WIN CRYPTO_LIST)

#
d2168 9
a2176 7
CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" LIBC)
CHECK_CRYPTO("SHA256;SHA384;SHA512" LIBC2)
CHECK_CRYPTO("SHA256;SHA384;SHA512" LIBC3)
CHECK_CRYPTO("MD5;SHA1;SHA256;SHA384;SHA512" LIBSYSTEM)
CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" MBEDTLS)
CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" NETTLE)
CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" OPENSSL)
d2178 3
a2180 4
# Libmd has to be probed after OpenSSL.
CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA512" LIBMD)

CHECK_CRYPTO_WIN("MD5;SHA1;SHA256;SHA384;SHA512")
@


1.20
log
@libarchive: updated to 3.8.5

3.8.5

Notable bugxies:

bsdtar: fix regression from 3.8.4 zero-length pattern issue bugfix
various small bugfixes in code and documentation
@
text
@d750 1
@


1.19
log
@libarchive: updated to 3.8.3

Libarchive 3.8.3 is a bugfix and security release.

Security fixes:

lib: Create temporary files in the target directory
lha: Fix for an out-of-bounds buffer overrun when using p[H_LEVEL_OFFSET]
7-zip: Fix a buffer overrun when reading truncated 7zip headers

Notable bugxies:

lz4 and zstd: Support both lz4 and zstd data with leading skippable frames
@
text
@d142 6
a147 1
  IF(NOT CMAKE_SYSTEM_NAME MATCHES "Darwin")
d156 1
a156 4
  ELSE()
    SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-dead_strip")
    SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-dead_strip")
  ENDIF(NOT CMAKE_SYSTEM_NAME MATCHES "Darwin")
d1090 2
a1091 2
      # success of iconv detection with a warning which success is a miss
      # detection. So this needs for all build mode(even it's a release mode).
@


1.18
log
@libarchive: updated to 3.8.2

Libarchive 3.8.2 is a bugfix and security release.

Security fixes:

7zip: Fix out of boundary access
tar reader: fix checking the result of the strftime

Notable bugfixes:

bsdtar: Allow filename to have CRLF endings
lib: archive_read_data: handle sparse holes at end of file correctly
lib: improve filter process handling
lib: fix error checking in writing files
lib: handle possible errors from system calls
lib: avoid leaking file descriptors into subprocesses
lib: parse_date: handle dates in 2038 and beyond if time_t is big enough
RAR5 reader: fix multiple issues in extra field parsing function
RAR5 reader: early fail when file declares data for a dir entry
tar writer: fix replacing a regular file with a dir for ARCHIVE_EXTRACT_SAFE_WRITES
tar reader (Windows): check WCS pathname in header_gnutar before overwriting
tar reader: fix an infinite loop when parsing V headers
zip writer: fix a memory leak if write callback error early
zip writer: fix writing with ZSTD compression
zstd write filter: enable Zstandard's checksum feature
@
text
@d1532 1
@


1.17
log
@libarchive: updated to 3.8.1

3.8.1

Important bugfixes

various compilation fixes
fixed undefined behavior in a function in warc reader
Windows binary uses xz 5.2.5
@
text
@d6 3
d261 4
d1482 2
d1501 1
d1506 1
d1509 2
a1510 1
CHECK_FUNCTION_EXISTS_GLIBC(getpid HAVE_GETPID)
d1513 1
a1594 6
# Make sure we have the POSIX version of readdir_r, not the
# older 2-argument version.
CHECK_C_SOURCE_COMPILES(
  "#include <dirent.h>\nint main() {DIR *d = opendir(\".\"); struct dirent e,*r; return readdir_r(d,&e,&r);}"
  HAVE_READDIR_R)

@


1.16
log
@libarchive bsdtar: updated to 3.8.0

Libarchive 3.8.0 is a feature and bugfix release.

New features:
bsdtar: support --mtime and --clamp-mtime
lib: mbedtls 3.x compatibility
7-zip reader: improve self-extracting archive detection
xar: xmllite support for the XAR reader and writer
zip writer: added XZ, LZMA, ZSTD and BZIP2 support
zip writer: added LZMA + RISCV BCJ filter

Notable security fixes:
rar: do not skip past EOF while reading
rar: fix double free with over 4 billion nodes
rar: fix heap-buffer-overflow
warc: prevent signed integer overflow
tar: fix overflow in build_ustar_entry

Notable bugfixes:
bsdtar: don't hardlink negative inode files together
gz: allow setting the original filename for gzip compressed files
lib: improve lseek handling
lib: support @@-prefixed Unix epoch timestamps as date strings
rar: support large headers on 32 bit systems
tar reader: Improve LFS support on 32 bit systems
@
text
@d1260 1
a1260 1
      SET(CMAKE_REQUIRED_LIBRARIES "xmllite")
d1271 1
a1271 1
        LIST(APPEND ADDITIONAL_LIBS "xmllite")
@


1.15
log
@bsdtar libarchive: updated to 3.7.9

3.7.9

Important bugfixes:

a regression in libarchive 3.7.8 regarding GNU sparse entries was fixed


3.7.8

Security fixes:

tar reader: Handle truncation in the middle of a GNU long linkname
unzip: fix null pointer dereference
tar reader: fix unchecked return value in list_item_verbose()

Important bugfixes:

7zip reader: add SPARC
tar reader: Ignore ustar size when pax size is present
tar writer: Fix bug when -s/a/b/ used more than once with b flag
cpio: Fix a Y2038 bug on Windows
libarchive: Handle ARCHIVE_FILTER_LZOP in archive_read_append_filter
libarchive: Adding missing seeker function to archive_read_open_FILE()
@
text
@d97 3
d231 1
d360 6
a365 4
  FOREACH (_man ${ARGV})
    STRING(REGEX REPLACE "^.+[.]([1-9])" "\\1" _mansect ${_man})
    INSTALL(FILES ${_man} DESTINATION "share/man/man${_mansect}")
  ENDFOREACH (_man)
d590 1
d603 4
d609 1
d672 1
a680 1

d811 1
a811 1

d834 1
a834 1

d853 1
a1060 1

d1153 1
d1197 1
d1227 1
d1255 19
d1827 5
a1831 1
  ELSE()
d1836 1
d1954 6
d2099 6
d2204 1
a2204 1
IF(WIN32 AND NOT CYGWIN)
d2216 1
a2216 1
ENDIF(WIN32 AND NOT CYGWIN)
@


1.14
log
@libarchive: updated to 3.7.7

Libarchive 3.7.7 is a bugfix and security release

Security fixes:

gzip: prevent a hang when processing a malformed gzip inside a gzip
tar: don't crash on truncated tar archives
tar: fix two leaks in tar header parsing

Important bugfixes:

7-zip: read/write symlink paths as UTF-8
cpio: exit with an error code if an entry could not be extracted
rar5: report encrypted entries
tar: fix truncation of entry pathnames in specific archives
windows: fix ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS


Libarchive 3.7.6 is a bugfix and security release.
This release fixes a tar regression introduced in libarchive 3.7.5

Important bugfixes.

tar: clean up linkpath between entries
tar: fix memory leaks when processing symlinks or parsing pax headers
iso: be more cautious about parsing ISO-9660 timestamps
@
text
@d2 1
a2 4
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12 FATAL_ERROR)
if(APPLE AND CMAKE_VERSION VERSION_LESS "3.17.0")
  message(WARNING "CMake>=3.17.0 required to make the generated shared library have the same Mach-O headers as autotools")
endif()
a3 10
if(POLICY CMP0065)
  cmake_policy(SET CMP0065 NEW) #3.4 don't use `-rdynamic` with executables
endif()
if(POLICY CMP0074)
  cmake_policy(SET CMP0074 NEW) #3.12.0 `find_package()`` uses ``<PackageName>_ROOT`` variables.
endif()
if(POLICY CMP0075)
  cmake_policy(SET CMP0075 NEW) #3.12.0 `check_include_file()`` and friends use ``CMAKE_REQUIRED_LIBRARIES``.
endif()
#
a282 12
  ELSEIF(WINDOWS_VERSION STREQUAL "VISTA")
    SET(NTDDI_VERSION 0x06000000)
    SET(_WIN32_WINNT 0x0600)
    SET(WINVER 0x0600)
  ELSEIF(WINDOWS_VERSION STREQUAL "WS03")
    SET(NTDDI_VERSION 0x05020000)
    SET(_WIN32_WINNT 0x0502)
    SET(WINVER 0x0502)
  ELSEIF(WINDOWS_VERSION STREQUAL "WINXP")
    SET(NTDDI_VERSION 0x05010000)
    SET(_WIN32_WINNT 0x0501)
    SET(WINVER 0x0501)
d1502 2
d1513 3
a1515 3
CHECK_FUNCTION_EXISTS_GLIBC(wcscmp HAVE_WCSCMP)
CHECK_FUNCTION_EXISTS_GLIBC(wcscpy HAVE_WCSCPY)
CHECK_FUNCTION_EXISTS_GLIBC(wcslen HAVE_WCSLEN)
a2174 5
IF(APPLE)
  # CC_MD5_Init() functions are deprecated on macOS 10.15, but we want to use them
  ADD_DEFINITIONS(-Wno-deprecated-declarations)
ENDIF(APPLE)

@


1.13
log
@libarchive: updated to 3.7.5

Libarchive 3.7.5

Security fixes:

fix multiple vulnerabilities identified by SAST
cpio: ignore out-of-range gid/uid/size/ino and harden AFIO parsing
lzop: prevent integer overflow
rar4: protect copy_from_lzss_window_to_unp()
rar4: fix CVE-2024-26256
rar4: fix OOB in delta and audio filter
rar4: fix out of boundary access with large files
rar4: add boundary checks to rgb filter
rar4: fix OOB access with unicode filenames
rar5: clear 'data ready' cache on window buffer reallocs
rpm: calculate huge header sizes correctly
unzip: unify EOF handling
util: fix out of boundary access in mktemp functions
uu: stop processing if lines are too long

Important bugfixes:

7zip: fix issue when skipping first file in 7zip archive that is a multiple of 65536 bytes
ar: fix archive entries having no type
lha: do not allow negative file sizes
lha: fix integer truncation on 32-bit systems
shar: check strdup return value
rar5: don't try to read rediculously long names
xar: fix another infinite loop and expat error handling
many Windows fixes, cleanups and improvements
@
text
@d884 8
@


1.12
log
@libarchive: updated to 3.7.4

Libarchive 3.7.4 is a bugfix and security release

Security fixes:

rar: Fix OOB in rar e8 filter (CVE-2024-26256)
zip: Fix out of boundary access

Important bugfixes:

7zip: Limit amount of properties
bsdtar: Fix error handling around strtol() usages
passphrase: Improve newline handling on Windows
passphrase: Never allow empty passwords
rar: Fix "File CRC Error" when extracting specific rar4 archives
xar: Avoid infinite link loop
zip: Update AppleDouble support for directories
zstd: Implement core detection
@
text
@d3 4
d90 15
a104 3
# Set SOVERSION == Interface version
# ?? Should there be more here ??
SET(SOVERSION "${INTERFACE_VERSION}")
d126 1
a126 1
    CMAKE_C_COMPILER_ID MATCHES "^Clang$")
d163 1
a163 1
       CMAKE_C_COMPILER_ID MATCHES "^Clang$")
d462 4
a465 1
  FIND_PACKAGE(ZLIB)
a764 1
LA_CHECK_INCLUDE_FILE("sys/queue.h" HAVE_SYS_QUEUE_H)
d2195 5
@


1.11
log
@libarchive: updated to 3.7.3

Libarchive 3.7.3 is a feature, security and bugfix release.

New features:

PCRE2 support
add trailing letter b to bsdtar(1) substitute pattern
add support for long options "--group" and "--owner" to tar(1)

Security fixes:

Fix possible vulnerability in tar error reporting introduced in f27c173

Important bugfixes:

ISO9660: preserve the natural order of links
rar5: fix decoding unicode filenames on Windows
rar5: fix infinite loop if during rar5 decompression the last block produced no data
xz filter: fix incorrect eof at the end of an lzip member
zip: fix end-of-data marker processing when decompressing zip archives
multiple bsdunzip(1) fixes
filetime truncation fix on Windows
@
text
@d37 4
a40 2
IF(NOT "${CMAKE_BUILD_TYPE}"
       MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel|None)\$")
d43 3
a45 3
          "Acceptable keywords: Debug,Release,RelWithDebInfo,MinSizeRel,None")
ENDIF(NOT "${CMAKE_BUILD_TYPE}"
          MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel|None)\$")
d1500 1
@


1.10
log
@libarchive: updated to 3.7.2

Libarchive 3.7.2 is a security, bugfix and feature release.

Security fixes:

Multiple vulnerabilities have been fixed in the PAX writer (1b4e0d0)
Important bugfixes:

bsdunzip(1) now correctly handles arguments following an -x after the zipfile
New features:

bsdunzip(1) now supports the "--version" flag
7-zip reader now translates Windows permissions into UNIX permissions
uudecode filter in raw mode now supports file name and file mode
zstd filter now supports the "long" write option


Libarchive 3.7.1 is a security, feature and bugfix release.

Security fixes:

SEGV and stack buffer overflow in verbose mode of cpio
Feature updates:

bsdunzip updated to match latest upstream code
Important bugfixes:

miscellaneous functional bugfixes
build fixes on multiple platforms


Libarchive 3.7.0 is a feature and bugfix release.

New features:

bsdunzip: new tool ported from FreeBSD
drop-in replacement for Info-ZIP unzip, not yet ported for Windows
7zip reader: support for Zstandard compression
7zip reader: support for ARM64 filter
zstd filter: support for multi-frame zstd archives
Other notable bugfixes and improvements:

pax: fix year 2038 problem on platforms with 64-bit time_t
Windows: Universal Windows Platform (UWP) fixes and improvements
Windows: bcrypt usage fixes and improvements
Windows: time function usage fixes and improvements
@
text
@d9 3
d26 1
d38 1
a38 1
       MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel)\$")
d41 1
a41 1
          "Acceptable keywords: Debug,Release,RelWithDebInfo,MinSizeRel")
d43 1
a43 1
          MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel)\$")
a130 2
  #
  # The CI fails with this on MacOS
d140 3
d224 1
d532 1
a532 1
    "#include <lzma.h>\n#if LZMA_VERSION < 50020000\n#error unsupported\n#endif\nint main(void){lzma_stream_encoder_mt(0, 0); return 0;}"
d663 1
a663 1
  CHECK_FUNCTION_EXISTS(ZSTD_compressStream HAVE_LIBZSTD_COMPRESSOR)
d1196 1
a1196 1
IF(ENABLE_LIBXML2)
d1357 62
@


1.9
log
@libarchive: Update to 3.4.3

Libarchive 3.4.3 is a feature and bugfix release.

New features:

    support for pzstd compressed files (#1357)
    support for RHT.security.selinux tar extended attribute (#1348)

Important bugfixes:

    various zstd fixes and improvements (#1342 #1352 #1359)
    child process handling fixes (#1372)

Libarchive 3.4.2 is a feature and security release.

New features:

    support for atomic file extraction (bsdtar -x --safe-writes) (#1289)
    support for mbed TLS (PolarSSL) (#1301)

Important bugfixes:

    security fixes in RAR5 reader (#1280 #1326)
    compression buffer fix in XAR writer (#1317)
    fix uname and gname longer than 32 characters in PAX writer (#1319)
    fix segfault when archiving hard links in ISO9660 and XAR writers (#1325)
    fix support for extracting 7z archive entries with Delta filter (#987)

Libarchive 3.4.1 is a feature and security release.

New features:

    Unicode filename support for reading lha/lzh archives
    New pax write option "xattrhdr"

Important bugfixes:

    security fixes in wide string processing (#1276 #1298)
    security fixes in RAR5 reader (#1212 #1217 #1296)
    security fixes and optimizations to write filter logic (#351)
    security fix related to use of readlink(2) (1dae5a5)
    sparse file handling fixes (#1218 #1260)

Thanks to all contributors and bug reporters.
Special thanks to Christos Zoulas (@@zoulasc) from NetBSD for the atomic file extraction feature.
@
text
@d3 3
d68 1
d84 1
a84 1
# Enalbe CMAKE_PUSH_CHECK_STATE() and CMAKE_POP_CHECK_STATE() macros
d103 2
a104 18
IF (CMAKE_C_COMPILER_ID MATCHES "^GNU$")
  SET(CMAKE_REQUIRED_FLAGS "-Wall -Wformat -Wformat-security")
  #################################################################
  # Set compile flags for all build types.
  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wformat -Wformat-security")
  if (ENABLE_WERROR)
    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
  endif ()
  #################################################################
  # Set compile flags for debug build.
  # This is added into CMAKE_C_FLAGS when CMAKE_BUILD_TYPE is "Debug"
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wextra")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wunused")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wshadow")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wmissing-prototypes")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wcast-qual")
ENDIF (CMAKE_C_COMPILER_ID MATCHES "^GNU$")
IF (CMAKE_C_COMPILER_ID MATCHES "^Clang$")
d121 20
a140 1
ENDIF (CMAKE_C_COMPILER_ID MATCHES "^Clang$")
d203 2
d219 1
a219 1
OPTION(ENABLE_LibGCC "Enable the use of the system LibGCC library if found" ON)
d229 7
d245 1
a245 1
SET(WINDOWS_VERSION "WIN7" CACHE STRING "Set Windows version to use (Windows only)")
d256 5
a260 1
  IF(WINDOWS_VERSION STREQUAL "WIN8")
d284 1
a284 1
  ELSE(WINDOWS_VERSION STREQUAL "WIN8")
d289 1
a289 1
  ENDIF(WINDOWS_VERSION STREQUAL "WIN8")
d312 1
d383 5
a387 1
        CHECK_C_SOURCE_RUNS("${SAMPLE_SOURCE}" ${VAR})
d406 1
a406 1
  # You have to add a path availabel DLL file into PATH environment variable.
d525 3
d534 1
d588 1
d637 7
a643 2
  FIND_PATH(ZSTD_INCLUDE_DIR zstd.h)
  FIND_LIBRARY(ZSTD_LIBRARY NAMES zstd libzstd)
d656 2
a657 1
  CHECK_FUNCTION_EXISTS(ZSTD_compressStream HAVE_LIBZSTD)
d698 1
d738 1
d758 1
a758 1
  LA_CHECK_INCLUDE_FILE("Bcrypt.h" HAVE_BCRYPT_H)
d760 1
a760 1
    LIST(APPEND ADDITIONAL_LIBS "Bcrypt")
d837 4
d1060 1
a1060 1
      # success of iconv detection with a warnig which success is a miss
d1293 2
a1294 2
  IF(ENABLE_LibGCC)
    FIND_PACKAGE(LibGCC)
d1296 1
d1377 1
d1390 1
d1400 1
d1427 1
a1442 1
CHECK_FUNCTION_EXISTS_GLIBC(_ctime64_s HAVE__CTIME64_S)
d1445 4
a1448 3
CHECK_FUNCTION_EXISTS_GLIBC(_gmtime64_s HAVE__GMTIME64_S)
CHECK_FUNCTION_EXISTS_GLIBC(_localtime64_s HAVE__LOCALTIME64_S)
CHECK_FUNCTION_EXISTS_GLIBC(_mkgmtime64 HAVE__MKGMTIME64)
d1470 4
a1490 1

a1501 8
IF(ENABLE_LZMA)
CHECK_C_SOURCE_COMPILES(
  "#include <lzma.h>\n#if LZMA_VERSION < 50020000\n#error unsupported\n#endif\nint main(void){lzma_stream_encoder_mt(0, 0); return 0;}"
  HAVE_LZMA_STREAM_ENCODER_MT)
ELSE()
  SET(HAVE_LZMA_STREAM_ENCODER_MT 0)
ENDIF(ENABLE_LZMA)

d1540 1
d1544 4
d1581 1
a1581 1
    "sys/types.h;sys/time.h;time.h" TIME_WITH_SYS_TIME)
d1587 9
a1595 9
CHECK_TYPE_SIZE("short" SIZE_OF_SHORT)
CHECK_TYPE_SIZE("int" SIZE_OF_INT)
CHECK_TYPE_SIZE("long" SIZE_OF_LONG)
CHECK_TYPE_SIZE("long long"     SIZE_OF_LONG_LONG)

CHECK_TYPE_SIZE("unsigned short" SIZE_OF_UNSIGNED_SHORT)
CHECK_TYPE_SIZE("unsigned" SIZE_OF_UNSIGNED)
CHECK_TYPE_SIZE("unsigned long" SIZE_OF_UNSIGNED_LONG)
CHECK_TYPE_SIZE("unsigned long long" SIZE_OF_UNSIGNED_LONG_LONG)
d2056 11
d2114 1
@


1.8
log
@Update for libarchive-3.4.0:
- improvements for Android APK and JAR archives
- better support for non-recursive list and extract
- tar --exclude-vcs support
- fixes for file attributes and flags handling
- zipx support
- rar 5.0 reader
@
text
@d158 3
a160 3
  # Enable level 4 C4061: The enumerate has no associated handler in a switch
  #                       statement.
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4061")
d163 1
a163 1
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4254")
d167 1
a167 1
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4295")
d170 1
a170 1
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4296")
d173 1
a173 1
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4389")
d177 1
a177 1
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4505")
d180 1
a180 1
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4514")
d182 1
a182 1
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4702")
d185 1
a185 1
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4706")
d196 2
a197 1
OPTION(ENABLE_NETTLE "Enable use of Nettle" ON)
d290 4
d747 20
d828 2
d845 5
d1399 1
d1452 1
d1456 3
d2000 1
d2043 5
@


1.7
log
@libarchive: updated to 3.3.3

libarchive 3.3.3:
Avoid super-linear slowdown on malformed mtree files
Many fixes for building with Visual Studio
NO_OVERWRITE doesn't change existing directory attributes
New support for Zstandard read and write filters
@
text
@d3 3
d90 5
d104 3
a109 1
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Werror")
d121 3
a127 1
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Werror")
d140 3
a146 1
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -qhalt=w")
d151 4
a185 2
  # /WX option is the same as gcc's -Werror option.
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /WX")
d198 1
d202 1
d478 1
a478 1
  SET(LIBZMA_FOUND FALSE) # Override cached value
d484 1
d498 1
d502 3
d534 29
d596 13
a608 9
IF (ZSTD_INCLUDE_DIR)
  # Already in cache, be silent
  SET(ZSTD_FIND_QUIETLY TRUE)
ENDIF (ZSTD_INCLUDE_DIR)

FIND_PATH(ZSTD_INCLUDE_DIR zstd.h)
FIND_LIBRARY(ZSTD_LIBRARY NAMES zstd libzstd)
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(ZSTD DEFAULT_MSG ZSTD_LIBRARY ZSTD_INCLUDE_DIR)
d613 1
d620 1
d625 1
d1353 1
d1635 5
@


1.6
log
@Merge for libarchive-3.3.2.
@
text
@d182 1
d496 1
a496 1
  SET(LIBZMA_FOUND FALSE) # Override cached value
d513 5
a517 4
IF (LZ4_INCLUDE_DIR)
  # Already in cache, be silent
  SET(LZ4_FIND_QUIETLY TRUE)
ENDIF (LZ4_INCLUDE_DIR)
d519 7
a525 4
FIND_PATH(LZ4_INCLUDE_DIR lz4.h)
FIND_LIBRARY(LZ4_LIBRARY NAMES lz4 liblz4)
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LZ4 DEFAULT_MSG LZ4_LIBRARY LZ4_INCLUDE_DIR)
d541 25
d642 1
@


1.5
log
@Merge 60f0931d3b97e00616d7122321e34116d926bcc5:

 Reorganize ACL defines and fix detection of ACL_SYNCHRONIZE on Mac OS
 Adjust MacOS part of test_acl_platform_nfs4
@
text
@d555 1
d583 1
d601 1
d607 1
d617 1
d626 3
a1205 1
CHECK_FUNCTION_EXISTS_GLIBC(dirfd HAVE_DIRFD)
d1305 4
a1540 3
  LA_CHECK_INCLUDE_FILE(attr/xattr.h     HAVE_ATTR_XATTR_H)
  LA_CHECK_INCLUDE_FILE(sys/xattr.h      HAVE_SYS_XATTR_H)
  LA_CHECK_INCLUDE_FILE(sys/extattr.h      HAVE_SYS_EXTATTR_H)
d1546 89
a1634 20
  CHECK_FUNCTION_EXISTS_GLIBC(extattr_get_file HAVE_EXTATTR_GET_FILE)
  CHECK_FUNCTION_EXISTS_GLIBC(extattr_list_file HAVE_EXTATTR_LIST_FILE)
  CHECK_FUNCTION_EXISTS_GLIBC(extattr_set_fd HAVE_EXTATTR_SET_FD)
  CHECK_FUNCTION_EXISTS_GLIBC(extattr_set_file HAVE_EXTATTR_SET_FILE)
  CHECK_FUNCTION_EXISTS_GLIBC(fgetxattr HAVE_FGETXATTR)
  CHECK_FUNCTION_EXISTS_GLIBC(flistxattr HAVE_FLISTXATTR)
  CHECK_FUNCTION_EXISTS_GLIBC(fsetxattr HAVE_FSETXATTR)
  CHECK_FUNCTION_EXISTS_GLIBC(getxattr HAVE_GETXATTR)
  CHECK_FUNCTION_EXISTS_GLIBC(lgetxattr HAVE_LGETXATTR)
  CHECK_FUNCTION_EXISTS_GLIBC(listxattr HAVE_LISTXATTR)
  CHECK_FUNCTION_EXISTS_GLIBC(llistxattr HAVE_LLISTXATTR)
  CHECK_FUNCTION_EXISTS_GLIBC(lsetxattr HAVE_LSETXATTR)
  CHECK_FUNCTION_EXISTS_GLIBC(fgetea HAVE_FGETEA)
  CHECK_FUNCTION_EXISTS_GLIBC(flistea HAVE_FLISTEA)
  CHECK_FUNCTION_EXISTS_GLIBC(fsetea HAVE_FSETEA)
  CHECK_FUNCTION_EXISTS_GLIBC(getea HAVE_GETEA)
  CHECK_FUNCTION_EXISTS_GLIBC(lgetea HAVE_LGETEA)
  CHECK_FUNCTION_EXISTS_GLIBC(listea HAVE_LISTEA)
  CHECK_FUNCTION_EXISTS_GLIBC(llistea HAVE_LLISTEA)
  CHECK_FUNCTION_EXISTS_GLIBC(lsetea HAVE_LSETEA)
d1636 4
a1639 25
  SET(HAVE_ATTR_LIB FALSE)
  SET(HAVE_ATTR_XATTR_H FALSE)
  SET(HAVE_DECL_EXTATTR_NAMESPACE_USER FALSE)
  SET(HAVE_EXTATTR_GET_FILE FALSE)
  SET(HAVE_EXTATTR_LIST_FILE FALSE)
  SET(HAVE_EXTATTR_SET_FD FALSE)
  SET(HAVE_EXTATTR_SET_FILE FALSE)
  SET(HAVE_FGETEA FALSE)
  SET(HAVE_FGETXATTR FALSE)
  SET(HAVE_FLISTEA FALSE)
  SET(HAVE_FLISTXATTR FALSE)
  SET(HAVE_FSETEA FALSE)
  SET(HAVE_FSETXATTR FALSE)
  SET(HAVE_GETEA FALSE)
  SET(HAVE_GETXATTR FALSE)
  SET(HAVE_LGETEA FALSE)
  SET(HAVE_LGETXATTR FALSE)
  SET(HAVE_LISTEA FALSE)
  SET(HAVE_LISTXATTR FALSE)
  SET(HAVE_LLISTEA FALSE)
  SET(HAVE_LLISTXATTR FALSE)
  SET(HAVE_LSETEA FALSE)
  SET(HAVE_LSETXATTR FALSE)
  SET(HAVE_SYS_EXTATTR_H FALSE)
  SET(HAVE_SYS_XATTR_H FALSE)
d1651 5
d1662 91
a1752 26
  #
  CHECK_FUNCTION_EXISTS_GLIBC(acl_create_entry HAVE_ACL_CREATE_ENTRY)
  CHECK_FUNCTION_EXISTS_GLIBC(acl_init HAVE_ACL_INIT)
  CHECK_FUNCTION_EXISTS_GLIBC(acl_set_fd HAVE_ACL_SET_FD)
  CHECK_FUNCTION_EXISTS_GLIBC(acl_set_fd_np HAVE_ACL_SET_FD_NP)
  CHECK_FUNCTION_EXISTS_GLIBC(acl_set_file HAVE_ACL_SET_FILE)
  CHECK_TYPE_EXISTS(acl_permset_t "${INCLUDES}"    HAVE_ACL_PERMSET_T)

  # The "acl_get_perm()" function was omitted from the POSIX draft.
  # (It's a pretty obvious oversight; otherwise, there's no way to
  # test for specific permissions in a permset.)  Linux uses the obvious
  # name, FreeBSD adds _np to mark it as "non-Posix extension."
  # Test for both as a double-check that we really have POSIX-style ACL support.
  CHECK_FUNCTION_EXISTS(acl_get_fd_np HAVE_ACL_GET_FD_NP)
  CHECK_FUNCTION_EXISTS(acl_get_perm HAVE_ACL_GET_PERM)
  CHECK_FUNCTION_EXISTS(acl_get_perm_np HAVE_ACL_GET_PERM_NP)
  CHECK_FUNCTION_EXISTS(acl_get_link HAVE_ACL_GET_LINK)
  CHECK_FUNCTION_EXISTS(acl_get_link_np HAVE_ACL_GET_LINK_NP)
  CHECK_FUNCTION_EXISTS(acl_is_trivial_np HAVE_ACL_IS_TRIVIAL_NP)
  CHECK_FUNCTION_EXISTS(acl_set_link_np HAVE_ACL_SET_LINK_NP)
  CHECK_SYMBOL_EXISTS(ACL_TYPE_NFS4 "${INCLUDES}" HAVE_DECL_ACL_TYPE_NFS4)

  # MacOS has an acl.h that isn't POSIX.  It can be detected by
  # checking for ACL_USER
  CHECK_SYMBOL_EXISTS(ACL_USER "${INCLUDES}" HAVE_DECL_ACL_USER)
  CHECK_C_SOURCE_COMPILES("#include <sys/types.h>
d1755 1
a1755 1
  CHECK_C_SOURCE_COMPILES("#include <sys/types.h>
d1758 89
a1847 11
  # Solaris and derivates ACLs
  CHECK_TYPE_EXISTS(aclent_t "${INCLUDES}" HAVE_ACLENT_T)
  CHECK_TYPE_EXISTS(ace_t "${INCLUDES}" HAVE_ACE_T)
  CHECK_FUNCTION_EXISTS(acl HAVE_ACL)
  CHECK_FUNCTION_EXISTS(facl HAVE_FACL)
  CHECK_SYMBOL_EXISTS(GETACL "${INCLUDES}" HAVE_DECL_GETACL)
  CHECK_SYMBOL_EXISTS(GETACLCNT "${INCLUDES}" HAVE_DECL_GETACLCNT)
  CHECK_SYMBOL_EXISTS(SETACL "${INCLUDES}" HAVE_DECL_SETACL)
  CHECK_SYMBOL_EXISTS(ACE_GETACL "${INCLUDES}" HAVE_DECL_ACE_GETACL)
  CHECK_SYMBOL_EXISTS(ACE_GETACLCNT "${INCLUDES}" HAVE_DECL_ACE_GETACLCNT)
  CHECK_SYMBOL_EXISTS(ACE_SETACL "${INCLUDES}" HAVE_DECL_ACE_SETACL)
d1851 6
a1856 25
  SET(HAVE_ACL_CREATE_ENTRY FALSE)
  SET(HAVE_ACL_GET_LINK FALSE)
  SET(HAVE_ACL_GET_LINK_NP FALSE)
  SET(HAVE_ACL_GET_PERM FALSE)
  SET(HAVE_ACL_GET_PERM_NP FALSE)
  SET(HAVE_ACL_INIT FALSE)
  SET(HAVE_ACL_LIB FALSE)
  SET(HAVE_ACL_PERMSET_T FALSE)
  SET(HAVE_ACL_SET_FD FALSE)
  SET(HAVE_ACL_SET_FD_NP FALSE)
  SET(HAVE_ACL_SET_FILE FALSE)
  SET(HAVE_ACL_TYPE_EXTENDED FALSE)
  SET(HAVE_ACLENT_T FALSE)
  SET(HAVE_ACE_T FALSE)
  SET(HAVE_DECL_ACL_TYPE_NFS4 FALSE)
  SET(HAVE_DECL_ACL_USER FALSE)
  SET(HAVE_DECL_ACL_SYNCHRONIZE FALSE)
  SET(HAVE_DECL_GETACL FALSE)
  SET(HAVE_DECL_GETACLCNT FALSE)
  SET(HAVE_DECL_SETACL FALSE)
  SET(HAVE_DECL_ACE_GETACL FALSE)
  SET(HAVE_DECL_ACE_GETACLCNT FALSE)
  SET(HAVE_DECL_ACE_SETACL FALSE)
  SET(HAVE_ACL FALSE)
  SET(HAVE_FACL FALSE)
@


1.4
log
@Merge libarchive-3.3.1.
@
text
@d1621 1
a1621 1
  CHECK_SYMBOL_EXISTS(ACL_TYPE_NFS4 "${INCLUDES}" HAVE_ACL_TYPE_NFS4)
d1625 1
a1625 1
  CHECK_SYMBOL_EXISTS(ACL_USER "${INCLUDES}" HAVE_ACL_USER)
d1628 4
a1631 1
int main(void) { return ACL_TYPE_EXTENDED; }" HAVE_ACL_TYPE_EXTENDED)
a1633 7
  CHECK_LIBRARY_EXISTS(sec "acl_get" "" HAVE_LIBSEC)
  IF(HAVE_LIBSEC)
    SET(CMAKE_REQUIRED_LIBRARIES "sec")
    FIND_LIBRARY(SEC_LIBRARY NAMES sec)
    LIST(APPEND ADDITIONAL_LIBS ${SEC_LIBRARY})
  ENDIF(HAVE_LIBSEC)
  #
d1636 8
a1643 4
  CHECK_FUNCTION_EXISTS(acl_get HAVE_FACL_GET)
  CHECK_FUNCTION_EXISTS(facl_get HAVE_FACL_GET)
  CHECK_FUNCTION_EXISTS(acl_set HAVE_FACL_SET)
  CHECK_FUNCTION_EXISTS(facl_set HAVE_FACL_SET)
a1657 2
  SET(HAVE_ACL_TYPE_NFS4 FALSE)
  SET(HAVE_ACL_USER FALSE)
a1658 1
  SET(HAVE_ACL_GET FALSE)
d1661 11
a1671 3
  SET(HAVE_FACL_GET FALSE)
  SET(HAVE_ACL_SET FALSE)
  SET(HAVE_FACL_SET FALSE)
@


1.3
log
@Update for libarchive 3.2.1.
@
text
@d18 1
a18 1
  SET(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build Type" FORCE)
d47 1
a47 1
 "^([0-9])[0-9][0-9][0-9][0-9][0-9][0-9][a-z]?$" "\\1" _major ${_version})
d49 1
a49 1
 "^[0-9]([0-9][0-9][0-9])[0-9][0-9][0-9][a-z]?$" "\\1" _minor ${_version})
d51 1
a51 1
 "^[0-9][0-9][0-9][0-9]([0-9][0-9][0-9])[a-z]?$" "\\1" _revision ${_version})
d53 1
a53 1
 "^[0-9][0-9][0-9][0-9][0-9][0-9][0-9]([a-z]?)$" "\\1" _quality ${_version})
d182 9
a190 7
OPTION(ENABLE_LZMA "Enable the use of the system found LZMA library if found" ON)
OPTION(ENABLE_ZLIB "Enable the use of the system found ZLIB library if found" ON)
OPTION(ENABLE_BZip2 "Enable the use of the system found BZip2 library if found" ON)
OPTION(ENABLE_LIBXML2 "Enable the use of the system found libxml2 library if found" ON)
OPTION(ENABLE_EXPAT "Enable the use of the system found EXPAT library if found" ON)
OPTION(ENABLE_PCREPOSIX "Enable the use of the system found PCREPOSIX library if found" ON)
OPTION(ENABLE_LibGCC "Enable the use of the system found LibGCC library if found" ON)
d279 1
a279 1
INCLUDE(CheckStructMember)
d457 1
a457 1
  FIND_PACKAGE(LZMA)
d459 1
a459 2
  SET(LZMA_FOUND FALSE) # Override cached value
  SET(LZMADEC_FOUND FALSE) # Override cached value
d462 1
a462 1
IF(LZMA_FOUND)
d465 4
a468 2
  INCLUDE_DIRECTORIES(${LZMA_INCLUDE_DIR})
  LIST(APPEND ADDITIONAL_LIBS ${LZMA_LIBRARIES})
d471 1
a471 1
    "${LZMA_INCLUDE_DIR}" "${LZMA_LIBRARIES}"
d478 1
a478 6
ELSEIF(LZMADEC_FOUND)
  SET(HAVE_LIBLZMADEC 1)
  SET(HAVE_LZMADEC_H 1)
  INCLUDE_DIRECTORIES(${LZMADEC_INCLUDE_DIR})
  LIST(APPEND ADDITIONAL_LIBS ${LZMADEC_LIBRARIES})
ELSE(LZMA_FOUND)
d480 1
a480 1
ENDIF(LZMA_FOUND)
d484 13
a496 9
IF (LZO2_INCLUDE_DIR)
  # Already in cache, be silent
  SET(LZO2_FIND_QUIETLY TRUE)
ENDIF (LZO2_INCLUDE_DIR)

FIND_PATH(LZO2_INCLUDE_DIR lzo/lzoconf.h)
FIND_LIBRARY(LZO2_LIBRARY NAMES lzo2 liblzo2)
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LZO2 DEFAULT_MSG LZO2_LIBRARY LZO2_INCLUDE_DIR)
d575 5
d624 1
a624 1
# Following files need windwos.h, so we should test it after windows.h test.
d1284 8
d1317 4
d1354 1
a1354 1
CHECK_STRUCT_MEMBER("struct tm" tm_gmtoff
d1356 1
a1356 1
CHECK_STRUCT_MEMBER("struct tm" __tm_gmtoff
d1360 1
a1360 1
CHECK_STRUCT_MEMBER("struct statfs" f_namemax
d1364 1
a1364 1
CHECK_STRUCT_MEMBER("struct stat" st_birthtime
d1368 1
a1368 1
CHECK_STRUCT_MEMBER("struct stat" st_birthtimespec.tv_nsec
d1370 1
a1370 1
CHECK_STRUCT_MEMBER("struct stat" st_mtimespec.tv_nsec
d1372 1
a1372 1
CHECK_STRUCT_MEMBER("struct stat" st_mtim.tv_nsec
d1374 1
a1374 1
CHECK_STRUCT_MEMBER("struct stat" st_mtime_n
d1376 1
a1376 1
CHECK_STRUCT_MEMBER("struct stat" st_umtime
d1378 1
a1378 1
CHECK_STRUCT_MEMBER("struct stat" st_mtime_usec
d1381 1
a1381 1
CHECK_STRUCT_MEMBER("struct stat" st_blksize
d1384 1
a1384 1
CHECK_STRUCT_MEMBER("struct stat" st_flags
d1388 1
a1388 1
  CHECK_STRUCT_MEMBER("struct statvfs" f_iosize
d1394 1
a1394 1
CHECK_STRUCT_MEMBER("struct tm" tm_sec
d1614 1
d1621 1
d1626 18
d1658 1
d1660 7
@


1.2
log
@Changes 3.1.2:
This is a maintenance update to fix issues with the new RAR seeking
feature. This new release also contains fixes for build failures when
building libarchive using Visual Studio 2012 and MinGW.
@
text
@d2 1
a2 1
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.6 FATAL_ERROR)
d18 1
a18 1
  SET(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build Type" FORCE)
d38 3
d61 1
d66 1
a66 1
# libarchive 2.7 == interface version 9 = 2 + 7 
d91 1
a91 1
IF ("CMAKE_C_COMPILER_ID" MATCHES "^GNU$")
d99 3
a101 1
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Werror -Wextra -Wunused")
d105 31
a135 1
ENDIF ("CMAKE_C_COMPILER_ID" MATCHES "^GNU$")
d182 10
d196 2
d202 3
d207 5
a211 1
SET(WINDOWS_VERSION "" CACHE STRING "Set Windows version to use (Windows only)")
d219 2
d223 2
d227 2
d231 2
d235 2
d239 2
d243 4
a246 2
    # The default is to use Windows 2000 API.
    SET(WINVER 0x0500)
a247 1
  SET(_WIN32_WINNT ${WINVER})
d255 1
a255 1
	SET(CMAKE_REQUIRED_LINKER_FLAGS "/SAFESEH")
d260 1
a260 1
	SET(CMAKE_REQUIRED_LINKER_FLAGS "/SAFESEH:NO")
d269 2
a270 2
INCLUDE(LibarchiveCheckCSourceCompiles)
INCLUDE(LibarchiveCheckCSourceRuns)
d334 1
a334 1
        LIBARCHIVE_CHECK_C_SOURCE_COMPILES("${SAMPLE_SOURCE}" ${VAR})
d336 1
a336 1
        LIBARCHIVE_CHECK_C_SOURCE_RUNS("${SAMPLE_SOURCE}" ${VAR})
d368 1
a368 1
  # If compiling error occured in zconf.h, You may need patch to zconf.h.
d372 1
a372 1
  # 
d386 5
a390 1
FIND_PACKAGE(ZLIB)
d425 5
a429 1
FIND_PACKAGE(BZip2)
d449 2
d454 7
a460 1
FIND_PACKAGE(LZMA)
d480 2
d507 27
d560 1
a560 1
LIBARCHIVE_CHECK_C_SOURCE_COMPILES("#include <sys/ioctl.h>
d579 1
d581 1
d612 5
d630 1
a630 1
LIBARCHIVE_CHECK_C_SOURCE_COMPILES(
d643 1
a643 3
    SET(HAVE_NETTLE_MD5_H 1)
    SET(HAVE_NETTLE_RIPEMD160_H 1)
    SET(HAVE_NETTLE_SHA_H 1)
d645 9
a653 1
    LIST(APPEND ADDITIONAL_LIBS ${NETTLE_LIBRARIES})
d665 5
d688 1
a688 1
# platforms, just see if archive_crypto.c can compile and link against
d727 1
a727 1
	FILE(READ "${CMAKE_CURRENT_SOURCE_DIR}/libarchive/archive_crypto.c"
a752 6
    IF(CMAKE_REQUIRED_LINKER_FLAGS)
      SET(CHECK_CRYPTO_ADD_LINKER_FLAGS
        "-DCMAKE_EXE_LINKER_FLAGS:STRING=${CMAKE_REQUIRED_LINKER_FLAGS} -DCMAKE_SHARED_LINKER_FLAGS:STRING=${CMAKE_REQUIRED_LINKER_FLAGS} -DCMAKE_MODULE_LINKER_FLAGS:STRING=${CMAKE_REQUIRED_LINKER_FLAGS}")
    ELSE(CMAKE_REQUIRED_LINKER_FLAGS)
      SET(CHECK_CRYPTO_ADD_LINKER_FLAGS)
    ENDIF(CMAKE_REQUIRED_LINKER_FLAGS)
d756 1
a756 1
	  CMAKE_FLAGS ${CHECK_CRYPTO_ADD_LINKER_FLAGS}
a840 6
    IF(CMAKE_REQUIRED_LINKER_FLAGS)
      SET(CHECK_CRYPTO_WIN_ADD_LINKER_FLAGS
        "-DCMAKE_EXE_LINKER_FLAGS:STRING=${CMAKE_REQUIRED_LINKER_FLAGS} -DCMAKE_SHARED_LINKER_FLAGS:STRING=${CMAKE_REQUIRED_LINKER_FLAGS} -DCMAKE_MODULE_LINKER_FLAGS:STRING=${CMAKE_REQUIRED_LINKER_FLAGS}")
    ELSE(CMAKE_REQUIRED_LINKER_FLAGS)
      SET(CHECK_CRYPTO_WIN_ADD_LINKER_FLAGS)
    ENDIF(CMAKE_REQUIRED_LINKER_FLAGS)
d844 1
a844 1
	  CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}/libarchive" ${CHECK_CRYPTO_WIN_ADD_LINKER_FLAGS}
d877 2
a878 1
    IF ("CMAKE_C_COMPILER_ID" MATCHES "^GNU$")
d885 5
a889 1
    ENDIF ("CMAKE_C_COMPILER_ID" MATCHES "^GNU$")
d895 1
a895 1
    LIBARCHIVE_CHECK_C_SOURCE_COMPILES(
d1011 5
a1015 1
FIND_PACKAGE(LibXml2)
d1040 5
a1044 1
  FIND_PACKAGE(EXPAT)
d1114 10
a1123 2
  FIND_PACKAGE(LibGCC)
  FIND_PACKAGE(PCREPOSIX)
d1175 2
a1176 1
IF ("CMAKE_C_COMPILER_ID" MATCHES "^GNU$")
d1183 2
a1184 1
ENDIF ("CMAKE_C_COMPILER_ID" MATCHES "^GNU$")
d1186 1
d1234 1
d1273 1
d1279 1
a1279 1
LIBARCHIVE_CHECK_C_SOURCE_COMPILES(
d1286 1
a1286 1
LIBARCHIVE_CHECK_C_SOURCE_COMPILES(
d1295 1
a1295 1
LIBARCHIVE_CHECK_C_SOURCE_COMPILES(
d1298 1
a1298 1
LIBARCHIVE_CHECK_C_SOURCE_COMPILES(
d1319 2
d1323 2
d1327 1
d1395 1
a1395 1
CHECK_TYPE_SIZE(int16_t INT16_T) 
d1399 3
a1401 3
CHECK_TYPE_SIZE(uint8_t UINT8_T) 
CHECK_TYPE_SIZE(uint16_t UINT16_T) 
CHECK_TYPE_SIZE(uint32_t UINT32_T) 
d1644 3
d1677 1
@


1.1
log
@Initial revision
@
text
@d2 1
a5 1
CMAKE_MINIMUM_REQUIRED(VERSION 2.6.3 FATAL_ERROR)
d10 28
d52 2
a53 2
STRING(REGEX REPLACE "[0]*([^0][0-9]*)$" "\\1" _minor ${_minor})
STRING(REGEX REPLACE "[0]*([^0][0-9]*)$" "\\1" _revision ${_revision})
d55 1
a55 1
SET(VERSION                    "${_major}.${_minor}.${_revision}${_quality}")
d60 80
a139 2
# Shared library number
SET(SOVERSION                   8)
d144 1
a144 4
# Provide ADD_TEST_28 macro to approximate CMake 2.8 ADD_TEST(NAME).
# TODO: Require CMake 2.8 and drop this workaround (perhaps late 2010).
INCLUDE(AddTest28)

d147 1
a147 1
OPTION(ENABLE_TAR_SHARED "Enable dynamic build of tar" OFF)
d149 1
a149 1
OPTION(ENABLE_CPIO_SHARED "Enable dynamic build of cpio" OFF)
d152 1
d154 3
a160 5
IF(WIN32 AND NOT CYGWIN)
  # Currently, dynamic build only.
  SET(ENABLE_TAR_SHARED ON)
  SET(ENABLE_CPIO_SHARED ON)
ENDIF(WIN32 AND NOT CYGWIN)
d163 17
a179 2
  SET(_WIN32_WINNT 0x0500 CACHE INTERNAL "Setting _WIN32_WINNT to 0x0500 for Windows 2000 APIs")
  SET(WINVER 0x0500 CACHE INTERNAL "Setting WINVER to 0x0500 for Windows 2000 APIs")
d182 18
d201 2
a202 1
INCLUDE(CheckCSourceRuns)
d247 32
a278 1

d324 23
d359 11
d372 1
a372 1
MARK_AS_ADVANCED(CLEAR BZIP2_LIBRARY)
d382 9
a390 2
  MARK_AS_ADVANCED(CLEAR LZMA_INCLUDE_DIR)
  MARK_AS_ADVANCED(CLEAR LZMA_LIBRARY)
a395 5
  MARK_AS_ADVANCED(CLEAR LZMADEC_INCLUDE_DIR)
  MARK_AS_ADVANCED(CLEAR LZMADEC_LIBRARY)
ELSE(LZMA_FOUND)
  MARK_AS_ADVANCED(CLEAR LZMA_INCLUDE_DIR)
  MARK_AS_ADVANCED(CLEAR LZMA_LIBRARY)
d397 24
d435 1
a435 2
# Few headers that must precede other headers
# Must precede sys/extattr.h on FreeBSD
a439 1
LA_CHECK_INCLUDE_FILE("attr/xattr.h" HAVE_ATTR_XATTR_H)
d441 1
d446 5
d457 2
d460 1
d469 1
a476 1
LA_CHECK_INCLUDE_FILE("sys/extattr.h" HAVE_SYS_EXTATTR_H)
d479 1
d484 2
d488 2
d497 35
a531 5


#
# Some headers require extra includes when they're available.
#
d535 1
d537 1
a537 1
IF(ENABLE_OPENSSL)
d540 1
a540 1
  SET(OPENSSL_FOUND 0)
d542 341
a882 63
IF(OPENSSL_FOUND)
  INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR})
  LIST(APPEND ADDITIONAL_LIBS ${OPENSSL_LIBRARIES})
ELSE()
  # Block OpenSSL checks and override cached results.
  SET(HAVE_OPENSSL_MD5_H 0)
  SET(HAVE_OPENSSL_RIPEMD_H 0)
  SET(HAVE_OPENSSL_SHA_H 0)
  SET(HAVE_OPENSSL_SHA256_INIT 0)
  SET(HAVE_OPENSSL_SHA384_INIT 0)
  SET(HAVE_OPENSSL_SHA512_INIT 0)
ENDIF()
#
# Check MD5/RMD160/SHA headers
#
LA_CHECK_INCLUDE_FILE("md5.h" HAVE_MD5_H)
LA_CHECK_INCLUDE_FILE("openssl/md5.h" HAVE_OPENSSL_MD5_H)
LA_CHECK_INCLUDE_FILE("openssl/ripemd.h" HAVE_OPENSSL_RIPEMD_H)
LA_CHECK_INCLUDE_FILE("openssl/sha.h" HAVE_OPENSSL_SHA_H)
LA_CHECK_INCLUDE_FILE("ripemd.h" HAVE_RIPEMD_H)
LA_CHECK_INCLUDE_FILE("rmd160.h" HAVE_RMD160_H)
LA_CHECK_INCLUDE_FILE("sha.h" HAVE_SHA_H)
LA_CHECK_INCLUDE_FILE("sha1.h" HAVE_SHA1_H)
LA_CHECK_INCLUDE_FILE("sha2.h" HAVE_SHA2_H)
LA_CHECK_INCLUDE_FILE("sha256.h" HAVE_SHA256_H)

#
# Find MD5/RMD160/SHA library
#
FIND_LIBRARY(CRYPTO_LIBRARY NAMES crypto)
IF(CRYPTO_LIBRARY)
  LIST(APPEND ADDITIONAL_LIBS ${CRYPTO_LIBRARY})
ELSE(CRYPTO_LIBRARY)
  IF(NOT OPENSSL_FOUND)
    FIND_LIBRARY(MD_LIBRARY NAMES md)
    IF(MD_LIBRARY)
      LIST(APPEND ADDITIONAL_LIBS ${MD_LIBRARY})
    ENDIF(MD_LIBRARY)
  ENDIF(NOT OPENSSL_FOUND)
ENDIF(CRYPTO_LIBRARY)
#
# Check MD5/RMD160/SHA functions
#
SET(CMAKE_REQUIRED_LIBRARIES ${ADDITIONAL_LIBS})
IF(HAVE_MD5_H)
  CHECK_SYMBOL_EXISTS(MD5Init			"md5.h"		HAVE_MD5INIT)
ENDIF(HAVE_MD5_H)
IF(HAVE_RMD160_H)
  CHECK_SYMBOL_EXISTS(RMD160Init		"rmd160.h"	HAVE_RMD160INIT)
ENDIF(HAVE_RMD160_H)
IF(HAVE_SHA2_H)
  CHECK_SYMBOL_EXISTS(SHA256Init		"sha2.h"	HAVE_SHA256INIT)
  CHECK_SYMBOL_EXISTS(SHA384Init		"sha2.h"	HAVE_SHA384INIT)
  CHECK_SYMBOL_EXISTS(SHA512Init		"sha2.h"	HAVE_SHA512INIT)
  CHECK_SYMBOL_EXISTS(SHA256_Init		"sha2.h"	HAVE_SHA256_INIT)
  CHECK_SYMBOL_EXISTS(SHA384_Init		"sha2.h"	HAVE_SHA384_INIT)
  CHECK_SYMBOL_EXISTS(SHA512_Init		"sha2.h"	HAVE_SHA512_INIT)
ELSEIF(HAVE_OPENSSL_SHA_H)
  CHECK_SYMBOL_EXISTS(SHA256_Init		"openssl/sha.h"	HAVE_OPENSSL_SHA256_INIT)
  CHECK_SYMBOL_EXISTS(SHA384_Init		"openssl/sha.h"	HAVE_OPENSSL_SHA384_INIT)
  CHECK_SYMBOL_EXISTS(SHA512_Init		"openssl/sha.h"	HAVE_OPENSSL_SHA512_INIT)
ENDIF()
SET(CMAKE_REQUIRED_LIBRARIES "")
d889 1
a893 3
  # We need a directory path of iconv.h so that it won't fail to check
  # "libxml/xmlreader.h".
  FIND_PATH(ICONV_INCLUDE_DIR iconv.h)
d896 12
a907 1
  SET(CMAKE_REQUIRED_INCLUDES "")
d914 1
d919 1
d922 108
d1034 9
a1042 2
CHECK_SYMBOL_EXISTS(CreateHardLinkA "windows.h" HAVE_CREATEHARDLINKA)
CHECK_SYMBOL_EXISTS(CreateHardLinkW "windows.h" HAVE_CREATEHARDLINKW)
d1047 2
d1054 1
d1057 3
d1063 1
d1065 4
d1070 2
d1076 1
d1079 1
d1084 1
d1086 1
d1089 1
d1095 2
d1111 1
d1115 5
a1119 2
CHECK_SYMBOL_EXISTS(wmemcmp "wchar.h" HAVE_WMEMCMP)
CHECK_SYMBOL_EXISTS(wmemcpy "wchar.h" HAVE_WMEMCPY)
d1122 34
a1155 8
CHECK_SYMBOL_EXISTS(fseeko           "stdio.h"    HAVE_FSEEKO)
CHECK_SYMBOL_EXISTS(strerror_r       "string.h"   HAVE_STRERROR_R)
CHECK_SYMBOL_EXISTS(strftime         "time.h"     HAVE_STRFTIME)
CHECK_SYMBOL_EXISTS(vprintf          "stdio.h"    HAVE_VPRINTF)
CHECK_SYMBOL_EXISTS(cygwin_conv_path "sys/cygwin.h" HAVE_CYGWIN_CONV_PATH)

CHECK_SYMBOL_EXISTS(major            "sys/mkdev.h"     MAJOR_IN_MKDEV)
CHECK_SYMBOL_EXISTS(major            "sys/sysmacros.h" MAJOR_IN_SYSMACROS)
a1173 2
CHECK_SYMBOL_EXISTS(optarg           "unistd.h"   HAVE_DECL_OPTARG)
CHECK_SYMBOL_EXISTS(optind           "unistd.h"   HAVE_DECL_OPTIND)
d1184 10
d1217 6
a1230 1
# XXX There must be a way to make this simpler <sigh> XXXX
d1232 22
a1253 3
CHECK_TYPE_SIZE("long long int"            LONG_LONG_INT)
CHECK_TYPE_SIZE("unsigned long long"       UNSIGNED_LONG_LONG)
CHECK_TYPE_SIZE("unsigned long long int"   UNSIGNED_LONG_LONG_INT)
a1254 1
#
a1279 17
CHECK_TYPE_SIZE(int32_t    INT32_T)
IF(NOT HAVE_INT32_T)
  SET(int32_t "int")
ENDIF(NOT HAVE_INT32_T)
#
CHECK_TYPE_SIZE(int64_t     INT64_T)
IF(NOT HAVE_INT64_T)
  IF(WIN32)
    SET(int64_t __int64)
  ENDIF(WIN32)
ENDIF(NOT HAVE_INT64_T)
#
CHECK_TYPE_SIZE(intmax_t    INTMAX_T)
IF(NOT HAVE_INTMAX_T)
  SET(intmax_t "int64_t")
ENDIF(NOT HAVE_INTMAX_T)
#
a1329 22
CHECK_TYPE_SIZE(uint16_t    UINT16_T)
IF(NOT HAVE_UINT16_T)
  SET(uint16_t "unsigned short")
ENDIF(NOT HAVE_UINT16_T)
#
CHECK_TYPE_SIZE(uint32_t    UINT32_T)
IF(NOT HAVE_UINT32_T)
  SET(uint32_t "unsigned int")
ENDIF(NOT HAVE_UINT32_T)
#
CHECK_TYPE_SIZE(uint64_t    UINT64_T)
IF(NOT HAVE_UINT64_T)
  IF(WIN32)
    SET(uint64_t "unsigned __int64")
  ENDIF(WIN32)
ENDIF(NOT HAVE_UINT64_T)
#
CHECK_TYPE_SIZE(uintmax_t   UINTMAX_T)
IF(NOT HAVE_UINTMAX_T)
  SET(uintmax_t "uint64_t")
ENDIF(NOT HAVE_UINTMAX_T)
#
a1356 2


d1363 3
a1365 2
  CHECK_LIBRARY_EXISTS(attr "setxattr" "" HAVE_ATTR_LIB)
  IF(HAVE_ATTR_LIB)
d1367 2
a1368 1
  ENDIF(HAVE_ATTR_LIB)
d1373 2
d1381 34
d1426 2
a1427 2
  CHECK_LIBRARY_EXISTS(acl "acl_get_file" "" HAVE_ACL_LIB)
  IF(HAVE_ACL_LIB)
d1431 1
a1431 1
  ENDIF(HAVE_ACL_LIB)
d1445 6
a1450 4
  CHECK_SYMBOL_EXISTS(acl_get_perm "${INCLUDES}" HAVE_ACL_GET_PERM)
  CHECK_SYMBOL_EXISTS(acl_get_perm_np "${INCLUDES}" HAVE_ACL_GET_PERM_NP)
  CHECK_SYMBOL_EXISTS(acl_get_link "${INCLUDES}" HAVE_ACL_GET_LINK)
  CHECK_SYMBOL_EXISTS(acl_get_link_np "${INCLUDES}" HAVE_ACL_GET_LINK_NP)
d1455 15
d1472 16
d1513 1
a1513 1
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/libarchive)
a1517 6
# Especially for early development, we want to be a little
# aggressive about diagnosing build problems; this can get
# relaxed somewhat in final shipping versions.
IF ("CMAKE_C_COMPILER_ID" MATCHES "^GNU$")
  ADD_DEFINITIONS(-Wall -Werror)
ENDIF ("CMAKE_C_COMPILER_ID" MATCHES "^GNU$")
d1520 1
a1520 1
ADD_CUSTOM_TARGET(run_all_tests)
@


1.1.1.1
log
@Import libarchive 2.8.0:
- Infrastructure:
  - Allow command line tools as fallback for missing compression
    libraries. If compiled without gzip for example, gunzip will
    be used automatically.
  - Improved support for a number of platforms like high-resolution
    timestamps and Extended Attributes on various Unix systems
  - New convience interface for creating archives based on disk content,
    complement of the archive_write_disk interface.
- Frontends:
  - bsdcpio ready for public consumption
  - hand-written date parser replaces the yacc code
- Filter system:
  - Simplified read filter chains
  - Option support for filters
  - LZMA, XZ, uudecode handled
- Format support:
  - Write support for mtree files based on file system or archive
    content
  - Basic read support for Joliet
  - Write support for zip files
  - Write support for shar archives, both text-only and binary-safe
@
text
@@


1.1.1.2
log
@libarchive-2.8.2:
- Fix NULL deference for short self-extracting zip archives
- Don't dereference symlinks on Linux when reading ACLs
- Better detection of SHA2 support for old OpenSSL versions
- Fix parsing of input files for bsdtar -T
- Do not leak setup_xattr into the global namespace
- Fix build when an older libarchive is already installed
- Use O_BINARY opening files in bsdtar
- Include missing archive_crc32.h
- Correctly include iconv.h required by libxml2
@
text
@a347 1
  INCLUDE_DIRECTORIES(${ICONV_INCLUDE_DIR})
d728 1
a728 1
INCLUDE_DIRECTORIES(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/libarchive)
@


1.1.1.3
log
@Import libarchive-2.8.4:
- Improved reliability of hash function detection
- Fix issues on ancient FreeBSD, QNX, ancient NetBSD and Minix
@
text
@d208 2
a209 1
# Some FreeBSD headers assume sys/types.h was already included.
d214 1
d242 1
d269 2
d272 14
a285 1

d287 48
a334 167
# How to prove that HASH functions, which have several names on various
# platforms, can be mapped to archive_{hash name}_init,
# archive_{hash name}_update and archive_{hash name}_final through
# archive_hash.h
#
MACRO(CHECK_MD HASH IMPLEMENTATIONS)
    IF(HAVE_SYS_TYPES_H)
        SET(HASH_HEADER_CONFIG "#define HAVE_SYS_TYPES_H 1\n")
    ELSE(HAVE_SYS_TYPES_H)
        SET(HASH_HEADER_CONFIG "")
    ENDIF(HAVE_SYS_TYPES_H)

    FOREACH(IMPLEMENTATION ${IMPLEMENTATIONS})
      IF(NOT DEFINED ARCHIVE_HASH_${HASH}_${IMPLEMENTATION})
	STRING(TOLOWER "${HASH}" lower_hash)
	STRING(TOUPPER "${HASH}" hash)

	SET(HASH_REQUIRED_INCLUDES)
	SET(TRY_HASH_REQUIRED_INCLUDES
	  "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_CURRENT_SOURCE_DIR}/libarchive")
	SET(HASH_REQUIRED_LIBS)
	SET(TRY_HASH_REQUIRED_LIBS)
	IF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)
	    SET(HASH_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
	    SET(TRY_HASH_REQUIRED_INCLUDES
	      "${TRY_HASH_REQUIRED_INCLUDES};${OPENSSL_INCLUDE_DIR}")
	    SET(HASH_REQUIRED_LIBS ${OPENSSL_LIBRARIES})
	    SET(TRY_HASH_REQUIRED_LIBS
	        "-DLINK_LIBRARIES:STRING=${OPENSSL_LIBRARIES}")
	ENDIF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)

	SET(SOURCE "#define ${hash}_COMPILE_TEST
#define ARCHIVE_HASH_${hash}_${IMPLEMENTATION}
#define __LIBARCHIVE_BUILD
${HASH_HEADER_CONFIG}
#include \"archive_hash.h\"

int
main(int argc, char **argv)
{
	archive_${lower_hash}_ctx ctx;

	archive_${lower_hash}_init(&ctx);
	archive_${lower_hash}_update(&ctx, *argv, argc);
	archive_${lower_hash}_final(&ctx, *argv);
	return 0;
}
")

	FILE(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_hash_md.c" "${SOURCE}")
	MESSAGE(STATUS "Checking support for ARCHIVE_HASH_${HASH}_${IMPLEMENTATION}")

	TRY_COMPILE(ARCHIVE_HASH_${HASH}_${IMPLEMENTATION}
	  ${CMAKE_BINARY_DIR}
	  ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_hash_md.c
	  CMAKE_FLAGS
	   "${TRY_HASH_REQUIRED_LIBS}"
	   "${TRY_HASH_REQUIRED_INCLUDES}"
	  OUTPUT_VARIABLE OUTPUT)

	IF (ARCHIVE_HASH_${HASH}_${IMPLEMENTATION})
	    MESSAGE(STATUS "Checking support for ARCHIVE_HASH_${HASH}_${IMPLEMENTATION} -- found")
	    IF (HASH_REQUIRED_INCLUDES)
	        INCLUDE_DIRECTORIES(${HASH_REQUIRED_INCLUDES})
	    ENDIF (HASH_REQUIRED_INCLUDES)
	    IF (HASH_REQUIRED_LIBS)
	        LIST(APPEND ADDITIONAL_LIBS ${HASH_REQUIRED_LIBS})
	        LIST(REMOVE_DUPLICATES ADDITIONAL_LIBS)
	    ENDIF (HASH_REQUIRED_LIBS)
	    BREAK()
	ENDIF (ARCHIVE_HASH_${HASH}_${IMPLEMENTATION})

	MESSAGE(STATUS "Checking support for ARCHIVE_HASH_${HASH}_${IMPLEMENTATION} -- not found")
    	FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
    	    "Checking support for ARCHIVE_HASH_${HASH}_${IMPLEMENTATION} failed with the following output:\n"
    	    "${OUTPUT}\n"
    	    "Source file was:\n${SOURCE}\n")
      ELSE(NOT DEFINED ARCHIVE_HASH_${HASH}_${IMPLEMENTATION})
        IF(ARCHIVE_HASH_${HASH}_${IMPLEMENTATION})
           BREAK()
        ENDIF(ARCHIVE_HASH_${HASH}_${IMPLEMENTATION})
      ENDIF(NOT DEFINED ARCHIVE_HASH_${HASH}_${IMPLEMENTATION})
    ENDFOREACH(IMPLEMENTATION)
ENDMACRO(CHECK_MD HASH IMPLEMENTATIONS)

#
# HASH functions on Windows is defined at archive_windows.c, thus we do not
# need the test what the functions can be mapped to archive_{hash name}_init,
# archive_{hash name}_update and archive_{hash name}_final.
# The functions on Windows use CALG_{hash name} macro to create a crypt object
# and then we need to know what CALG_{hash name} macros is available to show
# ARCHIVE_HASH_{hash name}_WIN macros because Windows 2000 and earlier version
# of Windows XP do not support SHA256, SHA384 and SHA512.
#
MACRO(CHECK_HASH_WIN HASH_LIST)
  IF(WIN32 AND NOT CYGWIN)
    FOREACH(HASH ${HASH_LIST})
      IF(NOT DEFINED ARCHIVE_HASH_${HASH}_WIN)
	STRING(TOUPPER "${HASH}" hash)
	SET(ALGID "")
	IF ("${HASH}" MATCHES "^MD5$")
	    SET(ALGID "CALG_MD5")
	ENDIF ("${HASH}" MATCHES "^MD5$")
	IF ("${HASH}" MATCHES "^SHA1$")
	    SET(ALGID "CALG_SHA1")
	ENDIF ("${HASH}" MATCHES "^SHA1$")
	IF ("${HASH}" MATCHES "^SHA256$")
	    SET(ALGID "CALG_SHA_256")
	ENDIF ("${HASH}" MATCHES "^SHA256$")
	IF ("${HASH}" MATCHES "^SHA384$")
	    SET(ALGID "CALG_SHA_384")
	ENDIF ("${HASH}" MATCHES "^SHA384$")
	IF ("${HASH}" MATCHES "^SHA512$")
	    SET(ALGID "CALG_SHA_512")
	ENDIF ("${HASH}" MATCHES "^SHA512$")

	SET(SOURCE "#define ${hash}_COMPILE_TEST
#define _WIN32_WINNT ${_WIN32_WINNT}
#define WINVER ${WINVER}
#include <windows.h>
#include <wincrypt.h>

int
main(int argc, char **argv)
{
	return ${ALGID};
}
")
	SET(SOURCE_FILE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_hash_win.c")

	FILE(WRITE "${SOURCE_FILE}" "${SOURCE}")
	MESSAGE(STATUS "Checking support for ARCHIVE_HASH_${HASH}_WIN")

	TRY_COMPILE(ARCHIVE_HASH_${HASH}_WIN
	  ${CMAKE_BINARY_DIR}
	  ${SOURCE_FILE}
	  CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_CURRENT_SOURCE_DIR}/libarchive"
	  OUTPUT_VARIABLE OUTPUT)

	IF (ARCHIVE_HASH_${HASH}_WIN)
	    MESSAGE(STATUS
	        "Checking support for ARCHIVE_HASH_${HASH}_WIN -- found")
	ELSE (ARCHIVE_HASH_${HASH}_WIN)
	    MESSAGE(STATUS
	         "Checking support for ARCHIVE_HASH_${HASH}_WIN -- not found")
    	    FILE(APPEND
	        ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
                "Checking support for ARCHIVE_HASH_${HASH}_WIN failed with the following output:\n"
        	"${OUTPUT}\n"
        	"Source file was:\n${SOURCE}\n")
	ENDIF (ARCHIVE_HASH_${HASH}_WIN)

      ENDIF(NOT DEFINED ARCHIVE_HASH_${HASH}_WIN)
    ENDFOREACH(HASH)
  ENDIF(WIN32 AND NOT CYGWIN)
ENDMACRO(CHECK_HASH_WIN HASH_LIST)

#
# Check MD5/RMD160/SHA support
#
CHECK_MD(MD5 "LIBC;LIBSYSTEM;OPENSSL")
CHECK_MD(RMD160 "LIBC;OPENSSL")
CHECK_MD(SHA1 "LIBC;LIBSYSTEM;OPENSSL")
CHECK_MD(SHA256 "LIBC;LIBC2;LIBC3;LIBSYSTEM;OPENSSL")
CHECK_MD(SHA384 "LIBC;LIBC2;LIBC3;LIBSYSTEM;OPENSSL")
CHECK_MD(SHA512 "LIBC;LIBC2;LIBC3;LIBSYSTEM;OPENSSL")
CHECK_HASH_WIN("MD5;SHA1;SHA256;SHA384;SHA512")
a384 4
CHECK_FUNCTION_EXISTS_GLIBC(getgrgid_r HAVE_GETGRGID_R)
CHECK_FUNCTION_EXISTS_GLIBC(getgrnam_r HAVE_GETGRNAM_R)
CHECK_FUNCTION_EXISTS_GLIBC(getpwnam_r HAVE_GETPWNAM_R)
CHECK_FUNCTION_EXISTS_GLIBC(getpwuid_r HAVE_GETPWUID_R)
a417 1
CHECK_FUNCTION_EXISTS_GLIBC(wcscmp HAVE_WCSCMP)
a649 1
  LA_CHECK_INCLUDE_FILE(sys/extattr.h      HAVE_SYS_EXTATTR_H)
a653 1
  CHECK_SYMBOL_EXISTS(EXTATTR_NAMESPACE_USER "sys/types.h;sys/extattr.h" HAVE_DECL_EXTATTR_NAMESPACE_USER)
@


1.1.1.4
log
@Import libarchive-3.2.1:
- security fixes and other bugfixes
- support for multhreading in xz 5.2+
@
text
@a1 1
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12 FATAL_ERROR)
d5 1
a9 31
#
# Set the Build type for make based generators.
# You can choose following types:
#   Debug          : Debug build
#   Release        : Release build
#   RelWithDebInfo : Release build with Debug Info
#   MinSizeRel     : Release Min Size build
IF(NOT CMAKE_BUILD_TYPE)
  SET(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build Type" FORCE)
ENDIF(NOT CMAKE_BUILD_TYPE)
# Set a value type to properly display CMAKE_BUILD_TYPE on GUI if the
# value type is "UNINITIALIZED".
GET_PROPERTY(cached_type CACHE CMAKE_BUILD_TYPE PROPERTY TYPE)
IF("${cached_type}" STREQUAL "UNINITIALIZED")
  SET(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING "Build Type" FORCE)
ENDIF("${cached_type}" STREQUAL "UNINITIALIZED")
# Check the Build Type.
IF(NOT "${CMAKE_BUILD_TYPE}"
       MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel)\$")
  MESSAGE(FATAL_ERROR
          "Unknown keyword for CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}\n"
          "Acceptable keywords: Debug,Release,RelWithDebInfo,MinSizeRel")
ENDIF(NOT "${CMAKE_BUILD_TYPE}"
          MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel)\$")

# On MacOS, prefer MacPorts libraries to system libraries.
# I haven't come up with a compelling argument for this to be conditional.
list(APPEND CMAKE_PREFIX_PATH /opt/local)
# Enable @@rpath in the install name.
# detail in "cmake  --help-policy CMP0042"
SET(CMAKE_MACOSX_RPATH ON)
d24 2
a25 2
STRING(REGEX REPLACE "[0]*([^0]*[0-9])$" "\\1" _trimmed_minor ${_minor})
STRING(REGEX REPLACE "[0]*([^0]*[0-9])$" "\\1" _trimmed_revision ${_revision})
d27 1
a27 1
SET(VERSION                    "${_major}.${_trimmed_minor}.${_trimmed_revision}${_quality}")
a29 1
SET(BSDCAT_VERSION_STRING      "${VERSION}")
d32 2
a33 112

# INTERFACE_VERSION increments with every release
# libarchive 2.7 == interface version 9 = 2 + 7
# libarchive 2.8 == interface version 10 = 2 + 8
# libarchive 2.9 == interface version 11 = 2 + 9
# libarchive 3.0 == interface version 12
# libarchive 3.1 == interface version 13
math(EXPR INTERFACE_VERSION  "13 + ${_minor}")

# Set SOVERSION == Interface version
# ?? Should there be more here ??
SET(SOVERSION "${INTERFACE_VERSION}")

# Enalbe CMAKE_PUSH_CHECK_STATE() and CMAKE_POP_CHECK_STATE() macros
# saving and restoring the state of the variables.
INCLUDE(CMakePushCheckState)

# Initialize the state of the variables. This initialization is not
# necessary but this shows you what value the variables initially have.
SET(CMAKE_REQUIRED_DEFINITIONS)
SET(CMAKE_REQUIRED_INCLUDES)
SET(CMAKE_REQUIRED_LIBRARIES)
SET(CMAKE_REQUIRED_FLAGS)

# Especially for early development, we want to be a little
# aggressive about diagnosing build problems; this can get
# relaxed somewhat in final shipping versions.
IF (CMAKE_C_COMPILER_ID MATCHES "^GNU$")
  SET(CMAKE_REQUIRED_FLAGS "-Wall -Wformat -Wformat-security")
  #################################################################
  # Set compile flags for all build types.
  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wformat -Wformat-security")
  #################################################################
  # Set compile flags for debug build.
  # This is added into CMAKE_C_FLAGS when CMAKE_BUILD_TYPE is "Debug"
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Werror")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wextra")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wunused")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wshadow")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wmissing-prototypes")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wcast-qual")
ENDIF (CMAKE_C_COMPILER_ID MATCHES "^GNU$")
IF (CMAKE_C_COMPILER_ID MATCHES "^Clang$")
  SET(CMAKE_REQUIRED_FLAGS "-Wall -Wformat -Wformat-security")
  #################################################################
  # Set compile flags for all build types.
  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wformat -Wformat-security")
  #################################################################
  # Set compile flags for debug build.
  # This is added into CMAKE_C_FLAGS when CMAKE_BUILD_TYPE is "Debug"
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Werror")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wextra")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wunused")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wshadow")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wmissing-prototypes")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wcast-qual")
ENDIF (CMAKE_C_COMPILER_ID MATCHES "^Clang$")
IF (CMAKE_C_COMPILER_ID MATCHES "^XL$")
  SET(CMAKE_C_COMPILER "xlc_r")
  SET(CMAKE_REQUIRED_FLAGS "-qflag=e:e -qformat=sec")
  #################################################################
  # Set compile flags for all build types.
  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -qflag=e:e -qformat=sec")
  #################################################################
  # Set compile flags for debug build.
  # This is added into CMAKE_C_FLAGS when CMAKE_BUILD_TYPE is "Debug"
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -qhalt=w")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -qflag=w:w")
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -qinfo=pro:use")
ENDIF(CMAKE_C_COMPILER_ID MATCHES "^XL$")
IF (MSVC)
  #################################################################
  # Set compile flags for debug build.
  # This is added into CMAKE_C_FLAGS when CMAKE_BUILD_TYPE is "Debug"
  # Enable level 4 C4061: The enumerate has no associated handler in a switch
  #                       statement.
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4061")
  # Enable level 4 C4254: A larger bit field was assigned to a smaller bit
  #                       field.
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4254")
  # Enable level 4 C4295: An array was initialized but the last character in
  #                       the array is not a null; accessing the array may
  #                       produce unexpected results.
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4295")
  # Enable level 4 C4296: An unsigned variable was used in a comparison
  #                       operation with zero.
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4296")
  # Enable level 4 C4389: An operation involved signed and unsigned variables.
  #                       This could result in a loss of data.
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4389")
  # Enable level 4 C4505: The given function is local and not referenced in
  #                       the body of the module; therefore, the function is
  #                       dead code.
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4505")
  # Enable level 4 C4514: The optimizer removed an inline function that is not
  #                       called.
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4514")
  # Enable level 4 C4702: Unreachable code.
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4702")
  # Enable level 4 C4706: The test value in a conditional expression was the
  #                       result of an assignment.
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /we4706")
  # /WX option is the same as gcc's -Werror option.
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /WX")
  # /Oi option enables built-in functions.
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /Oi")
  #################################################################
  # Set compile flags for release build.
  SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Oi")
ENDIF (MSVC)
d38 4
a41 1
OPTION(ENABLE_NETTLE "Enable use of Nettle" ON)
a42 10
OPTION(ENABLE_LZMA "Enable the use of the system found LZMA library if found" ON)
OPTION(ENABLE_ZLIB "Enable the use of the system found ZLIB library if found" ON)
OPTION(ENABLE_BZip2 "Enable the use of the system found BZip2 library if found" ON)
OPTION(ENABLE_LIBXML2 "Enable the use of the system found libxml2 library if found" ON)
OPTION(ENABLE_EXPAT "Enable the use of the system found EXPAT library if found" ON)
OPTION(ENABLE_PCREPOSIX "Enable the use of the system found PCREPOSIX library if found" ON)
OPTION(ENABLE_LibGCC "Enable the use of the system found LibGCC library if found" ON)
# CNG is used for encrypt/decrypt Zip archives on Windows.
OPTION(ENABLE_CNG "Enable the use of CNG(Crypto Next Generation)" ON)

d44 1
a44 1
OPTION(ENABLE_TAR_SHARED "Enable dynamic build of tar" FALSE)
d46 1
a46 3
OPTION(ENABLE_CPIO_SHARED "Enable dynamic build of cpio" FALSE)
OPTION(ENABLE_CAT "Enable cat building" ON)
OPTION(ENABLE_CAT_SHARED "Enable dynamic build of cat" FALSE)
a48 1
OPTION(ENABLE_ICONV "Enable iconv support" ON)
a49 10
OPTION(ENABLE_COVERAGE "Enable code coverage (GCC only, automatically sets ENABLE_TEST to ON)" FALSE)
OPTION(ENABLE_INSTALL "Enable installing of libraries" ON)

SET(POSIX_REGEX_LIB "AUTO" CACHE STRING "Choose what library should provide POSIX regular expression support")
SET(ENABLE_SAFESEH "AUTO" CACHE STRING "Enable use of /SAFESEH linker flag (MSVC only)")
SET(WINDOWS_VERSION "WIN7" CACHE STRING "Set Windows version to use (Windows only)")

IF(ENABLE_COVERAGE)
	include(LibarchiveCodeCoverage)
ENDIF(ENABLE_COVERAGE)
d54 5
d61 2
a62 30
  IF(WINDOWS_VERSION STREQUAL "WIN8")
    SET(NTDDI_VERSION 0x06020000)
    SET(_WIN32_WINNT 0x0602)
    SET(WINVER 0x0602)
  ELSEIF(WINDOWS_VERSION STREQUAL "WIN7")
    SET(NTDDI_VERSION 0x06010000)
    SET(_WIN32_WINNT 0x0601)
    SET(WINVER 0x0601)
  ELSEIF(WINDOWS_VERSION STREQUAL "WS08")
    SET(NTDDI_VERSION 0x06000100)
    SET(_WIN32_WINNT 0x0600)
    SET(WINVER 0x0600)
  ELSEIF(WINDOWS_VERSION STREQUAL "VISTA")
    SET(NTDDI_VERSION 0x06000000)
    SET(_WIN32_WINNT 0x0600)
    SET(WINVER 0x0600)
  ELSEIF(WINDOWS_VERSION STREQUAL "WS03")
    SET(NTDDI_VERSION 0x05020000)
    SET(_WIN32_WINNT 0x0502)
    SET(WINVER 0x0502)
  ELSEIF(WINDOWS_VERSION STREQUAL "WINXP")
    SET(NTDDI_VERSION 0x05010000)
    SET(_WIN32_WINNT 0x0501)
    SET(WINVER 0x0501)
  ELSE(WINDOWS_VERSION STREQUAL "WIN8")
    # Default to Windows Server 2003 API if we don't recognize the specifier
    SET(NTDDI_VERSION 0x05020000)
    SET(_WIN32_WINNT 0x0502)
    SET(WINVER 0x0502)
  ENDIF(WINDOWS_VERSION STREQUAL "WIN8")
a64 18
IF(MSVC)
  IF(ENABLE_SAFESEH STREQUAL "YES")
    SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH")
    SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SAFESEH")
    SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /SAFESEH")
    SET(ENV{LDFLAGS} "$ENV{LDFLAGS} /SAFESEH")
  ELSEIF(ENABLE_SAFESEH STREQUAL "NO")
    SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO")
    SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SAFESEH:NO")
    SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /SAFESEH:NO")
    SET(ENV{LDFLAGS} "$ENV{LDFLAGS} /SAFESEH:NO")
  ENDIF(ENABLE_SAFESEH STREQUAL "YES")
ENDIF(MSVC)

IF("${CMAKE_C_PLATFORM_ID}" MATCHES "^(HP-UX)$")
  ADD_DEFINITIONS(-D_XOPEN_SOURCE=500) # Ask wchar.h for mbstate_t
ENDIF()

a65 1
INCLUDE(CheckCSourceCompiles)
d111 1
a111 32
#
# Find out what macro is needed to use libraries on Windows.
#
MACRO (TRY_MACRO_FOR_LIBRARY INCLUDES LIBRARIES
       TRY_TYPE SAMPLE_SOURCE MACRO_LIST)
  IF(WIN32 AND NOT CYGWIN)
    CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
    SET(CMAKE_REQUIRED_INCLUDES ${INCLUDES})
    SET(CMAKE_REQUIRED_LIBRARIES ${LIBRARIES})
    FOREACH(VAR ${MACRO_LIST})
      # Clear ${VAR} from CACHE If the libraries which ${VAR} was
      # checked with are changed.
      SET(VAR_WITH_LIB "${VAR}_WITH_LIB")
      GET_PROPERTY(PREV_VAR_WITH_LIB VARIABLE PROPERTY ${VAR_WITH_LIB})
      IF(NOT "${PREV_VAR_WITH_LIB}" STREQUAL "${LIBRARIES}")
        UNSET(${VAR} CACHE)
      ENDIF(NOT "${PREV_VAR_WITH_LIB}" STREQUAL "${LIBRARIES}")
      # Check if the library can be used with the macro.
      IF("${TRY_TYPE}" MATCHES "COMPILES")
        CHECK_C_SOURCE_COMPILES("${SAMPLE_SOURCE}" ${VAR})
      ELSEIF("${TRY_TYPE}" MATCHES "RUNS")
        CHECK_C_SOURCE_RUNS("${SAMPLE_SOURCE}" ${VAR})
      ELSE("${TRY_TYPE}" MATCHES "COMPILES")
        MESSAGE(FATAL_ERROR "UNKNOWN KEYWORD \"${TRY_TYPE}\" FOR TRY_TYPE")
      ENDIF("${TRY_TYPE}" MATCHES "COMPILES")
      # Save the libraries which ${VAR} is checked with.
      SET(${VAR_WITH_LIB} "${LIBRARIES}" CACHE INTERNAL
          "Macro ${VAR} is checked with")
    ENDFOREACH(VAR)
    CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
  ENDIF(WIN32 AND NOT CYGWIN)
ENDMACRO (TRY_MACRO_FOR_LIBRARY)
d133 1
a133 1
  # If compiling error occurred in zconf.h, You may need patch to zconf.h.
d137 1
a137 1
  #
d151 1
a151 5
IF(ENABLE_ZLIB)
  FIND_PACKAGE(ZLIB)
ELSE()
  SET(ZLIB_FOUND FALSE) # Override cached value
ENDIF()
a156 23
  IF(WIN32 AND NOT CYGWIN)
    #
    # Test if ZLIB_WINAPI macro is needed to use.
    #
    TRY_MACRO_FOR_LIBRARY(
      "${ZLIB_INCLUDE_DIR}" "${ZLIB_LIBRARIES}"
      RUNS
      "#include <zlib.h>\nint main() {uLong f = zlibCompileFlags(); return (f&(1U<<10))?0:-1; }"
      ZLIB_WINAPI)
    IF(ZLIB_WINAPI)
      ADD_DEFINITIONS(-DZLIB_WINAPI)
    ELSE(ZLIB_WINAPI)
      # Test if a macro is needed for the library.
      TRY_MACRO_FOR_LIBRARY(
        "${ZLIB_INCLUDE_DIR}" "${ZLIB_LIBRARIES}"
        COMPILES
        "#include <zlib.h>\nint main() {return zlibVersion()?1:0; }"
        "ZLIB_DLL;WITHOUT_ZLIB_DLL")
      IF(ZLIB_DLL)
        ADD_DEFINITIONS(-DZLIB_DLL)
      ENDIF(ZLIB_DLL)
    ENDIF(ZLIB_WINAPI)
  ENDIF(WIN32 AND NOT CYGWIN)
d163 1
a163 5
IF(ENABLE_BZip2)
  FIND_PACKAGE(BZip2)
ELSE()
  SET(BZIP2_FOUND FALSE) # Override cached value
ENDIF()
a168 11
  # Test if a macro is needed for the library.
  TRY_MACRO_FOR_LIBRARY(
    "${BZIP2_INCLUDE_DIR}" "${BZIP2_LIBRARIES}"
    COMPILES
    "#include <bzlib.h>\nint main() {return BZ2_bzlibVersion()?1:0; }"
    "USE_BZIP2_DLL;USE_BZIP2_STATIC")
  IF(USE_BZIP2_DLL)
    ADD_DEFINITIONS(-DUSE_BZIP2_DLL)
  ELSEIF(USE_BZIP2_STATIC)
    ADD_DEFINITIONS(-DUSE_BZIP2_STATIC)
  ENDIF(USE_BZIP2_DLL)
d171 1
a171 3
MARK_AS_ADVANCED(CLEAR BZIP2_LIBRARIES)


d175 1
a175 7
IF(ENABLE_LZMA)
  FIND_PACKAGE(LZMA)
ELSE()
  SET(LZMA_FOUND FALSE) # Override cached value
  SET(LZMADEC_FOUND FALSE) # Override cached value
ENDIF()

d181 2
a182 9
  # Test if a macro is needed for the library.
  TRY_MACRO_FOR_LIBRARY(
    "${LZMA_INCLUDE_DIR}" "${LZMA_LIBRARIES}"
    COMPILES
    "#include <lzma.h>\nint main() {return (int)lzma_version_number(); }"
    "WITHOUT_LZMA_API_STATIC;LZMA_API_STATIC")
  IF(NOT WITHOUT_LZMA_API_STATIC AND LZMA_API_STATIC)
    ADD_DEFINITIONS(-DLZMA_API_STATIC)
  ENDIF(NOT WITHOUT_LZMA_API_STATIC AND LZMA_API_STATIC)
d188 2
d191 2
a192 1
# LZMA not found and will not be used.
a193 51
#
# Find LZO2
#
IF (LZO2_INCLUDE_DIR)
  # Already in cache, be silent
  SET(LZO2_FIND_QUIETLY TRUE)
ENDIF (LZO2_INCLUDE_DIR)

FIND_PATH(LZO2_INCLUDE_DIR lzo/lzoconf.h)
FIND_LIBRARY(LZO2_LIBRARY NAMES lzo2 liblzo2)
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LZO2 DEFAULT_MSG LZO2_LIBRARY LZO2_INCLUDE_DIR)
IF(LZO2_FOUND)
  SET(HAVE_LIBLZO2 1)
  SET(HAVE_LZO_LZOCONF_H 1)
  SET(HAVE_LZO_LZO1X_H 1)
  INCLUDE_DIRECTORIES(${LZO2_INCLUDE_DIR})
  LIST(APPEND ADDITIONAL_LIBS ${LZO2_LIBRARY})
  #
  # TODO: test for static library.
  #
ENDIF(LZO2_FOUND)
MARK_AS_ADVANCED(CLEAR LZO2_INCLUDE_DIR)
MARK_AS_ADVANCED(CLEAR LZO2_LIBRARY)
#
# Find LZ4
#
IF (LZ4_INCLUDE_DIR)
  # Already in cache, be silent
  SET(LZ4_FIND_QUIETLY TRUE)
ENDIF (LZ4_INCLUDE_DIR)

FIND_PATH(LZ4_INCLUDE_DIR lz4.h)
FIND_LIBRARY(LZ4_LIBRARY NAMES lz4 liblz4)
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LZ4 DEFAULT_MSG LZ4_LIBRARY LZ4_INCLUDE_DIR)
IF(LZ4_FOUND)
  SET(HAVE_LIBLZ4 1)
  SET(HAVE_LZ4_H 1)
  CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
  SET(CMAKE_REQUIRED_INCLUDES ${LZ4_INCLUDE_DIR})
  CHECK_INCLUDE_FILES("lz4hc.h" HAVE_LZ4HC_H)
  CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
  INCLUDE_DIRECTORIES(${LZ4_INCLUDE_DIR})
  LIST(APPEND ADDITIONAL_LIBS ${LZ4_LIBRARY})
  #
  # TODO: test for static library.
  #
ENDIF(LZ4_FOUND)
MARK_AS_ADVANCED(CLEAR LZ4_INCLUDE_DIR)
MARK_AS_ADVANCED(CLEAR LZ4_LIBRARY)
a213 1
LA_CHECK_INCLUDE_FILE("copyfile.h" HAVE_COPYFILE_H)
a217 5

CHECK_C_SOURCE_COMPILES("#include <sys/ioctl.h>
#include <ext2fs/ext2_fs.h>
int main(void) { return EXT2_IOC_GETFLAGS; }" HAVE_WORKING_EXT2_IOC_GETFLAGS)

a223 2
LA_CHECK_INCLUDE_FILE("linux/types.h" HAVE_LINUX_TYPES_H)
LA_CHECK_INCLUDE_FILE("linux/fiemap.h" HAVE_LINUX_FIEMAP_H)
a224 1
LA_CHECK_INCLUDE_FILE("linux/magic.h" HAVE_LINUX_MAGIC_H)
a229 1
LA_CHECK_INCLUDE_FILE("pthread.h" HAVE_PTHREAD_H)
a230 1
LA_CHECK_INCLUDE_FILE("readpassphrase.h" HAVE_READPASSPHRASE_H)
a232 1
LA_CHECK_INCLUDE_FILE("spawn.h" HAVE_SPAWN_H)
a241 1
LA_CHECK_INCLUDE_FILE("sys/mount.h" HAVE_SYS_MOUNT_H)
a245 2
LA_CHECK_INCLUDE_FILE("sys/statfs.h" HAVE_SYS_STATFS_H)
LA_CHECK_INCLUDE_FILE("sys/statvfs.h" HAVE_SYS_STATVFS_H)
a247 2
LA_CHECK_INCLUDE_FILE("sys/utsname.h" HAVE_SYS_UTSNAME_H)
LA_CHECK_INCLUDE_FILE("sys/vfs.h" HAVE_SYS_VFS_H)
d255 5
a259 46
IF(ENABLE_CNG)
  LA_CHECK_INCLUDE_FILE("Bcrypt.h" HAVE_BCRYPT_H)
ELSE(ENABLE_CNG)
  UNSET(HAVE_BCRYPT_H CACHE)
ENDIF(ENABLE_CNG)
# Following files need windwos.h, so we should test it after windows.h test.
LA_CHECK_INCLUDE_FILE("wincrypt.h" HAVE_WINCRYPT_H)
LA_CHECK_INCLUDE_FILE("winioctl.h" HAVE_WINIOCTL_H)

#
# Check whether use of __EXTENSIONS__ is safe.
# We need some macro such as _GNU_SOURCE to use extension functions.
#
SET(_INCLUDE_FILES)
FOREACH (it ${_HEADER})
   SET(_INCLUDE_FILES "${_INCLUDE_FILES}#include <${it}>\n")
ENDFOREACH (it)

CHECK_C_SOURCE_COMPILES(
  "#define __EXTENSIONS__ 1
   ${_INCLUDE_FILES}
   int main() { return 0;}"
 SAFE_TO_DEFINE_EXTENSIONS)

#
# Find Nettle
#
IF(ENABLE_NETTLE)
  FIND_PACKAGE(Nettle)
  IF(NETTLE_FOUND)
    SET(HAVE_LIBNETTLE 1)
    LIST(APPEND ADDITIONAL_LIBS ${NETTLE_LIBRARIES})
    INCLUDE_DIRECTORIES(${NETTLE_INCLUDE_DIR})

    LIST(APPEND CMAKE_REQUIRED_INCLUDES ${NETTLE_INCLUDE_DIR})
    LA_CHECK_INCLUDE_FILE("nettle/aes.h" HAVE_NETTLE_AES_H)
    LA_CHECK_INCLUDE_FILE("nettle/hmac.h" HAVE_NETTLE_HMAC_H)
    LA_CHECK_INCLUDE_FILE("nettle/md5.h" HAVE_NETTLE_MD5_H)
    LA_CHECK_INCLUDE_FILE("nettle/pbkdf2.h" HAVE_NETTLE_PBKDF2_H)
    LA_CHECK_INCLUDE_FILE("nettle/ripemd160.h" HAVE_NETTLE_RIPEMD160_H)
    LA_CHECK_INCLUDE_FILE("nettle/sha.h" HAVE_NETTLE_SHA_H)

  ENDIF(NETTLE_FOUND)
  MARK_AS_ADVANCED(CLEAR NETTLE_INCLUDE_DIR)
  MARK_AS_ADVANCED(CLEAR NETTLE_LIBRARIES)
ENDIF(ENABLE_NETTLE)
a262 1
# (Except on Mac, where OpenSSL is deprecated.)
d264 1
a264 1
IF(ENABLE_OPENSSL AND NOT CMAKE_SYSTEM_NAME MATCHES "Darwin")
a265 7
  IF(OPENSSL_FOUND)
    SET(HAVE_LIBCRYPTO 1)
    INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR})
    LIST(APPEND ADDITIONAL_LIBS ${OPENSSL_CRYPTO_LIBRARY})
  ENDIF(OPENSSL_FOUND)
ELSE()
  SET(OPENSSL_FOUND FALSE) # Override cached value
d268 23
a290 34
# FreeBSD libmd
IF(NOT OPENSSL_FOUND)
  CHECK_LIBRARY_EXISTS(md "MD5Init" "" LIBMD_FOUND)
  IF(LIBMD_FOUND)
    CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
    SET(CMAKE_REQUIRED_LIBRARIES "md")
    FIND_LIBRARY(LIBMD_LIBRARY NAMES md)
    LIST(APPEND ADDITIONAL_LIBS ${LIBMD_LIBRARY})
    CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
  ENDIF(LIBMD_FOUND)
ENDIF(NOT OPENSSL_FOUND)

#
# How to prove that CRYPTO functions, which have several names on various
# platforms, just see if archive_digest.c can compile and link against
# required libraries.
#
MACRO(CHECK_CRYPTO ALGORITHMS IMPLEMENTATION)
    FOREACH(ALGORITHM ${ALGORITHMS})
      IF(NOT ARCHIVE_CRYPTO_${ALGORITHM})
      STRING(TOLOWER "${ALGORITHM}" lower_algorithm)
      STRING(TOUPPER "${ALGORITHM}" algorithm)
      IF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND NOT OPENSSL_FOUND)
        SET(ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} FALSE)
      ELSEIF("${IMPLEMENTATION}" MATCHES "^NETTLE$" AND NOT NETTLE_FOUND)
        SET(ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} FALSE)
      ENDIF("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND NOT OPENSSL_FOUND)

      IF(NOT DEFINED ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
        # Probe the local implementation for whether this
	# crypto implementation is available on this platform.
	SET(TRY_CRYPTO_REQUIRED_INCLUDES
	  "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}/libarchive;${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp")
	SET(TRY_CRYPTO_REQUIRED_LIBS)
d292 5
a296 3
	    SET(TRY_CRYPTO_REQUIRED_INCLUDES
	      "${TRY_CRYPTO_REQUIRED_INCLUDES};${OPENSSL_INCLUDE_DIR}")
	    SET(TRY_CRYPTO_REQUIRED_LIBS
d298 1
a298 22
	ELSEIF("${IMPLEMENTATION}" MATCHES "^NETTLE$" AND NETTLE_FOUND)
	    SET(TRY_CRYPTO_REQUIRED_INCLUDES
	      "${TRY_CRYPTO_REQUIRED_INCLUDES};${NETTLE_INCLUDE_DIR}")
	    SET(TRY_CRYPTO_REQUIRED_LIBS
	        "-DLINK_LIBRARIES:STRING=${NETTLE_LIBRARY}")
	ELSEIF("${IMPLEMENTATION}" MATCHES "^LIBMD$" AND LIBMD_FOUND)
	    SET(TRY_CRYPTO_REQUIRED_LIBS
	        "-DLINK_LIBRARIES:STRING=${LIBMD_LIBRARY}")
	ENDIF("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)

    CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/build/cmake/config.h.in
      ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/confdefs.h)
	FILE(READ "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/confdefs.h"
	     CONFDEFS_H)
	FILE(READ "${CMAKE_CURRENT_SOURCE_DIR}/libarchive/archive_digest.c"
	     ARCHIVE_CRYPTO_C)

	SET(SOURCE "${CONFDEFS_H}

#define ARCHIVE_${algorithm}_COMPILE_TEST
#define ARCHIVE_CRYPTO_${algorithm}_${IMPLEMENTATION}
#define PLATFORM_CONFIG_H \"check_crypto_md.h\"
d300 5
a304 1
${ARCHIVE_CRYPTO_C}
d309 6
a314 5
  archive_${lower_algorithm}_ctx ctx;
  archive_${lower_algorithm}_init(&ctx);
  archive_${lower_algorithm}_update(&ctx, *argv, argc);
  archive_${lower_algorithm}_final(&ctx, NULL);
  return 0;
d318 2
a319 3
  FILE(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_crypto_md.h" "")
	FILE(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_crypto_md.c" "${SOURCE}")
	MESSAGE(STATUS "Checking support for ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION}")
d321 1
a321 1
	TRY_COMPILE(ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION}
d323 1
a323 1
	  ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_crypto_md.c
d325 2
a326 2
	   "${TRY_CRYPTO_REQUIRED_LIBS}"
	   "${TRY_CRYPTO_REQUIRED_INCLUDES}"
d329 15
a343 8
	# Inform user whether or not we found it; if not, log why we didn't.
        IF (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
          MESSAGE(STATUS "Checking support for ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} -- found")
		  SET(ARCHIVE_CRYPTO_${ALGORITHM} 1)
        ELSE (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
          MESSAGE(STATUS "Checking support for ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} -- not found")
          FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
    	    "Checking support for ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} failed with the following output:\n"
d346 7
a352 2
        ENDIF (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
      ENDIF(NOT DEFINED ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
d354 7
a360 20
      # Add appropriate libs/includes depending on whether the implementation
      # was found on this platform.
      IF (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
        IF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)
          INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR})
	  LIST(APPEND ADDITIONAL_LIBS ${OPENSSL_LIBRARIES})
	   LIST(REMOVE_DUPLICATES ADDITIONAL_LIBS)
        ENDIF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)
      ENDIF (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
      ENDIF(NOT ARCHIVE_CRYPTO_${ALGORITHM})
    ENDFOREACH(ALGORITHM ${ALGORITHMS})
ENDMACRO(CHECK_CRYPTO ALGORITHMS IMPLEMENTATION)

#
# CRYPTO functions on Windows is defined at archive_windows.c, thus we do not
# need the test what the functions can be mapped to archive_{crypto name}_init,
# archive_{crypto name}_update and archive_{crypto name}_final.
# The functions on Windows use CALG_{crypto name} macro to create a crypt object
# and then we need to know what CALG_{crypto name} macros is available to show
# ARCHIVE_CRYPTO_{crypto name}_WIN macros because Windows 2000 and earlier version
d363 1
a363 1
MACRO(CHECK_CRYPTO_WIN CRYPTO_LIST)
d365 3
a367 4
    FOREACH(CRYPTO ${CRYPTO_LIST})
      IF(NOT ARCHIVE_CRYPTO_${CRYPTO})
      IF(NOT DEFINED ARCHIVE_CRYPTO_${CRYPTO}_WIN)
	STRING(TOUPPER "${CRYPTO}" crypto)
d369 1
a369 1
	IF ("${CRYPTO}" MATCHES "^MD5$")
d371 2
a372 2
	ENDIF ("${CRYPTO}" MATCHES "^MD5$")
	IF ("${CRYPTO}" MATCHES "^SHA1$")
d374 2
a375 2
	ENDIF ("${CRYPTO}" MATCHES "^SHA1$")
	IF ("${CRYPTO}" MATCHES "^SHA256$")
d377 2
a378 2
	ENDIF ("${CRYPTO}" MATCHES "^SHA256$")
	IF ("${CRYPTO}" MATCHES "^SHA384$")
d380 2
a381 2
	ENDIF ("${CRYPTO}" MATCHES "^SHA384$")
	IF ("${CRYPTO}" MATCHES "^SHA512$")
d383 1
a383 8
	ENDIF ("${CRYPTO}" MATCHES "^SHA512$")

    CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/build/cmake/config.h.in
      ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/confdefs.h)
	FILE(READ "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/confdefs.h"
	     CONFDEFS_H)

	SET(SOURCE "${CONFDEFS_H}
d385 3
a387 1
#define ${crypto}_COMPILE_TEST
d397 1
a397 1
	SET(SOURCE_FILE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_crypto_win.c")
d400 1
a400 1
	MESSAGE(STATUS "Checking support for ARCHIVE_CRYPTO_${CRYPTO}_WIN")
d402 1
a402 1
	TRY_COMPILE(ARCHIVE_CRYPTO_${CRYPTO}_WIN
d405 1
a405 1
	  CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}/libarchive"
d408 1
a408 1
	IF (ARCHIVE_CRYPTO_${CRYPTO}_WIN)
d410 2
a411 3
	        "Checking support for ARCHIVE_CRYPTO_${CRYPTO}_WIN -- found")
		SET(ARCHIVE_CRYPTO_${CRYPTO} 1)
	ELSE (ARCHIVE_CRYPTO_${CRYPTO}_WIN)
d413 1
a413 1
	         "Checking support for ARCHIVE_CRYPTO_${CRYPTO}_WIN -- not found")
d416 1
a416 1
                "Checking support for ARCHIVE_CRYPTO_${CRYPTO}_WIN failed with the following output:\n"
d419 1
a419 1
	ENDIF (ARCHIVE_CRYPTO_${CRYPTO}_WIN)
d421 2
a422 3
      ENDIF(NOT DEFINED ARCHIVE_CRYPTO_${CRYPTO}_WIN)
      ENDIF(NOT ARCHIVE_CRYPTO_${CRYPTO})
    ENDFOREACH(CRYPTO)
d424 1
a424 1
ENDMACRO(CHECK_CRYPTO_WIN CRYPTO_LIST)
d427 9
a435 139
# Find iconv
# POSIX defines the second arg as const char **
# and requires it to be in libc.  But we can accept
# a non-const argument here and can support iconv()
# being in libiconv.
#
MACRO(CHECK_ICONV LIB TRY_ICONV_CONST)
  IF(NOT HAVE_ICONV)
    CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
    IF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR
        CMAKE_C_COMPILER_ID MATCHES "^Clang$")
      #
      # During checking iconv proto type, we should use -Werror to avoid the
      # success of iconv detection with a warnig which success is a miss
      # detection. So this needs for all build mode(even it's a release mode).
      #
      SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Werror")
    ENDIF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR
           CMAKE_C_COMPILER_ID MATCHES "^Clang$")
    IF (CMAKE_C_COMPILER_ID MATCHES "^XL$")
      SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -qhalt=w -qflag=w:w")
    ENDIF (CMAKE_C_COMPILER_ID MATCHES "^XL$")
    IF (MSVC)
      # NOTE: /WX option is the same as gcc's -Werror option.
      SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} /WX")
    ENDIF (MSVC)
    #
    CHECK_C_SOURCE_COMPILES(
      "#include <stdlib.h>
       #include <iconv.h>
       int main() {
          ${TRY_ICONV_CONST} char *ccp;
          iconv_t cd = iconv_open(\"\", \"\");
          iconv(cd, &ccp, (size_t *)0, (char **)0, (size_t *)0);
          iconv_close(cd);
          return 0;
       }"
     HAVE_ICONV_${LIB}_${TRY_ICONV_CONST})
    IF(HAVE_ICONV_${LIB}_${TRY_ICONV_CONST})
      SET(HAVE_ICONV true)
      SET(ICONV_CONST ${TRY_ICONV_CONST})
    ENDIF(HAVE_ICONV_${LIB}_${TRY_ICONV_CONST})
    CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
  ENDIF(NOT HAVE_ICONV)
ENDMACRO(CHECK_ICONV TRY_ICONV_CONST)

IF(ENABLE_ICONV)
  CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
  FIND_PATH(ICONV_INCLUDE_DIR iconv.h)
  IF(ICONV_INCLUDE_DIR)
    #SET(INCLUDES ${INCLUDES} "iconv.h")
    SET(HAVE_ICONV_H 1)
    INCLUDE_DIRECTORIES(${ICONV_INCLUDE_DIR})
    SET(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR})
    CHECK_ICONV("libc" "const")
    CHECK_ICONV("libc" "")

    # If iconv isn't in libc and we have a libiconv, try that.
    FIND_LIBRARY(LIBICONV_PATH NAMES iconv libiconv)
    IF(NOT HAVE_ICONV AND LIBICONV_PATH)
      LIST(APPEND CMAKE_REQUIRED_LIBRARIES ${LIBICONV_PATH})
      # Test if a macro is needed for the library.
      TRY_MACRO_FOR_LIBRARY(
        "${ICONV_INCLUDE_DIR}" "${LIBICONV_PATH}"
        COMPILES
        "#include <iconv.h>\nint main() {return iconv_close((iconv_t)0);}"
        "WITHOUT_LIBICONV_STATIC;LIBICONV_STATIC")
      IF(NOT WITHOUT_LIBICONV_STATIC AND LIBICONV_STATIC)
        ADD_DEFINITIONS(-DLIBICONV_STATIC)
      ENDIF(NOT WITHOUT_LIBICONV_STATIC AND LIBICONV_STATIC)
      #
      # Set up CMAKE_REQUIRED_* for CHECK_ICONV
      #
      SET(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR})
      SET(CMAKE_REQUIRED_LIBRARIES ${LIBICONV_PATH})
      IF(LIBICONV_STATIC)
        # LIBICONV_STATIC is necessary for the success of CHECK_ICONV
        # on Windows.
        SET(CMAKE_REQUIRED_DEFINITIONS "-DLIBICONV_STATIC")
      ELSE(LIBICONV_STATIC)
        SET(CMAKE_REQUIRED_DEFINITIONS)
      ENDIF(LIBICONV_STATIC)
      CHECK_ICONV("libiconv" "const")
      CHECK_ICONV("libiconv" "")
      IF (HAVE_ICONV)
        LIST(APPEND ADDITIONAL_LIBS ${LIBICONV_PATH})
      ENDIF(HAVE_ICONV)
    ENDIF(NOT HAVE_ICONV AND LIBICONV_PATH)
  ENDIF(ICONV_INCLUDE_DIR)
  #
  # Find locale_charset() for libiconv.
  #
  IF(LIBICONV_PATH)
    SET(CMAKE_REQUIRED_DEFINITIONS)
    SET(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR})
    SET(CMAKE_REQUIRED_LIBRARIES)
    CHECK_INCLUDE_FILES("localcharset.h" HAVE_LOCALCHARSET_H)
    FIND_LIBRARY(LIBCHARSET_PATH NAMES charset libcharset)
    IF(LIBCHARSET_PATH)
      SET(CMAKE_REQUIRED_LIBRARIES ${LIBCHARSET_PATH})
      IF(WIN32 AND NOT CYGWIN)
        # Test if a macro is needed for the library.
        TRY_MACRO_FOR_LIBRARY(
          "${ICONV_INCLUDE_DIR}" "${LIBCHARSET_PATH}"
          COMPILES
          "#include <localcharset.h>\nint main() {return locale_charset()?1:0;}"
          "WITHOUT_LIBCHARSET_STATIC;LIBCHARSET_STATIC")
        IF(NOT WITHOUT_LIBCHARSET_STATIC AND LIBCHARSET_STATIC)
          ADD_DEFINITIONS(-DLIBCHARSET_STATIC)
        ENDIF(NOT WITHOUT_LIBCHARSET_STATIC AND LIBCHARSET_STATIC)
        IF(WITHOUT_LIBCHARSET_STATIC OR LIBCHARSET_STATIC)
          SET(HAVE_LOCALE_CHARSET ON CACHE INTERNAL
              "Have function locale_charset")
        ENDIF(WITHOUT_LIBCHARSET_STATIC OR LIBCHARSET_STATIC)
      ELSE(WIN32 AND NOT CYGWIN)
        CHECK_FUNCTION_EXISTS_GLIBC(locale_charset HAVE_LOCALE_CHARSET)
      ENDIF(WIN32 AND NOT CYGWIN)
      IF(HAVE_LOCALE_CHARSET)
        LIST(APPEND ADDITIONAL_LIBS ${LIBCHARSET_PATH})
      ENDIF(HAVE_LOCALE_CHARSET)
    ENDIF(LIBCHARSET_PATH)
  ENDIF(LIBICONV_PATH)
  CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
ELSE(ENABLE_ICONV)
  # Make sure ICONV variables are not in CACHE after ENABLE_ICONV disabled
  # (once enabled).
  UNSET(HAVE_LOCALE_CHARSET CACHE)
  UNSET(HAVE_ICONV CACHE)
  UNSET(HAVE_ICONV_libc_ CACHE)
  UNSET(HAVE_ICONV_libc_const CACHE)
  UNSET(HAVE_ICONV_libiconv_ CACHE)
  UNSET(HAVE_ICONV_libiconv_const CACHE)
  UNSET(ICONV_INCLUDE_DIR CACHE)
  UNSET(LIBICONV_PATH CACHE)
  UNSET(LIBICONV_DLL CACHE)
  UNSET(LIBICONV_STATIC CACHE)
  UNSET(LIBCHARSET_DLL CACHE)
  UNSET(LIBCHARSET_STATIC CACHE)
ENDIF(ENABLE_ICONV)
d440 1
a440 5
IF(ENABLE_LIBXML2)
  FIND_PACKAGE(LibXml2)
ELSE()
  SET(LIBXML2_FOUND FALSE)
ENDIF()
a441 1
  CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
d446 4
d452 1
a452 12
  CHECK_INCLUDE_FILES("libxml/xmlwriter.h" HAVE_LIBXML_XMLWRITER_H)
  # Test if a macro is needed for the library.
  TRY_MACRO_FOR_LIBRARY(
    "${ICONV_INCLUDE_DIR};${LIBXML2_INCLUDE_DIR}"
    "ws2_32.lib;${ZLIB_LIBRARIES};${LIBICONV_PATH};${LIBXML2_LIBRARIES}"
    COMPILES
    "#include <stddef.h>\n#include <libxml/xmlreader.h>\nint main() {return xmlTextReaderRead((xmlTextReaderPtr)(void *)0);}"
    "WITHOUT_LIBXML_STATIC;LIBXML_STATIC")
  IF(NOT WITHOUT_LIBXML_STATIC AND LIBXML_STATIC)
    ADD_DEFINITIONS(-DLIBXML_STATIC)
  ENDIF(NOT WITHOUT_LIBXML_STATIC AND LIBXML_STATIC)
  CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
d457 1
a457 5
  IF(ENABLE_EXPAT)
    FIND_PACKAGE(EXPAT)
  ELSE()
    SET(EXPAT_FOUND FALSE)
  ENDIF()
a458 1
    CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
a462 1
    CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
a464 116
MARK_AS_ADVANCED(CLEAR LIBXML2_INCLUDE_DIR)
MARK_AS_ADVANCED(CLEAR LIBXML2_LIBRARIES)

#
# POSIX Regular Expression support
#
IF(POSIX_REGEX_LIB MATCHES "^(AUTO|LIBC|LIBREGEX)$")
  #
  # If PCREPOSIX is not found or not requested, try using regex
  # from libc or libregex
  #
  FIND_PATH(REGEX_INCLUDE_DIR regex.h)
  IF(REGEX_INCLUDE_DIR)
    CHECK_FUNCTION_EXISTS_GLIBC(regcomp HAVE_REGCOMP_LIBC)
    #
    # If libc does not provide regex, find libregex.
    #
    IF(NOT HAVE_REGCOMP_LIBC)
      CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
      FIND_LIBRARY(REGEX_LIBRARY regex)
      IF(REGEX_LIBRARY)
        SET(CMAKE_REQUIRED_LIBRARIES ${REGEX_LIBRARY})
        CHECK_FUNCTION_EXISTS_GLIBC(regcomp HAVE_REGCOMP_LIBREGEX)
        IF(HAVE_REGCOMP_LIBREGEX)
          LIST(APPEND ADDITIONAL_LIBS ${REGEX_LIBRARY})
          #
          # If regex.h is not found, retry looking for regex.h at
          # REGEX_INCLUDE_DIR
          #
          IF(NOT HAVE_REGEX_H)
            UNSET(HAVE_REGEX_H CACHE)
            INCLUDE_DIRECTORIES(${REGEX_INCLUDE_DIR})
            SET(CMAKE_REQUIRED_INCLUDES ${REGEX_INCLUDE_DIR})
            LA_CHECK_INCLUDE_FILE("regex.h" HAVE_REGEX_H)
          ENDIF(NOT HAVE_REGEX_H)
          # Test if a macro is needed for the library.
          TRY_MACRO_FOR_LIBRARY(
            "${REGEX_INCLUDE_DIR}" "${REGEX_LIBRARY}"
            COMPILES
            "#include <stddef.h>\n#include <regex.h>\nint main() {regex_t r;return regcomp(&r, \"\", 0);}"
            "USE_REGEX_DLL;USE_REGEX_STATIC")
          IF(USE_REGEX_DLL)
            ADD_DEFINITIONS(-DUSE_REGEX_DLL)
          ELSEIF(USE_REGEX_STATIC)
            ADD_DEFINITIONS(-DUSE_REGEX_STATIC)
          ENDIF(USE_REGEX_DLL)
        ENDIF(HAVE_REGCOMP_LIBREGEX)
      ENDIF(REGEX_LIBRARY)
      CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
    ENDIF(NOT HAVE_REGCOMP_LIBC)
  ENDIF(REGEX_INCLUDE_DIR)
  IF(HAVE_REGCOMP_LIBC OR HAVE_REGCOMP_LIBREGEX)
    SET(FOUND_POSIX_REGEX_LIB 1)
  ENDIF(HAVE_REGCOMP_LIBC OR HAVE_REGCOMP_LIBREGEX)
ENDIF(POSIX_REGEX_LIB MATCHES "^(AUTO|LIBC|LIBREGEX)$")

IF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCREPOSIX)$")
  #
  # If requested, try finding library for PCREPOSIX
  #
  IF(ENABLE_LibGCC)
    FIND_PACKAGE(LibGCC)
  ELSE()
    SET(LIBGCC_FOUND FALSE) # Override cached value
  ENDIF()
  IF(ENABLE_PCREPOSIX)
    FIND_PACKAGE(PCREPOSIX)
  ELSE()
    SET(PCREPOSIX_FOUND FALSE) # Override cached value
  ENDIF()
  IF(PCREPOSIX_FOUND)
    INCLUDE_DIRECTORIES(${PCRE_INCLUDE_DIR})
    LIST(APPEND ADDITIONAL_LIBS ${PCREPOSIX_LIBRARIES})
    # Test if a macro is needed for the library.
    TRY_MACRO_FOR_LIBRARY(
      "${PCRE_INCLUDE_DIR}" "${PCREPOSIX_LIBRARIES}"
      COMPILES
      "#include <pcreposix.h>\nint main() {regex_t r;return regcomp(&r, \"\", 0);}"
      "WITHOUT_PCRE_STATIC;PCRE_STATIC")
    IF(NOT WITHOUT_PCRE_STATIC AND PCRE_STATIC)
      ADD_DEFINITIONS(-DPCRE_STATIC)
	ELSEIF(NOT WITHOUT_PCRE_STATIC AND NOT PCRE_STATIC AND PCRE_FOUND)
	  # Determine if pcre static libraries are to be used.
      LIST(APPEND ADDITIONAL_LIBS ${PCRE_LIBRARIES})
      SET(TMP_LIBRARIES ${PCREPOSIX_LIBRARIES} ${PCRE_LIBRARIES})
      MESSAGE(STATUS "trying again with -lpcre included")
      TRY_MACRO_FOR_LIBRARY(
        "${PCRE_INCLUDE_DIR}" "${TMP_LIBRARIES}"
        COMPILES
        "#include <pcreposix.h>\nint main() {regex_t r;return regcomp(&r, \"\", 0);}"
        "WITHOUT_PCRE_STATIC;PCRE_STATIC")
      IF(NOT WITHOUT_PCRE_STATIC AND PCRE_STATIC)
        ADD_DEFINITIONS(-DPCRE_STATIC)
      ELSEIF(NOT WITHOUT_PCRE_STATIC AND NOT PCRE_STATIC AND MSVC AND LIBGCC_FOUND)
        # When doing a Visual Studio build using pcre static libraries
        # built using the mingw toolchain, -lgcc is needed to resolve
        # ___chkstk_ms.
        MESSAGE(STATUS "Visual Studio build detected, trying again with -lgcc included")
        LIST(APPEND ADDITIONAL_LIBS ${LIBGCC_LIBRARIES})
        SET(TMP_LIBRARIES ${PCREPOSIX_LIBRARIES} ${PCRE_LIBRARIES} ${LIBGCC_LIBRARIES})
          TRY_MACRO_FOR_LIBRARY(
            "${PCRE_INCLUDE_DIR}" "${TMP_LIBRARIES}"
            COMPILES
            "#include <pcreposix.h>\nint main() {regex_t r;return regcomp(&r, \"\", 0);}"
            "WITHOUT_PCRE_STATIC;PCRE_STATIC")
          IF(NOT WITHOUT_PCRE_STATIC AND PCRE_STATIC)
            ADD_DEFINITIONS(-DPCRE_STATIC)
          ENDIF(NOT WITHOUT_PCRE_STATIC AND PCRE_STATIC)
      ENDIF(NOT WITHOUT_PCRE_STATIC AND PCRE_STATIC)
    ENDIF(NOT WITHOUT_PCRE_STATIC AND PCRE_STATIC)
  ENDIF(PCREPOSIX_FOUND)
  MARK_AS_ADVANCED(CLEAR PCRE_INCLUDE_DIR)
  MARK_AS_ADVANCED(CLEAR PCREPOSIX_LIBRARIES)
  MARK_AS_ADVANCED(CLEAR PCRE_LIBRARIES)
  MARK_AS_ADVANCED(CLEAR LIBGCC_LIBRARIES)
ENDIF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCREPOSIX)$")
d469 2
a470 11
CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
IF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR
    CMAKE_C_COMPILER_ID MATCHES "^Clang$")
  #
  # During checking functions, we should use -fno-builtin to avoid the
  # failure of function detection which failure is an error "conflicting
  # types for built-in function" caused by using -Werror option.
  #
  SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fno-builtin")
ENDIF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR
       CMAKE_C_COMPILER_ID MATCHES "^Clang$")
a471 1
CHECK_FUNCTION_EXISTS_GLIBC(arc4random_buf HAVE_ARC4RANDOM_BUF)
a474 2
CHECK_FUNCTION_EXISTS_GLIBC(ctime_r HAVE_CTIME_R)
CHECK_FUNCTION_EXISTS_GLIBC(dirfd HAVE_DIRFD)
a479 1
CHECK_FUNCTION_EXISTS_GLIBC(fdopendir HAVE_FDOPENDIR)
a481 3
CHECK_FUNCTION_EXISTS_GLIBC(fstatat HAVE_FSTATAT)
CHECK_FUNCTION_EXISTS_GLIBC(fstatfs HAVE_FSTATFS)
CHECK_FUNCTION_EXISTS_GLIBC(fstatvfs HAVE_FSTATVFS)
a484 1
CHECK_FUNCTION_EXISTS_GLIBC(futimesat HAVE_FUTIMESAT)
a490 2
CHECK_FUNCTION_EXISTS_GLIBC(getvfsbyname HAVE_GETVFSBYNAME)
CHECK_FUNCTION_EXISTS_GLIBC(gmtime_r HAVE_GMTIME_R)
a494 1
CHECK_FUNCTION_EXISTS_GLIBC(localtime_r HAVE_LOCALTIME_R)
a496 1
CHECK_FUNCTION_EXISTS_GLIBC(mbrtowc HAVE_MBRTOWC)
a500 1
CHECK_FUNCTION_EXISTS_GLIBC(mkstemp HAVE_MKSTEMP)
a501 1
CHECK_FUNCTION_EXISTS_GLIBC(openat HAVE_OPENAT)
a503 1
CHECK_FUNCTION_EXISTS_GLIBC(posix_spawnp HAVE_POSIX_SPAWNP)
a504 1
CHECK_FUNCTION_EXISTS_GLIBC(readpassphrase HAVE_READPASSPHRASE)
a508 2
CHECK_FUNCTION_EXISTS_GLIBC(statfs HAVE_STATFS)
CHECK_FUNCTION_EXISTS_GLIBC(statvfs HAVE_STATVFS)
d527 2
a528 5
CHECK_FUNCTION_EXISTS_GLIBC(_ctime64_s HAVE__CTIME64_S)
CHECK_FUNCTION_EXISTS_GLIBC(_fseeki64 HAVE__FSEEKI64)
CHECK_FUNCTION_EXISTS_GLIBC(_get_timezone HAVE__GET_TIMEZONE)
CHECK_FUNCTION_EXISTS_GLIBC(_localtime64_s HAVE__LOCALTIME64_S)
CHECK_FUNCTION_EXISTS_GLIBC(_mkgmtime64 HAVE__MKGMTIME64)
d531 8
a538 35
CHECK_FUNCTION_EXISTS(cygwin_conv_path HAVE_CYGWIN_CONV_PATH)
CHECK_FUNCTION_EXISTS(fseeko HAVE_FSEEKO)
CHECK_FUNCTION_EXISTS(strerror_r HAVE_STRERROR_R)
CHECK_FUNCTION_EXISTS(strftime HAVE_STRFTIME)
CHECK_FUNCTION_EXISTS(vprintf HAVE_VPRINTF)
CHECK_FUNCTION_EXISTS(wmemcmp HAVE_WMEMCMP)
CHECK_FUNCTION_EXISTS(wmemcpy HAVE_WMEMCPY)
CHECK_FUNCTION_EXISTS(wmemmove HAVE_WMEMMOVE)

CMAKE_POP_CHECK_STATE()	# Restore the state of the variables

# Make sure we have the POSIX version of readdir_r, not the
# older 2-argument version.
CHECK_C_SOURCE_COMPILES(
  "#include <dirent.h>\nint main() {DIR *d = opendir(\".\"); struct dirent e,*r; return readdir_r(d,&e,&r);}"
  HAVE_READDIR_R)


# Only detect readlinkat() if we also have AT_FDCWD in unistd.h.
# NOTE: linux requires fcntl.h for AT_FDCWD.
CHECK_C_SOURCE_COMPILES(
  "#include <fcntl.h>\n#include <unistd.h>\nint main() {char buf[10]; return readlinkat(AT_FDCWD, \"\", buf, 0);}"
  HAVE_READLINKAT)


# To verify major(), we need to both include the header
# of interest and verify that the result can be linked.
# CHECK_FUNCTION_EXISTS doesn't accept a header argument,
# CHECK_SYMBOL_EXISTS doesn't test linkage.
CHECK_C_SOURCE_COMPILES(
  "#include <sys/mkdev.h>\nint main() { return major(256); }"
  MAJOR_IN_MKDEV)
CHECK_C_SOURCE_COMPILES(
  "#include <sys/sysmacros.h>\nint main() { return major(256); }"
  MAJOR_IN_SYSMACROS)
d557 2
a558 2
CHECK_SYMBOL_EXISTS(INT32_MAX        "${headers}" HAVE_DECL_INT32_MAX)
CHECK_SYMBOL_EXISTS(INT32_MIN        "${headers}" HAVE_DECL_INT32_MIN)
a560 2
CHECK_SYMBOL_EXISTS(INTMAX_MAX       "${headers}" HAVE_DECL_INTMAX_MAX)
CHECK_SYMBOL_EXISTS(INTMAX_MIN       "${headers}" HAVE_DECL_INTMAX_MIN)
a562 1
CHECK_SYMBOL_EXISTS(UINTMAX_MAX      "${headers}" HAVE_DECL_UINTMAX_MAX)
a568 10
# Check for tm_gmtoff in struct tm
CHECK_STRUCT_MEMBER("struct tm" tm_gmtoff
    "time.h" HAVE_STRUCT_TM_TM_GMTOFF)
CHECK_STRUCT_MEMBER("struct tm" __tm_gmtoff
    "time.h" HAVE_STRUCT_TM___TM_GMTOFF)

# Check for f_namemax in struct statfs
CHECK_STRUCT_MEMBER("struct statfs" f_namemax
    "sys/param.h;sys/mount.h" HAVE_STRUCT_STATFS_F_NAMEMAX)

a591 6

IF(HAVE_SYS_STATVFS_H)
  CHECK_STRUCT_MEMBER("struct statvfs" f_iosize
    "sys/types.h;sys/statvfs.h" HAVE_STRUCT_STATVFS_F_IOSIZE)
ENDIF()

d600 1
d602 3
a604 22
CHECK_TYPE_SIZE("short" SIZE_OF_SHORT)
CHECK_TYPE_SIZE("int" SIZE_OF_INT)
CHECK_TYPE_SIZE("long" SIZE_OF_LONG)
CHECK_TYPE_SIZE("long long"     SIZE_OF_LONG_LONG)

CHECK_TYPE_SIZE("unsigned short" SIZE_OF_UNSIGNED_SHORT)
CHECK_TYPE_SIZE("unsigned" SIZE_OF_UNSIGNED)
CHECK_TYPE_SIZE("unsigned long" SIZE_OF_UNSIGNED_LONG)
CHECK_TYPE_SIZE("unsigned long long" SIZE_OF_UNSIGNED_LONG_LONG)

CHECK_TYPE_SIZE("__int64" __INT64)
CHECK_TYPE_SIZE("unsigned __int64" UNSIGNED___INT64)

CHECK_TYPE_SIZE(int16_t INT16_T)
CHECK_TYPE_SIZE(int32_t INT32_T)
CHECK_TYPE_SIZE(int64_t INT64_T)
CHECK_TYPE_SIZE(intmax_t INTMAX_T)
CHECK_TYPE_SIZE(uint8_t UINT8_T)
CHECK_TYPE_SIZE(uint16_t UINT16_T)
CHECK_TYPE_SIZE(uint32_t UINT32_T)
CHECK_TYPE_SIZE(uint64_t UINT64_T)
CHECK_TYPE_SIZE(uintmax_t UINTMAX_T)
d606 1
d632 17
d699 22
d748 2
d757 2
a758 2
  CHECK_LIBRARY_EXISTS(attr "setxattr" "" HAVE_LIBATTR)
  IF(HAVE_LIBATTR)
d760 1
a760 1
  ENDIF(HAVE_LIBATTR)
a765 2
  CHECK_FUNCTION_EXISTS_GLIBC(fgetxattr HAVE_FGETXATTR)
  CHECK_FUNCTION_EXISTS_GLIBC(flistxattr HAVE_FLISTXATTR)
a771 34
  CHECK_FUNCTION_EXISTS_GLIBC(fgetea HAVE_FGETEA)
  CHECK_FUNCTION_EXISTS_GLIBC(flistea HAVE_FLISTEA)
  CHECK_FUNCTION_EXISTS_GLIBC(fsetea HAVE_FSETEA)
  CHECK_FUNCTION_EXISTS_GLIBC(getea HAVE_GETEA)
  CHECK_FUNCTION_EXISTS_GLIBC(lgetea HAVE_LGETEA)
  CHECK_FUNCTION_EXISTS_GLIBC(listea HAVE_LISTEA)
  CHECK_FUNCTION_EXISTS_GLIBC(llistea HAVE_LLISTEA)
  CHECK_FUNCTION_EXISTS_GLIBC(lsetea HAVE_LSETEA)
ELSE(ENABLE_XATTR)
  SET(HAVE_ATTR_LIB FALSE)
  SET(HAVE_ATTR_XATTR_H FALSE)
  SET(HAVE_DECL_EXTATTR_NAMESPACE_USER FALSE)
  SET(HAVE_EXTATTR_GET_FILE FALSE)
  SET(HAVE_EXTATTR_LIST_FILE FALSE)
  SET(HAVE_EXTATTR_SET_FD FALSE)
  SET(HAVE_EXTATTR_SET_FILE FALSE)
  SET(HAVE_FGETEA FALSE)
  SET(HAVE_FGETXATTR FALSE)
  SET(HAVE_FLISTEA FALSE)
  SET(HAVE_FLISTXATTR FALSE)
  SET(HAVE_FSETEA FALSE)
  SET(HAVE_FSETXATTR FALSE)
  SET(HAVE_GETEA FALSE)
  SET(HAVE_GETXATTR FALSE)
  SET(HAVE_LGETEA FALSE)
  SET(HAVE_LGETXATTR FALSE)
  SET(HAVE_LISTEA FALSE)
  SET(HAVE_LISTXATTR FALSE)
  SET(HAVE_LLISTEA FALSE)
  SET(HAVE_LLISTXATTR FALSE)
  SET(HAVE_LSETEA FALSE)
  SET(HAVE_LSETXATTR FALSE)
  SET(HAVE_SYS_EXTATTR_H FALSE)
  SET(HAVE_SYS_XATTR_H FALSE)
d783 2
a784 2
  CHECK_LIBRARY_EXISTS(acl "acl_get_file" "" HAVE_LIBACL)
  IF(HAVE_LIBACL)
d788 1
a788 1
  ENDIF(HAVE_LIBACL)
d802 4
a805 6
  CHECK_FUNCTION_EXISTS(acl_get_perm HAVE_ACL_GET_PERM)
  CHECK_FUNCTION_EXISTS(acl_get_perm_np HAVE_ACL_GET_PERM_NP)
  CHECK_FUNCTION_EXISTS(acl_get_link HAVE_ACL_GET_LINK)
  CHECK_FUNCTION_EXISTS(acl_get_link_np HAVE_ACL_GET_LINK_NP)
  CHECK_FUNCTION_EXISTS(acl_is_trivial_np HAVE_ACL_IS_TRIVIAL_NP)
  CHECK_FUNCTION_EXISTS(acl_set_link_np HAVE_ACL_SET_LINK_NP)
a809 15
ELSE(ENABLE_ACL)
  # If someone runs cmake, then disables ACL support, we need
  # to forcibly override the cached values for these.
  SET(HAVE_ACL_CREATE_ENTRY FALSE)
  SET(HAVE_ACL_GET_LINK FALSE)
  SET(HAVE_ACL_GET_LINK_NP FALSE)
  SET(HAVE_ACL_GET_PERM FALSE)
  SET(HAVE_ACL_GET_PERM_NP FALSE)
  SET(HAVE_ACL_INIT FALSE)
  SET(HAVE_ACL_LIB FALSE)
  SET(HAVE_ACL_PERMSET_T FALSE)
  SET(HAVE_ACL_SET_FD FALSE)
  SET(HAVE_ACL_SET_FD_NP FALSE)
  SET(HAVE_ACL_SET_FILE FALSE)
  SET(HAVE_ACL_USER FALSE)
a811 16
#
# Check MD5/RMD160/SHA support
# NOTE: Crypto checks must be run last before generating config.h
#
CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" LIBC)
CHECK_CRYPTO("SHA256;SHA384;SHA512" LIBC2)
CHECK_CRYPTO("SHA256;SHA384;SHA512" LIBC3)
CHECK_CRYPTO("MD5;SHA1;SHA256;SHA384;SHA512" LIBSYSTEM)
CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" NETTLE)
CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" OPENSSL)

# Libmd has to be probed after OpenSSL.
CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA512" LIBMD)

CHECK_CRYPTO_WIN("MD5;SHA1;SHA256;SHA384;SHA512")

a817 3
# Handle generation of the libarchive.pc file for pkg-config
INCLUDE(CreatePkgConfigFile)

d842 6
d850 1
a850 1
  ADD_CUSTOM_TARGET(run_all_tests)
a853 1
add_subdirectory(cat)
@


1.1.1.5
log
@Import libarchive-3.3.1.
@
text
@d18 1
a18 1
  SET(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build Type" FORCE)
d47 1
a47 1
 "^([0-9])[0-9][0-9][0-9][0-9][0-9][0-9][a-z]*$" "\\1" _major ${_version})
d49 1
a49 1
 "^[0-9]([0-9][0-9][0-9])[0-9][0-9][0-9][a-z]*$" "\\1" _minor ${_version})
d51 1
a51 1
 "^[0-9][0-9][0-9][0-9]([0-9][0-9][0-9])[a-z]*$" "\\1" _revision ${_version})
d53 1
a53 1
 "^[0-9][0-9][0-9][0-9][0-9][0-9][0-9]([a-z]*)$" "\\1" _quality ${_version})
d182 7
a188 9
OPTION(ENABLE_LZO "Enable the use of the system LZO library if found" OFF)
OPTION(ENABLE_LZMA "Enable the use of the system LZMA library if found" ON)

OPTION(ENABLE_ZLIB "Enable the use of the system ZLIB library if found" ON)
OPTION(ENABLE_BZip2 "Enable the use of the system BZip2 library if found" ON)
OPTION(ENABLE_LIBXML2 "Enable the use of the system libxml2 library if found" ON)
OPTION(ENABLE_EXPAT "Enable the use of the system EXPAT library if found" ON)
OPTION(ENABLE_PCREPOSIX "Enable the use of the system PCREPOSIX library if found" ON)
OPTION(ENABLE_LibGCC "Enable the use of the system LibGCC library if found" ON)
d277 1
a277 1
INCLUDE(CheckStructHasMember)
d455 1
a455 1
  FIND_PACKAGE(LibLZMA)
d457 2
a458 1
  SET(LIBZMA_FOUND FALSE) # Override cached value
d461 1
a461 1
IF(LIBLZMA_FOUND)
d464 2
a465 4
  SET(CMAKE_REQUIRED_INCLUDES ${LIBLZMA_INCLUDE_DIR})
  SET(CMAKE_REQUIRED_LIBRARIES ${LIBLZMA_LIBRARIES})
  INCLUDE_DIRECTORIES(${LIBLZMA_INCLUDE_DIRS})
  LIST(APPEND ADDITIONAL_LIBS ${LIBLZMA_LIBRARIES})
d468 1
a468 1
    "${LIBLZMA_INCLUDE_DIRS}" "${LIBLZMA_LIBRARIES}"
d475 6
a480 1
ELSE(LIBLZMA_FOUND)
d482 1
a482 1
ENDIF(LIBLZMA_FOUND)
d486 9
a494 13
IF(ENABLE_LZO)
  IF (LZO2_INCLUDE_DIR)
    # Already in cache, be silent
    SET(LZO2_FIND_QUIETLY TRUE)
  ENDIF (LZO2_INCLUDE_DIR)

  FIND_PATH(LZO2_INCLUDE_DIR lzo/lzoconf.h)
  FIND_LIBRARY(LZO2_LIBRARY NAMES lzo2 liblzo2)
  INCLUDE(FindPackageHandleStandardArgs)
  FIND_PACKAGE_HANDLE_STANDARD_ARGS(LZO2 DEFAULT_MSG LZO2_LIBRARY LZO2_INCLUDE_DIR)
ELSE(ENABLE_LZO)
  SET(LIBZMA_FOUND FALSE) # Override cached value
ENDIF(ENABLE_LZO)
a572 5

CHECK_C_SOURCE_COMPILES("#include <sys/ioctl.h>
#include <linux/fs.h>
int main(void) { return FS_IOC_GETFLAGS; }" HAVE_WORKING_FS_IOC_GETFLAGS)

d617 1
a617 1
# Following files need windows.h, so we should test it after windows.h test.
a1276 8
CHECK_C_SOURCE_COMPILES(
  "#include <sys/types.h>\n#include <sys/mount.h>\nint main(void) { struct vfsconf v; return sizeof(v);}"
  HAVE_STRUCT_VFSCONF)

CHECK_C_SOURCE_COMPILES(
  "#include <sys/types.h>\n#include <sys/mount.h>\nint main(void) { struct xvfsconf v; return sizeof(v);}"
  HAVE_STRUCT_XVFSCONF)

a1301 4
CHECK_C_SOURCE_COMPILES(
  "#include <lzma.h>\n#if LZMA_VERSION < 50020000\n#error unsupported\n#endif\nint main(void){lzma_stream_encoder_mt(0, 0); return 0;}"
  HAVE_LZMA_STREAM_ENCODER_MT)

d1335 1
a1335 1
CHECK_STRUCT_HAS_MEMBER("struct tm" tm_gmtoff
d1337 1
a1337 1
CHECK_STRUCT_HAS_MEMBER("struct tm" __tm_gmtoff
d1341 1
a1341 1
CHECK_STRUCT_HAS_MEMBER("struct statfs" f_namemax
d1345 1
a1345 1
CHECK_STRUCT_HAS_MEMBER("struct stat" st_birthtime
d1349 1
a1349 1
CHECK_STRUCT_HAS_MEMBER("struct stat" st_birthtimespec.tv_nsec
d1351 1
a1351 1
CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtimespec.tv_nsec
d1353 1
a1353 1
CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtim.tv_nsec
d1355 1
a1355 1
CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtime_n
d1357 1
a1357 1
CHECK_STRUCT_HAS_MEMBER("struct stat" st_umtime
d1359 1
a1359 1
CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtime_usec
d1362 1
a1362 1
CHECK_STRUCT_HAS_MEMBER("struct stat" st_blksize
d1365 1
a1365 1
CHECK_STRUCT_HAS_MEMBER("struct stat" st_flags
d1369 1
a1369 1
  CHECK_STRUCT_HAS_MEMBER("struct statvfs" f_iosize
d1375 1
a1375 1
CHECK_STRUCT_HAS_MEMBER("struct tm" tm_sec
a1594 1
  CHECK_FUNCTION_EXISTS(acl_get_fd_np HAVE_ACL_GET_FD_NP)
a1600 1
  CHECK_SYMBOL_EXISTS(ACL_TYPE_NFS4 "${INCLUDES}" HAVE_ACL_TYPE_NFS4)
a1604 18
  CHECK_C_SOURCE_COMPILES("#include <sys/types.h>
#include <sys/acl.h>
int main(void) { return ACL_TYPE_EXTENDED; }" HAVE_ACL_TYPE_EXTENDED)

  # Solaris and derivates ACLs
  CHECK_LIBRARY_EXISTS(sec "acl_get" "" HAVE_LIBSEC)
  IF(HAVE_LIBSEC)
    SET(CMAKE_REQUIRED_LIBRARIES "sec")
    FIND_LIBRARY(SEC_LIBRARY NAMES sec)
    LIST(APPEND ADDITIONAL_LIBS ${SEC_LIBRARY})
  ENDIF(HAVE_LIBSEC)
  #
  CHECK_TYPE_EXISTS(aclent_t "${INCLUDES}" HAVE_ACLENT_T)
  CHECK_TYPE_EXISTS(ace_t "${INCLUDES}" HAVE_ACE_T)
  CHECK_FUNCTION_EXISTS(acl_get HAVE_FACL_GET)
  CHECK_FUNCTION_EXISTS(facl_get HAVE_FACL_GET)
  CHECK_FUNCTION_EXISTS(acl_set HAVE_FACL_SET)
  CHECK_FUNCTION_EXISTS(facl_set HAVE_FACL_SET)
a1618 1
  SET(HAVE_ACL_TYPE_NFS4 FALSE)
a1619 7
  SET(HAVE_ACL_TYPE_EXTENDED FALSE)
  SET(HAVE_ACL_GET FALSE)
  SET(HAVE_ACLENT_T FALSE)
  SET(HAVE_ACE_T FALSE)
  SET(HAVE_FACL_GET FALSE)
  SET(HAVE_ACL_SET FALSE)
  SET(HAVE_FACL_SET FALSE)
@


1.1.1.6
log
@Import libarchive-3.3.2 + 9de5f3 + f9dacbf:
- Support NFS4 ACLs on Linux
- Bugfixes
@
text
@a554 1
LA_CHECK_INCLUDE_FILE("attr/xattr.h" HAVE_ATTR_XATTR_H)
a581 1
LA_CHECK_INCLUDE_FILE("membership.h" HAVE_MEMBERSHIP_H)
a598 1
LA_CHECK_INCLUDE_FILE("sys/extattr.h" HAVE_SYS_EXTATTR_H)
a603 1
LA_CHECK_INCLUDE_FILE("sys/richacl.h" HAVE_SYS_RICHACL_H)
a612 1
LA_CHECK_INCLUDE_FILE("sys/xattr.h" HAVE_SYS_XATTR_H)
a620 3
  IF(HAVE_BCRYPT_H)
    LIST(APPEND ADDITIONAL_LIBS "Bcrypt")
  ENDIF(HAVE_BCRYPT_H)
d1198 1
a1297 4
# dirfd can be either a function or a macro.
CHECK_C_SOURCE_COMPILES(
  "#include <dirent.h>\nint main() {DIR *d = opendir(\".\"); return dirfd(d);}"
  HAVE_DIRFD)
d1530 3
d1538 20
a1557 89
  CHECK_SYMBOL_EXISTS(XATTR_NOFOLLOW "sys/xattr.h" HAVE_DECL_XATTR_NOFOLLOW)
  IF(HAVE_SYS_XATTR_H AND HAVE_DECL_XATTR_NOFOLLOW)
    CHECK_FUNCTION_EXISTS(fgetxattr HAVE_FGETXATTR)
    CHECK_FUNCTION_EXISTS(flistxattr HAVE_FLISTXATTR)
    CHECK_FUNCTION_EXISTS(fsetxattr HAVE_FSETXATTR)
    CHECK_FUNCTION_EXISTS(getxattr HAVE_GETXATTR)
    CHECK_FUNCTION_EXISTS(listxattr HAVE_LISTXATTR)
    CHECK_FUNCTION_EXISTS(setxattr HAVE_SETXATTR)
    IF(HAVE_FGETXATTR AND
       HAVE_FLISTXATTR AND
       HAVE_FSETXATTR AND
       HAVE_GETXATTR AND
       HAVE_LISTXATTR AND
       HAVE_SETXATTR)
      SET(ARCHIVE_XATTR_DARWIN TRUE)
    ENDIF()
  ELSEIF(HAVE_SYS_EXTATTR_H AND HAVE_DECL_EXTATTR_NAMESPACE_USER)
    # FreeBSD xattr support
    CHECK_FUNCTION_EXISTS(extattr_get_fd HAVE_EXTATTR_GET_FD)
    CHECK_FUNCTION_EXISTS(extattr_get_file HAVE_EXTATTR_GET_FILE)
    CHECK_FUNCTION_EXISTS(extattr_get_link HAVE_EXTATTR_GET_LINK)
    CHECK_FUNCTION_EXISTS(extattr_list_fd HAVE_EXTATTR_LIST_FD)
    CHECK_FUNCTION_EXISTS(extattr_list_file HAVE_EXTATTR_LIST_FILE)
    CHECK_FUNCTION_EXISTS(extattr_list_link HAVE_EXTATTR_LIST_LINK)
    CHECK_FUNCTION_EXISTS(extattr_set_fd HAVE_EXTATTR_SET_FD)
    CHECK_FUNCTION_EXISTS(extattr_set_link HAVE_EXTATTR_SET_LINK)
    IF(HAVE_EXTATTR_GET_FD AND
       HAVE_EXTATTR_GET_FILE AND
       HAVE_EXTATTR_GET_LINK AND
       HAVE_EXTATTR_LIST_FD AND
       HAVE_EXTATTR_LIST_FILE AND
       HAVE_EXTATTR_LIST_LINK AND
       HAVE_EXTATTR_SET_FD AND
       HAVE_EXTATTR_SET_LINK)
      SET(ARCHIVE_XATTR_FREEBSD TRUE)
    ENDIF()
  ELSEIF(HAVE_SYS_XATTR_H OR HAVE_ATTR_XATTR_H)
    # Linux xattr support
    CHECK_FUNCTION_EXISTS_GLIBC(fgetxattr HAVE_FGETXATTR)
    CHECK_FUNCTION_EXISTS_GLIBC(flistxattr HAVE_FLISTXATTR)
    CHECK_FUNCTION_EXISTS_GLIBC(fsetxattr HAVE_FSETXATTR)
    CHECK_FUNCTION_EXISTS_GLIBC(getxattr HAVE_GETXATTR)
    CHECK_FUNCTION_EXISTS_GLIBC(lgetxattr HAVE_LGETXATTR)
    CHECK_FUNCTION_EXISTS_GLIBC(listxattr HAVE_LISTXATTR)
    CHECK_FUNCTION_EXISTS_GLIBC(llistxattr HAVE_LLISTXATTR)
    CHECK_FUNCTION_EXISTS_GLIBC(lsetxattr HAVE_LSETXATTR)
    IF(HAVE_FGETXATTR AND
       HAVE_FLISTXATTR AND
       HAVE_FSETXATTR AND
       HAVE_GETXATTR AND
       HAVE_LGETXATTR AND
       HAVE_LISTXATTR AND
       HAVE_LLISTXATTR AND
       HAVE_LSETXATTR)
      SET(ARCHIVE_XATTR_LINUX TRUE)
    ENDIF()
  ELSEIF(HAVE_SYS_EA_H)
    # AIX xattr support
    CHECK_FUNCTION_EXISTS(fgetea HAVE_FGETEA)
    CHECK_FUNCTION_EXISTS(flistea HAVE_FLISTEA)
    CHECK_FUNCTION_EXISTS(fsetea HAVE_FSETEA)
    CHECK_FUNCTION_EXISTS(getea HAVE_GETEA)
    CHECK_FUNCTION_EXISTS(lgetea HAVE_LGETEA)
    CHECK_FUNCTION_EXISTS(listea HAVE_LISTEA)
    CHECK_FUNCTION_EXISTS(llistea HAVE_LLISTEA)
    CHECK_FUNCTION_EXISTS(lsetea HAVE_LSETEA)
    IF(HAVE_FGETEA AND
       HAVE_FLISTEA AND
       HAVE_FSETEA AND
       HAVE_GETEA AND
       HAVE_LGETEA AND
       HAVE_LISTEA AND
       HAVE_LLISTEA AND
       HAVE_LSETEA)
      SET(ARCHIVE_XATTR_AIX TRUE)
    ENDIF()
  ENDIF()

  IF(ARCHIVE_XATTR_DARWIN)
    MESSAGE(STATUS "Extended attributes support: Darwin")
  ELSEIF(ARCHIVE_XATTR_FREEBSD)
    MESSAGE(STATUS "Extended attributes support: FreeBSD")
  ELSEIF(ARCHIVE_XATTR_LINUX)
    MESSAGE(STATUS "Extended attributes support: Linux")
  ELSEIF(ARCHIVE_XATTR_AIX)
    MESSAGE(STATUS "Extended attributes support: AIX")
  ELSE()
    MESSAGE(STATUS "Extended attributes support: none")
  ENDIF()
d1559 25
a1583 4
  SET(ARCHIVE_XATTR_DARWIN FALSE)
  SET(ARCHIVE_XATTR_FREEBSD FALSE)
  SET(ARCHIVE_XATTR_LINUX FALSE)
  SET(ARCHIVE_XATTR_AIX FALSE)
a1594 5
  # Solaris and derivates ACLs
  CHECK_FUNCTION_EXISTS(acl HAVE_ACL)
  CHECK_FUNCTION_EXISTS(facl HAVE_FACL)

  # Libacl
d1601 26
a1626 91

  CHECK_TYPE_EXISTS(acl_t "sys/types.h;sys/acl.h" HAVE_ACL_T)
  CHECK_TYPE_EXISTS(acl_entry_t "sys/types.h;sys/acl.h" HAVE_ACL_ENTRY_T)
  CHECK_TYPE_EXISTS(acl_permset_t "sys/types.h;sys/acl.h" HAVE_ACL_PERMSET_T)
  CHECK_TYPE_EXISTS(acl_tag_t "sys/types.h;sys/acl.h" HAVE_ACL_TAG_T)

  IF(HAVE_ACL AND HAVE_FACL)
    CHECK_TYPE_EXISTS(aclent_t "sys/acl.h" HAVE_ACLENT_T)
    IF(HAVE_ACLENT_T)
      CHECK_SYMBOL_EXISTS(GETACL "sys/acl.h" HAVE_DECL_GETACL)
      CHECK_SYMBOL_EXISTS(GETACLCNT "sys/acl.h" HAVE_DECL_GETACLCNT)
      CHECK_SYMBOL_EXISTS(SETACL "sys/acl.h" HAVE_DECL_SETACL)
      IF(HAVE_DECL_GETACL AND
         HAVE_DECL_GETACLCNT AND
         HAVE_DECL_SETACL)
        SET(ARCHIVE_ACL_SUNOS TRUE)
      ENDIF()
      CHECK_TYPE_EXISTS(ace_t "sys/acl.h" HAVE_ACE_T)
      IF(HAVE_ACE_T)
        CHECK_SYMBOL_EXISTS(ACE_GETACL "sys/acl.h" HAVE_DECL_ACE_GETACL)
        CHECK_SYMBOL_EXISTS(ACE_GETACLCNT "sys/acl.h" HAVE_DECL_ACE_GETACLCNT)
        CHECK_SYMBOL_EXISTS(ACE_SETACL "sys/acl.h" HAVE_DECL_ACE_SETACL)
        IF(HAVE_DECL_ACE_GETACL AND
           HAVE_DECL_ACE_GETACLCNT AND
           HAVE_DECL_ACE_SETACL)
          SET(ARCHIVE_ACL_SUNOS_NFS4 TRUE)
        ENDIF()
      ENDIF(HAVE_ACE_T)
    ENDIF(HAVE_ACLENT_T)
  ENDIF(HAVE_ACL AND HAVE_FACL)

  IF(HAVE_ACL_T AND HAVE_ACL_ENTRY_T AND HAVE_ACL_PERMSET_T AND HAVE_ACL_TAG_T)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_add_perm HAVE_ACL_ADD_PERM)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_clear_perms HAVE_ACL_CLEAR_PERMS)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_create_entry HAVE_ACL_CREATE_ENTRY)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_delete_def_file HAVE_ACL_DELETE_DEF_FILE)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_free HAVE_ACL_FREE)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_get_entry HAVE_ACL_GET_ENTRY)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_get_fd HAVE_ACL_GET_FD)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_get_file HAVE_ACL_GET_FILE)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_get_permset HAVE_ACL_GET_PERMSET)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_get_qualifier HAVE_ACL_GET_QUALIFIER)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_get_tag_type HAVE_ACL_GET_TAG_TYPE)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_init HAVE_ACL_INIT)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_set_fd HAVE_ACL_SET_FD)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_set_file HAVE_ACL_SET_FILE)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_set_qualifier HAVE_ACL_SET_QUALIFIER)
    CHECK_FUNCTION_EXISTS_GLIBC(acl_set_tag_type HAVE_ACL_SET_TAG_TYPE)
    IF(HAVE_ACL_ADD_PERM AND
       HAVE_ACL_CLEAR_PERMS AND
       HAVE_ACL_CREATE_ENTRY AND
       HAVE_ACL_DELETE_DEF_FILE AND
       HAVE_ACL_FREE AND
       HAVE_ACL_GET_ENTRY AND
       HAVE_ACL_GET_FD AND
       HAVE_ACL_GET_FILE AND
       HAVE_ACL_GET_PERMSET AND
       HAVE_ACL_GET_QUALIFIER AND
       HAVE_ACL_GET_TAG_TYPE AND
       HAVE_ACL_INIT AND
       HAVE_ACL_SET_FD AND
       HAVE_ACL_SET_FILE AND
       HAVE_ACL_SET_QUALIFIER AND
       HAVE_ACL_SET_TAG_TYPE)
         SET(HAVE_POSIX_ACL_FUNCS 1)
    ENDIF()

    CHECK_FUNCTION_EXISTS_GLIBC(acl_get_perm HAVE_ACL_GET_PERM)

    IF(HAVE_POSIX_ACL_FUNCS AND HAVE_ACL_LIBACL_H AND HAVE_LIBACL AND
       HAVE_ACL_GET_PERM)
      SET(ARCHIVE_ACL_LIBACL TRUE)
    ELSE()
      CHECK_FUNCTION_EXISTS(acl_add_flag_np HAVE_ACL_ADD_FLAG_NP)
      CHECK_FUNCTION_EXISTS(acl_clear_flags_np HAVE_ACL_CLEAR_FLAGS_NP)
      CHECK_FUNCTION_EXISTS(acl_get_brand_np HAVE_ACL_GET_BRAND_NP)
      CHECK_FUNCTION_EXISTS(acl_get_entry_type_np HAVE_ACL_GET_ENTRY_TYPE_NP)
      CHECK_FUNCTION_EXISTS(acl_get_flag_np HAVE_ACL_GET_FLAG_NP)
      CHECK_FUNCTION_EXISTS(acl_get_flagset_np HAVE_ACL_GET_FLAGSET_NP)
      CHECK_FUNCTION_EXISTS(acl_get_fd_np HAVE_ACL_GET_FD_NP)
      CHECK_FUNCTION_EXISTS(acl_get_link_np HAVE_ACL_GET_LINK_NP)
      CHECK_FUNCTION_EXISTS(acl_get_perm_np HAVE_ACL_GET_PERM_NP)
      CHECK_FUNCTION_EXISTS(acl_is_trivial_np HAVE_ACL_IS_TRIVIAL_NP)
      CHECK_FUNCTION_EXISTS(acl_set_entry_type_np HAVE_ACL_SET_ENTRY_TYPE_NP)
      CHECK_FUNCTION_EXISTS(acl_set_fd_np HAVE_ACL_SET_FD_NP)
      CHECK_FUNCTION_EXISTS(acl_set_link_np HAVE_ACL_SET_LINK_NP)
      CHECK_FUNCTION_EXISTS(mbr_gid_to_uuid HAVE_MBR_GID_TO_UUID)
      CHECK_FUNCTION_EXISTS(mbr_uid_to_uuid HAVE_MBR_UID_TO_UUID)
      CHECK_FUNCTION_EXISTS(mbr_uuid_to_id HAVE_MBR_UUID_TO_ID)

      CHECK_C_SOURCE_COMPILES("#include <sys/types.h>
d1628 1
a1628 93
int main(void) { return ACL_TYPE_EXTENDED; }" HAVE_DECL_ACL_TYPE_EXTENDED)
      CHECK_C_SOURCE_COMPILES("#include <sys/types.h>
#include <sys/acl.h>
int main(void) { return ACL_SYNCHRONIZE; }" HAVE_DECL_ACL_SYNCHRONIZE)
      CHECK_SYMBOL_EXISTS(ACL_TYPE_NFS4 "sys/acl.h" HAVE_DECL_ACL_TYPE_NFS4)
      CHECK_SYMBOL_EXISTS(ACL_USER "sys/acl.h" HAVE_DECL_ACL_USER)

      IF(HAVE_POSIX_ACL_FUNCS AND
         HAVE_ACL_GET_FD_NP AND
         HAVE_ACL_GET_PERM_NP AND
         NOT HAVE_ACL_GET_PERM AND
         HAVE_ACL_SET_FD_NP)
        IF(HAVE_DECL_ACL_USER)
          SET(ARCHIVE_ACL_FREEBSD TRUE)
          IF(HAVE_DECL_ACL_TYPE_NFS4 AND
             HAVE_ACL_ADD_FLAG_NP AND
             HAVE_ACL_CLEAR_FLAGS_NP AND
             HAVE_ACL_GET_BRAND_NP AND
             HAVE_ACL_GET_ENTRY_TYPE_NP AND
             HAVE_ACL_GET_FLAGSET_NP AND
             HAVE_ACL_SET_ENTRY_TYPE_NP)
            SET(ARCHIVE_ACL_FREEBSD_NFS4 TRUE)
          ENDIF()
        ELSEIF(HAVE_DECL_ACL_TYPE_EXTENDED AND
               HAVE_MEMBERSHIP_H AND
               HAVE_ACL_ADD_FLAG_NP AND
               HAVE_ACL_CLEAR_FLAGS_NP AND
               HAVE_ACL_GET_FLAGSET_NP AND
               HAVE_ACL_GET_LINK_NP AND
               HAVE_ACL_SET_LINK_NP AND
               HAVE_MBR_UID_TO_UUID AND
               HAVE_MBR_GID_TO_UUID AND
               HAVE_MBR_UUID_TO_ID)
          SET(ARCHIVE_ACL_DARWIN TRUE)
        ENDIF()
      ENDIF()
    ENDIF()
  ENDIF(HAVE_ACL_T AND HAVE_ACL_ENTRY_T AND HAVE_ACL_PERMSET_T AND
        HAVE_ACL_TAG_T)

  # Richacl
  CHECK_LIBRARY_EXISTS(richacl "richacl_get_file" "" HAVE_LIBRICHACL)
  IF(HAVE_LIBRICHACL)
    SET(CMAKE_REQUIRED_LIBRARIES "richacl")
    FIND_LIBRARY(RICHACL_LIBRARY NAMES richacl)
    LIST(APPEND ADDITIONAL_LIBS ${RICHACL_LIBRARY})
  ENDIF(HAVE_LIBRICHACL)

  CHECK_STRUCT_HAS_MEMBER("struct richace" e_type "sys/richacl.h"
    HAVE_STRUCT_RICHACE)
  CHECK_STRUCT_HAS_MEMBER("struct richacl" a_flags "sys/richacl.h"
    HAVE_STRUCT_RICHACL)

  IF(HAVE_LIBRICHACL AND HAVE_STRUCT_RICHACL AND HAVE_STRUCT_RICHACE)
    CHECK_FUNCTION_EXISTS_GLIBC(richacl_alloc HAVE_RICHACL_ALLOC)
    CHECK_FUNCTION_EXISTS_GLIBC(richacl_equiv_mode HAVE_RICHACL_EQUIV_MODE)
    CHECK_FUNCTION_EXISTS_GLIBC(richacl_free HAVE_RICHACL_FREE)
    CHECK_FUNCTION_EXISTS_GLIBC(richacl_get_fd HAVE_RICHACL_GET_FD)
    CHECK_FUNCTION_EXISTS_GLIBC(richacl_get_file HAVE_RICHACL_GET_FILE)
    CHECK_FUNCTION_EXISTS_GLIBC(richacl_set_fd HAVE_RICHACL_SET_FD)
    CHECK_FUNCTION_EXISTS_GLIBC(richacl_set_file HAVE_RICHACL_SET_FILE)
    IF(HAVE_RICHACL_ALLOC AND
       HAVE_RICHACL_EQUIV_MODE AND
       HAVE_RICHACL_FREE AND
       HAVE_RICHACL_GET_FD AND
       HAVE_RICHACL_GET_FILE AND
       HAVE_RICHACL_SET_FD AND
       HAVE_RICHACL_SET_FILE)
      SET(ARCHIVE_ACL_LIBRICHACL TRUE)
    ENDIF()
  ENDIF(HAVE_LIBRICHACL AND HAVE_STRUCT_RICHACL AND HAVE_STRUCT_RICHACE)

  IF(ARCHIVE_ACL_DARWIN)
    MESSAGE(STATUS "ACL support: Darwin (limited NFSv4)")
  ELSEIF(ARCHIVE_ACL_FREEBSD_NFS4)
    MESSAGE(STATUS "ACL support: FreeBSD (POSIX.1e and NFSv4)")
  ELSEIF(ARCHIVE_ACL_FREEBSD)
    MESSAGE(STATUS "ACL support: FreeBSD (POSIX.1e)")
  ELSEIF(ARCHIVE_ACL_LIBACL OR ARCHIVE_ACL_LIBRICHACL)
    IF(ARCHIVE_ACL_LIBACL AND ARCHIVE_ACL_LIBRICHACL)
      MESSAGE(STATUS "ACL support: libacl (POSIX.1e) + librichacl (NFSv4)")
    ELSEIF(ARCHIVE_ACL_LIBRICHACL)
      MESSAGE(STATUS "ACL support: librichacl (NFSv4)")
    ELSE()
      MESSAGE(STATUS "ACL support: libacl (POSIX.1e)")
    ENDIF()
  ELSEIF(ARCHIVE_ACL_SUNOS_NFS4)
    MESSAGE(STATUS "ACL support: Solaris (POSIX.1e and NFSv4)")
  ELSEIF(ARCHIVE_ACL_SUNOS)
    MESSAGE(STATUS "ACL support: Solaris (POSIX.1e)")
  ELSE()
    MESSAGE(STATUS "ACL support: none")
  ENDIF()
d1630 14
d1647 20
a1666 6
  SET(ARCHIVE_ACL_DARWIN FALSE)
  SET(ARCHIVE_ACL_FREEBSD FALSE)
  SET(ARCHIVE_ACL_FREEBSD_NFS4 FALSE)
  SET(ARCHIVE_ACL_LIBACL FALSE)
  SET(ARCHIVE_ACL_SUNOS FALSE)
  SET(ARCHIVE_ACL_SUNOS_NFS4 FALSE)
@


1.1.1.7
log
@Import libarchive-3.3.3 as should have done originally.
@
text
@a181 1
OPTION(ENABLE_LZ4 "Enable the use of the system LZ4 library if found" ON)
d495 1
a495 1
  SET(LZO2_FOUND FALSE) # Override cached value
d512 4
a515 5
IF(ENABLE_LZ4)
  IF (LZ4_INCLUDE_DIR)
    # Already in cache, be silent
    SET(LZ4_FIND_QUIETLY TRUE)
  ENDIF (LZ4_INCLUDE_DIR)
d517 4
a520 7
  FIND_PATH(LZ4_INCLUDE_DIR lz4.h)
  FIND_LIBRARY(LZ4_LIBRARY NAMES lz4 liblz4)
  INCLUDE(FindPackageHandleStandardArgs)
  FIND_PACKAGE_HANDLE_STANDARD_ARGS(LZ4 DEFAULT_MSG LZ4_LIBRARY LZ4_INCLUDE_DIR)
ELSE(ENABLE_LZ4)
  SET(LZ4_FOUND FALSE) # Override cached value
ENDIF(ENABLE_LZ4)
a535 25
#
# Find Zstd
#
IF (ZSTD_INCLUDE_DIR)
  # Already in cache, be silent
  SET(ZSTD_FIND_QUIETLY TRUE)
ENDIF (ZSTD_INCLUDE_DIR)

FIND_PATH(ZSTD_INCLUDE_DIR zstd.h)
FIND_LIBRARY(ZSTD_LIBRARY NAMES zstd libzstd)
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(ZSTD DEFAULT_MSG ZSTD_LIBRARY ZSTD_INCLUDE_DIR)
IF(ZSTD_FOUND)
  SET(HAVE_ZSTD_H 1)
  INCLUDE_DIRECTORIES(${ZSTD_INCLUDE_DIR})
  LIST(APPEND ADDITIONAL_LIBS ${ZSTD_LIBRARY})
  SET(CMAKE_REQUIRED_LIBRARIES ${ZSTD_LIBRARY})
  SET(CMAKE_REQUIRED_INCLUDES ${ZSTD_INCLUDE_DIR})
  CHECK_FUNCTION_EXISTS(ZSTD_compressStream HAVE_LIBZSTD)
  #
  # TODO: test for static library.
  #
ENDIF(ZSTD_FOUND)
MARK_AS_ADVANCED(CLEAR ZSTD_INCLUDE_DIR)
MARK_AS_ADVANCED(CLEAR ZSTD_LIBRARY)
a611 1
LA_CHECK_INCLUDE_FILE("sys/sysmacros.h" HAVE_SYS_SYSMACROS_H)
@


1.1.1.8
log
@Import libarchive 3.4.0
@
text
@a2 3
if(POLICY CMP0074)
  cmake_policy(SET CMP0074 NEW) #3.12.0 `find_package()`` uses ``<PackageName>_ROOT`` variables.
endif()
a86 5
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
  OPTION(ENABLE_WERROR "Treat warnings as errors - default is ON for Debug, OFF otherwise." ON)
else ()
  OPTION(ENABLE_WERROR "Treat warnings as errors - default is ON for Debug, OFF otherwise." OFF)
endif ()
a95 3
  if (ENABLE_WERROR)
    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
  endif ()
d99 1
a110 3
  if (ENABLE_WERROR)
    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
  endif ()
d115 1
a127 3
  if (ENABLE_WERROR)
    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -qhalt=w")
  endif ()
d132 1
a136 4
  if (ENABLE_WERROR)
    # /WX option is the same as gcc's -Werror option.
    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /WX")
  endif ()
d168 2
a181 1
OPTION(ENABLE_LIBB2 "Enable the use of the system LIBB2 library if found" ON)
a184 1
OPTION(ENABLE_ZSTD "Enable the use of the system zstd library if found" ON)
d460 1
a460 1
  SET(LIBLZMA_FOUND FALSE) # Override cached value
a465 1
  CMAKE_PUSH_CHECK_STATE()
a478 1
  CMAKE_POP_CHECK_STATE()
a481 3
MARK_AS_ADVANCED(CLEAR LIBLZMA_INCLUDE_DIR)
MARK_AS_ADVANCED(CLEAR LIBLZMA_LIBRARY)

a510 29
# Find libb2
#
IF(ENABLE_LIBB2)
  IF (LIBB2_INCLUDE_DIR)
    # Already in cache, be silent
    SET(LIBB2_FIND_QUIETLY TRUE)
  ENDIF (LIBB2_INCLUDE_DIR)

  FIND_PATH(LIBB2_INCLUDE_DIR blake2.h)
  FIND_LIBRARY(LIBB2_LIBRARY NAMES b2 libb2)
  INCLUDE(FindPackageHandleStandardArgs)
  FIND_PACKAGE_HANDLE_STANDARD_ARGS(LIBB2 DEFAULT_MSG LIBB2_LIBRARY LIBB2_INCLUDE_DIR)
ELSE(ENABLE_LIBB2)
  SET(LIBB2_FOUND FALSE) # Override cached value
ENDIF(ENABLE_LIBB2)
IF(LIBB2_FOUND)
  SET(HAVE_LIBB2 1)
  SET(HAVE_BLAKE2_H 1)
  SET(ARCHIVE_BLAKE2 FALSE)
  LIST(APPEND ADDITIONAL_LIBS ${LIBB2_LIBRARY})
  CMAKE_PUSH_CHECK_STATE()
  SET(CMAKE_REQUIRED_LIBRARIES ${LIBB2_LIBRARY})
  SET(CMAKE_REQUIRED_INCLUDES ${LIBB2_INCLUDE_DIR})
  CHECK_FUNCTION_EXISTS(blake2sp_init HAVE_LIBB2)
  CMAKE_POP_CHECK_STATE()
ELSE(LIBB2_FOUND)
  SET(ARCHIVE_BLAKE2 TRUE)
ENDIF(LIBB2_FOUND)
#
d544 9
a552 13
IF(ENABLE_ZSTD)
  IF (ZSTD_INCLUDE_DIR)
    # Already in cache, be silent
    SET(ZSTD_FIND_QUIETLY TRUE)
  ENDIF (ZSTD_INCLUDE_DIR)

  FIND_PATH(ZSTD_INCLUDE_DIR zstd.h)
  FIND_LIBRARY(ZSTD_LIBRARY NAMES zstd libzstd)
  INCLUDE(FindPackageHandleStandardArgs)
  FIND_PACKAGE_HANDLE_STANDARD_ARGS(ZSTD DEFAULT_MSG ZSTD_LIBRARY ZSTD_INCLUDE_DIR)
ELSE(ENABLE_ZSTD)
  SET(ZSTD_FOUND FALSE) # Override cached value
ENDIF(ENABLE_ZSTD)
a556 1
  CMAKE_PUSH_CHECK_STATE()
a562 1
  CMAKE_POP_CHECK_STATE()
a566 1

a1293 1
CHECK_FUNCTION_EXISTS_GLIBC(unlinkat HAVE_UNLINKAT)
a1574 5
  ELSE()
    CHECK_LIBRARY_EXISTS(gnu "setxattr" "" HAVE_LIBATTR_GNU)
    IF(HAVE_LIBATTR_GNU)
      SET(CMAKE_REQUIRED_LIBRARIES "gnu")
    ENDIF()
@


1.1.1.9
log
@Import libarchive 3.7.2
@
text
@a2 3
if(POLICY CMP0065)
  cmake_policy(SET CMP0065 NEW) #3.4 don't use `-rdynamic` with executables
endif()
a64 1
SET(BSDUNZIP_VERSION_STRING    "${VERSION}")
d80 1
a80 1
# Enable CMAKE_PUSH_CHECK_STATE() and CMAKE_POP_CHECK_STATE() macros
d99 18
a116 2
IF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR
    CMAKE_C_COMPILER_ID MATCHES "^Clang$")
d133 1
a133 20
  # Ideally this will be a compile/link time check, yet there's no obvious way
  # how considering how old our minimum required cmake version is. The official
  # cmake.org side does not host the manual pages even. Normally we can use
  # either of the following two, yet neither is supported as of 3.0.2
  # - check_linker_flag - does not exist
  # - try_compile - does not support linker flags
  #
  # The CI fails with this on MacOS
  IF(NOT CMAKE_SYSTEM_NAME MATCHES "Darwin")
    # Place the functions and data into separate sections, allowing the linker
    # to garbage collect the unused ones.
    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections")
    SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections")
    SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gc-sections")
    # Printing the discarded section is "too much", so enable on demand.
    #SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -Wl,--print-gc-sections")
    #SET(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} -Wl,--print-gc-sections")
  ENDIF(NOT CMAKE_SYSTEM_NAME MATCHES "Darwin")
ENDIF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR
       CMAKE_C_COMPILER_ID MATCHES "^Clang$")
d158 3
a160 3
  # Enable level 4 C4062: The enumerate has no associated handler in a switch
  #                       statement and there is no default that can catch it.
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14062")
d163 1
a163 1
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14254")
d167 1
a167 1
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14295")
d170 1
a170 1
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14296")
d173 1
a173 1
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14389")
d177 1
a177 1
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14505")
d180 1
a180 1
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14514")
d182 1
a182 1
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14702")
d185 1
a185 1
  SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /w14706")
d196 1
a196 4
option(BUILD_SHARED_LIBS "Build shared libraries" ON)

OPTION(ENABLE_MBEDTLS "Enable use of mbed TLS" OFF)
OPTION(ENABLE_NETTLE "Enable use of Nettle" OFF)
d209 1
a209 1
OPTION(ENABLE_LIBGCC "Enable the use of the system LibGCC library if found" ON)
a218 7
IF(WIN32 AND NOT CYGWIN)
	SET(ENABLE_UNZIP FALSE)
	SET(ENABLE_UNZIP_SHARED FALSE)
ELSE()
	OPTION(ENABLE_UNZIP "Enable unzip building" ON)
	OPTION(ENABLE_UNZIP_SHARED "Enable dynamic build of unzip" FALSE)
ENDIF()
d228 1
a228 1
SET(WINDOWS_VERSION "WIN10" CACHE STRING "Set Windows version to use (Windows only)")
d239 1
a239 5
  IF(WINDOWS_VERSION STREQUAL "WIN10")
    SET(NTDDI_VERSION 0x0A000000)
    SET(_WIN32_WINNT 0x0A00)
    SET(WINVER 0x0A00)
  ELSEIF(WINDOWS_VERSION STREQUAL "WIN8")
d263 1
a263 1
  ELSE(WINDOWS_VERSION STREQUAL "WIN10")
d268 1
a268 1
  ENDIF(WINDOWS_VERSION STREQUAL "WIN10")
a288 5
IF(MINGW)
  ADD_DEFINITIONS(-D__USE_MINGW_ANSI_STDIO)
  ADD_DEFINITIONS(-D__MINGW_USE_VC2005_COMPAT)
ENDIF()

d357 1
a357 5
        IF(CMAKE_CROSSCOMPILING)
          MESSAGE(WARNING "Cannot test run \"${VAR}\" when cross-compiling")
        ELSE(CMAKE_CROSSCOMPILING)
          CHECK_C_SOURCE_RUNS("${SAMPLE_SOURCE}" ${VAR})
        ENDIF(CMAKE_CROSSCOMPILING)
d376 1
a376 1
  # You have to add a path available DLL file into PATH environment variable.
a494 3
  CHECK_C_SOURCE_COMPILES(
    "#include <lzma.h>\n#if LZMA_VERSION < 50020000\n#error unsupported\n#endif\nint main(void){lzma_stream_encoder_mt(0, 0); return 0;}"
    HAVE_LZMA_STREAM_ENCODER_MT)
a500 1
  SET(HAVE_LZMA_STREAM_ENCODER_MT 0)
a553 1
  INCLUDE_DIRECTORIES(${LIBB2_INCLUDE_DIR})
d602 2
a603 7
  IF(UNIX)
    FIND_PACKAGE(PkgConfig QUIET)
    PKG_SEARCH_MODULE(PC_ZSTD libzstd)
  ENDIF()

  FIND_PATH(ZSTD_INCLUDE_DIR zstd.h HINTS ${PC_ZSTD_INCLUDEDIR} ${PC_ZSTD_INCLUDE_DIRS})
  FIND_LIBRARY(ZSTD_LIBRARY NAMES zstd libzstd HINTS ${PC_ZSTD_LIBDIR} ${PC_ZSTD_LIBRARY_DIRS})
d616 1
a616 2
  CHECK_FUNCTION_EXISTS(ZSTD_decompressStream HAVE_LIBZSTD)
  CHECK_FUNCTION_EXISTS(ZSTD_compressStream HAVE_LIBZSTD_COMPRESSOR)
a656 1
LA_CHECK_INCLUDE_FILE("fnmatch.h" HAVE_FNMATCH_H)
a695 1
LA_CHECK_INCLUDE_FILE("sys/queue.h" HAVE_SYS_QUEUE_H)
d715 1
a715 1
  LA_CHECK_INCLUDE_FILE("bcrypt.h" HAVE_BCRYPT_H)
d717 1
a717 1
    LIST(APPEND ADDITIONAL_LIBS "bcrypt")
a741 20
# Find mbed TLS
#
IF(ENABLE_MBEDTLS)
  FIND_PACKAGE(MbedTLS)
  IF(MBEDTLS_FOUND)
    SET(HAVE_LIBMBEDCRYPTO 1)
    LIST(APPEND ADDITIONAL_LIBS ${MBEDCRYPTO_LIBRARY})
    INCLUDE_DIRECTORIES(${MBEDTLS_INCLUDE_DIRS})

    LIST(APPEND CMAKE_REQUIRED_INCLUDES ${MBEDTLS_INCLUDE_DIRS})
    LA_CHECK_INCLUDE_FILE("mbedtls/aes.h" HAVE_MBEDTLS_AES_H)
    LA_CHECK_INCLUDE_FILE("mbedtls/md.h" HAVE_MBEDTLS_MD_H)
    LA_CHECK_INCLUDE_FILE("mbedtls/pkcs5.h" HAVE_MBEDTLS_PKCS5_H)

  ENDIF(MBEDTLS_FOUND)
  MARK_AS_ADVANCED(CLEAR MBEDTLS_INCLUDE_DIRS)
  MARK_AS_ADVANCED(CLEAR MBEDCRYPTO_LIBRARY)
ENDIF(ENABLE_MBEDTLS)

#
a773 4
    SET(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
    SET(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
    LA_CHECK_INCLUDE_FILE("openssl/evp.h" HAVE_OPENSSL_EVP_H)
    CHECK_FUNCTION_EXISTS(PKCS5_PBKDF2_HMAC_SHA1 HAVE_PKCS5_PBKDF2_HMAC_SHA1)
a802 2
      ELSEIF("${IMPLEMENTATION}" MATCHES "^MBEDTLS$" AND NOT MBEDTLS_FOUND)
        SET(ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} FALSE)
a817 5
	ELSEIF("${IMPLEMENTATION}" MATCHES "^MBEDTLS$" AND MBEDTLS_FOUND)
	    SET(TRY_CRYPTO_REQUIRED_INCLUDES
	      "${TRY_CRYPTO_REQUIRED_INCLUDES};${MBEDTLS_INCLUDE_DIRS}")
	    SET(TRY_CRYPTO_REQUIRED_LIBS
	      "-DLINK_LIBRARIES:STRING=${MBEDCRYPTO_LIBRARY}")
d986 1
a986 1
      # success of iconv detection with a warning which success is a miss
d1219 2
a1220 2
  IF(ENABLE_LIBGCC)
    FIND_PACKAGE(LIBGCC)
a1221 1
    MESSAGE(FATAL_ERROR "libgcc not found.")
a1301 1
CHECK_FUNCTION_EXISTS_GLIBC(fnmatch HAVE_FNMATCH)
a1313 1
CHECK_FUNCTION_EXISTS_GLIBC(getline HAVE_GETLINE)
a1322 1
CHECK_FUNCTION_EXISTS_GLIBC(linkat HAVE_LINKAT)
a1348 1
CHECK_FUNCTION_EXISTS_GLIBC(strnlen HAVE_STRNLEN)
d1364 1
d1367 2
a1368 4
CHECK_SYMBOL_EXISTS(ctime_s "time.h" HAVE_CTIME_S)
CHECK_SYMBOL_EXISTS(gmtime_s "time.h" HAVE_GMTIME_S)
CHECK_SYMBOL_EXISTS(localtime_s "time.h" HAVE_LOCALTIME_S)
CHECK_SYMBOL_EXISTS(_mkgmtime "time.h" HAVE__MKGMTIME)
a1389 4
CHECK_C_SOURCE_COMPILES(
  "#include <sys/types.h>\n#include <sys/mount.h>\nint main(void) { struct statfs s; return sizeof(s);}"
  HAVE_STRUCT_STATFS)

d1407 1
d1419 4
a1460 1
IF(HAVE_STRUCT_STATFS)
a1463 4
# Check for f_iosize in struct statfs
CHECK_STRUCT_HAS_MEMBER("struct statfs" f_iosize
    "sys/param.h;sys/mount.h" HAVE_STRUCT_STATFS_F_IOSIZE)
ENDIF(HAVE_STRUCT_STATFS)
d1497 1
a1497 1
    "sys/types.h;sys/time.h;time.h" HAVE_SYS_TIME_H)
d1503 9
a1511 9
CHECK_TYPE_SIZE("short" SIZEOF_SHORT)
CHECK_TYPE_SIZE("int" SIZEOF_INT)
CHECK_TYPE_SIZE("long" SIZEOF_LONG)
CHECK_TYPE_SIZE("long long"     SIZEOF_LONG_LONG)

CHECK_TYPE_SIZE("unsigned short" SIZEOF_UNSIGNED_SHORT)
CHECK_TYPE_SIZE("unsigned" SIZEOF_UNSIGNED)
CHECK_TYPE_SIZE("unsigned long" SIZEOF_UNSIGNED_LONG)
CHECK_TYPE_SIZE("unsigned long long" SIZEOF_UNSIGNED_LONG_LONG)
a1962 1
CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" MBEDTLS)
a1970 11
# Check visibility annotations
SET(OLD_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fvisibility=hidden -Werror")
CHECK_C_SOURCE_COMPILES("void __attribute__((visibility(\"default\"))) foo(void);
int main() { return 0; }" HAVE_VISIBILITY_ATTR)
IF (HAVE_VISIBILITY_ATTR)
  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
  ADD_DEFINITIONS(-D__LIBARCHIVE_ENABLE_VISIBILITY)
ENDIF(HAVE_VISIBILITY_ATTR)
SET(CMAKE_REQUIRED_FLAGS "${OLD_CMAKE_REQUIRED_FLAGS}")

a2004 5
IF(APPLE)
  # CC_MD5_Init() functions are deprecated on macOS 10.15, but we want to use them
  ADD_DEFINITIONS(-Wno-deprecated-declarations)
ENDIF(APPLE)

a2012 1
add_subdirectory(unzip)
@


1.1.1.10
log
@libarchive: import version 3.7.3
@
text
@a8 3
if(POLICY CMP0075)
  cmake_policy(SET CMP0075 NEW) #3.12.0 `check_include_file()`` and friends use ``CMAKE_REQUIRED_LIBRARIES``.
endif()
a22 1
#   None           : No build type
d34 1
a34 1
       MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel|None)\$")
d37 1
a37 1
          "Acceptable keywords: Debug,Release,RelWithDebInfo,MinSizeRel,None")
d39 1
a39 1
          MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel|None)\$")
d127 2
a137 3
  ELSE()
    SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-dead_strip")
    SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-dead_strip")
a218 1
OPTION(ENABLE_PCRE2POSIX "Enable the use of the system PCRE2POSIX library if found" ON)
d526 1
a526 1
    "#include <lzma.h>\n#if LZMA_VERSION < 50020000\n#error unsupported\n#endif\nint main(void){int ignored __attribute__((unused)); ignored = lzma_stream_encoder_mt(0, 0); return 0;}"
d657 1
a657 1
  CHECK_FUNCTION_EXISTS(ZSTD_compressStream HAVE_ZSTD_compressStream)
d1190 1
a1190 1
IF(ENABLE_LIBXML2 AND HAVE_ICONV)
a1350 62
IF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCRE2POSIX)$")
  #
  # If requested, try finding library for PCRE2POSIX
  #
  IF(ENABLE_LIBGCC)
    FIND_PACKAGE(LIBGCC)
  ELSE()
    MESSAGE(FATAL_ERROR "libgcc not found.")
    SET(LIBGCC_FOUND FALSE) # Override cached value
  ENDIF()
  IF(ENABLE_PCRE2POSIX)
    FIND_PACKAGE(PCRE2POSIX)
  ELSE()
    SET(PCRE2POSIX_FOUND FALSE) # Override cached value
  ENDIF()
  IF(PCRE2POSIX_FOUND)
    INCLUDE_DIRECTORIES(${PCRE2_INCLUDE_DIR})
    LIST(APPEND ADDITIONAL_LIBS ${PCRE2POSIX_LIBRARIES})
    # Test if a macro is needed for the library.
    TRY_MACRO_FOR_LIBRARY(
      "${PCRE2_INCLUDE_DIR}" "${PCRE2POSIX_LIBRARIES}"
      COMPILES
      "#include <pcre2posix.h>\nint main() {regex_t r;return pcre2_regcomp(&r, \"\", 0);}"
      "WITHOUT_PCRE2_STATIC;PCRE2_STATIC")
    IF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC)
      ADD_DEFINITIONS(-DPCRE2_STATIC)
	ELSEIF(NOT WITHOUT_PCRE2_STATIC AND NOT PCRE2_STATIC AND PCRE2_FOUND)
	  # Determine if pcre2 static libraries are to be used.
      LIST(APPEND ADDITIONAL_LIBS ${PCRE2_LIBRARIES})
      SET(TMP_LIBRARIES ${PCRE2POSIX_LIBRARIES} ${PCRE2_LIBRARIES})
      MESSAGE(STATUS "trying again with -lpcre2-8 included")
      TRY_MACRO_FOR_LIBRARY(
        "${PCRE2_INCLUDE_DIR}" "${TMP_LIBRARIES}"
        COMPILES
        "#include <pcre2posix.h>\nint main() {regex_t r;return pcre2_regcomp(&r, \"\", 0);}"
        "WITHOUT_PCRE2_STATIC;PCRE2_STATIC")
      IF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC)
        ADD_DEFINITIONS(-DPCRE2_STATIC)
      ELSEIF(NOT WITHOUT_PCRE2_STATIC AND NOT PCRE2_STATIC AND MSVC AND LIBGCC_FOUND)
        # When doing a Visual Studio build using pcre2 static libraries
        # built using the mingw toolchain, -lgcc is needed to resolve
        # ___chkstk_ms.
        MESSAGE(STATUS "Visual Studio build detected, trying again with -lgcc included")
        LIST(APPEND ADDITIONAL_LIBS ${LIBGCC_LIBRARIES})
        SET(TMP_LIBRARIES ${PCRE2POSIX_LIBRARIES} ${PCRE2_LIBRARIES} ${LIBGCC_LIBRARIES})
          TRY_MACRO_FOR_LIBRARY(
            "${PCRE2_INCLUDE_DIR}" "${TMP_LIBRARIES}"
            COMPILES
            "#include <pcre2posix.h>\nint main() {regex_t r;return pcre2_regcomp(&r, \"\", 0);}"
            "WITHOUT_PCRE2_STATIC;PCRE2_STATIC")
          IF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC)
            ADD_DEFINITIONS(-DPCRE2_STATIC)
          ENDIF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC)
      ENDIF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC)
    ENDIF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC)
  ENDIF(PCRE2POSIX_FOUND)
  MARK_AS_ADVANCED(CLEAR PCRE2_INCLUDE_DIR)
  MARK_AS_ADVANCED(CLEAR PCRE2POSIX_LIBRARIES)
  MARK_AS_ADVANCED(CLEAR PCRE2_LIBRARIES)
  MARK_AS_ADVANCED(CLEAR LIBGCC_LIBRARIES)
ENDIF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCRE2POSIX)$")

@


1.1.1.11
log
@Libarchive 3.7.4 is a bugfix and security release

Security fixes:

rar: Fix OOB in rar e8 filter (CVE-2024-26256)
zip: Fix out of boundary access

Important bugfixes:

7zip: Limit amount of properties
bsdtar: Fix error handling around strtol() usages
passphrase: Improve newline handling on Windows
passphrase: Never allow empty passwords
rar: Fix "File CRC Error" when extracting specific rar4 archives
xar: Avoid infinite link loop
zip: Update AppleDouble support for directories
zstd: Implement core detection
@
text
@d37 2
a38 4
# Convert the CMAKE_BUILD_TYPE to uppercase to perform a case-insensitive comparison.
string(TOUPPER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_UPPER)
IF(NOT "${CMAKE_BUILD_TYPE_UPPER}"
       MATCHES "^(DEBUG|RELEASE|RELWITHDEBINFO|MINSIZEREL|NONE)\$")
d41 3
a43 3
          "Acceptable keywords: Debug, Release, RelWithDebInfo, MinSizeRel, None")
ENDIF(NOT "${CMAKE_BUILD_TYPE_UPPER}"
       MATCHES "^(DEBUG|RELEASE|RELWITHDEBINFO|MINSIZEREL|NONE)\$")
a1497 1
CHECK_FUNCTION_EXISTS_GLIBC(sysconf HAVE_SYSCONF)
@


1.1.1.12
log
@libarchive: imported version 3.7.5

Libarchive 3.7.5

Security fixes:

fix multiple vulnerabilities identified by SAST
cpio: ignore out-of-range gid/uid/size/ino and harden AFIO parsing
lzop: prevent integer overflow
rar4: protect copy_from_lzss_window_to_unp()
rar4: fix CVE-2024-26256
rar4: fix OOB in delta and audio filter
rar4: fix out of boundary access with large files
rar4: add boundary checks to rgb filter
rar4: fix OOB access with unicode filenames
rar5: clear 'data ready' cache on window buffer reallocs
rpm: calculate huge header sizes correctly
unzip: unify EOF handling
util: fix out of boundary access in mktemp functions
uu: stop processing if lines are too long

Important bugfixes:

7zip: fix issue when skipping first file in 7zip archive that is a multiple of 65536 bytes
ar: fix archive entries having no type
lha: do not allow negative file sizes
lha: fix integer truncation on 32-bit systems
shar: check strdup return value
rar5: don't try to read rediculously long names
xar: fix another infinite loop and expat error handling
many Windows fixes, cleanups and improvements
@
text
@a2 4
if(APPLE AND CMAKE_VERSION VERSION_LESS "3.17.0")
  message(WARNING "CMake>=3.17.0 required to make the generated shared library have the same Mach-O headers as autotools")
endif()

d86 3
a88 15
# Set SOVERSION so it matches libtool's conventions
# libtool accepts a string "current:revision:age"; in libarchive, that's set to
# - current: ${INTERFACE_VERSION} = 13 + ${_minor}
# - revision: ${_revision}
# - age: ${_minor}
# Since libtool computes SOVERSION as "current - age", it's just '13' again
math(EXPR SOVERSION "${INTERFACE_VERSION} - ${_minor}")
set(SOVERSION_FULL "${SOVERSION}.${_trimmed_minor}.${_trimmed_revision}")

# Override CMake's default shared library versioning scheme, which uses SOVERSION and VERSION,
# to match libtool's conventions (see https://github.com/mesonbuild/meson/issues/1451)
# - compatibility version: current + 1 = ${INTERFACE_VERSION} + 1
# - current version: ${current + 1}.${revision}
math(EXPR MACHO_COMPATIBILITY_VERSION "${INTERFACE_VERSION} + 1")
set(MACHO_CURRENT_VERSION "${MACHO_COMPATIBILITY_VERSION}.${_revision}")
d110 1
a110 1
    CMAKE_C_COMPILER_ID MATCHES "^Clang$" AND NOT MSVC)
d147 1
a147 1
       CMAKE_C_COMPILER_ID MATCHES "^Clang$" AND NOT MSVC)
d446 1
a446 4
  # Require zlib >= 1.2.1, see: https://github.com/libarchive/libarchive/issues/615
  # zlib 1.2.0 should also work, but it is difficult to test for. Let's require
  # zlib >= 1.2.1 for consistency with the autoconf build.
  FIND_PACKAGE(ZLIB 1.2.1)
d746 1
a2176 5
OPTION(DONT_FAIL_ON_CRC_ERROR "Ignore CRC errors during parsing (For fuzzing)" OFF)
IF(DONT_FAIL_ON_CRC_ERROR)
  ADD_DEFINITIONS(-DDONT_FAIL_ON_CRC_ERROR=1)
ENDIF(DONT_FAIL_ON_CRC_ERROR)

@


1.1.1.13
log
@libarchove: import version 3.7.7
@
text
@a883 8
# libbsd for readpassphrase on Haiku
IF("${CMAKE_SYSTEM_NAME}" MATCHES "Haiku")
  MESSAGE(STATUS "Adding libbsd for Haiku")
  SET(CMAKE_REQUIRED_LIBRARIES "bsd")
  FIND_LIBRARY(LIBBSD_LIBRARY NAMES bsd)
  LIST(APPEND ADDITIONAL_LIBS ${LIBBSD_LIBRARY})
ENDIF("${CMAKE_SYSTEM_NAME}" MATCHES "Haiku")

@


1.1.1.14
log
@libarchive: imported version 3.7.9
@
text
@d2 4
a5 1
cmake_minimum_required(VERSION 3.17 FATAL_ERROR)
d7 10
d296 12
a1526 2
CHECK_FUNCTION_EXISTS_GLIBC(tcgetattr HAVE_TCGETATTR)
CHECK_FUNCTION_EXISTS_GLIBC(tcsetattr HAVE_TCSETATTR)
d1536 3
a1538 3
check_symbol_exists(wcscmp wchar.h HAVE_WCSCMP)
check_symbol_exists(wcscpy wchar.h HAVE_WCSCPY)
check_symbol_exists(wcslen wchar.h HAVE_WCSLEN)
d2198 5
@


1.1.1.15
log
@libarchive: import version 3.8.0

Libarchive 3.8.0 is a feature and bugfix release.

New features:
bsdtar: support --mtime and --clamp-mtime
lib: mbedtls 3.x compatibility
7-zip reader: improve self-extracting archive detection
xar: xmllite support for the XAR reader and writer
zip writer: added XZ, LZMA, ZSTD and BZIP2 support
zip writer: added LZMA + RISCV BCJ filter

Notable security fixes:
rar: do not skip past EOF while reading
rar: fix double free with over 4 billion nodes
rar: fix heap-buffer-overflow
warc: prevent signed integer overflow
tar: fix overflow in build_ustar_entry

Notable bugfixes:
bsdtar: don't hardlink negative inode files together
gz: allow setting the original filename for gzip compressed files
lib: improve lseek handling
lib: support @@-prefixed Unix epoch timestamps as date strings
rar: support large headers on 32 bit systems
tar reader: Improve LFS support on 32 bit systems
@
text
@a96 3
# Enable the pkg-config helpers.
INCLUDE(FindPkgConfig)

a227 1
OPTION(ENABLE_WIN32_XMLLITE "Enable the use of the Windows XmlLite library if found" ON)
d356 4
a359 6
  IF(ENABLE_INSTALL)
    FOREACH (_man ${ARGV})
      STRING(REGEX REPLACE "^.+[.]([1-9])" "\\1" _mansect ${_man})
      INSTALL(FILES ${_man} DESTINATION "share/man/man${_mansect}")
    ENDFOREACH (_man)
  ENDIF(ENABLE_INSTALL)
a583 1
  UNSET(LIBB2_PKGCONFIG_VERSION CACHE)
a595 4
  pkg_check_modules(LIBB2 libb2)
  IF(LIBB2_VERSION)
    SET(LIBB2_PKGCONFIG_VERSION LIBB2_VERSION)
  ENDIF(LIBB2_VERSION)
a597 1
  UNSET(LIBB2_PKGCONFIG_VERSION CACHE)
a659 1
  CHECK_FUNCTION_EXISTS(ZSTD_minCLevel HAVE_ZSTD_minCLevel)
d668 1
d799 1
a799 1
    LA_CHECK_INCLUDE_FILE("mbedtls/version.h" HAVE_MBEDTLS_VERSION_H)
d822 1
a822 1
    LA_CHECK_INCLUDE_FILE("nettle/version.h" HAVE_NETTLE_VERSION_H)
a840 1
    LA_CHECK_INCLUDE_FILE("openssl/opensslv.h" HAVE_OPENSSL_OPENSSLV_H)
d1048 1
a1140 1
        SET(HAVE_LIBICONV 1)
a1183 1
  UNSET(HAVE_LIBICONV CACHE)
a1212 1
  CHECK_INCLUDE_FILES("libxml/xmlversion.h" HAVE_LIBXML_XMLVERSION_H)
a1239 19
  ELSE(EXPAT_FOUND)
    IF(WIN32 AND ENABLE_WIN32_XMLLITE)
      # Check linkage as well; versions of mingw-w64 before v11.0.0
      # do not contain an import library for xmllite.
      cmake_push_check_state()
      SET(CMAKE_REQUIRED_LIBRARIES "xmllite")
      check_c_source_compiles("
      #include <initguid.h>
      #include <xmllite.h>
      int main() {
        return CreateXmlReader(&IID_IXmlReader, NULL, NULL);
      }
      " HAVE_XMLLITE_H)
      cmake_pop_check_state()
      IF(HAVE_XMLLITE_H)
        SET(XMLLITE_FOUND TRUE)
        LIST(APPEND ADDITIONAL_LIBS "xmllite")
      ENDIF()
    ENDIF()
d1793 1
a1793 5
	  pkg_check_modules(LIBATTR libattr)
	  IF(LIBATTR_VERSION)
	    SET(LIBATTR_PKGCONFIG_VERSION ${LIBATTR_VERSION})
	  ENDIF(LIBATTR_VERSION)
  ELSE(HAVE_LIBATTR)
a1797 1
    UNSET(LIBATTR_PKGCONFIG_VERSION CACHE)
a1914 6
	  pkg_check_modules(LIBACL libacl)
	  IF(LIBACL_VERSION)
	    SET(LIBACL_PKGCONFIG_VERSION ${LIBACL_VERSION})
	  ENDIF(LIBACL_VERSION)
  ELSE(HAVE_LIBACL)
    UNSET(LIBACL_PKGCONFIG_VERSION CACHE)
a2053 6
	  pkg_check_modules(LIBRICHACL librichacl)
	  IF(LIBRICHACL_VERSION)
	    SET(LIBRICHACL_PKGCONFIG_VERSION ${LIBRICHACL_VERSION})
	  ENDIF(LIBRICHACL_VERSION)
  ELSE(HAVE_LIBRICHACL)
    UNSET(LIBRICHACL_PKGCONFIG_VERSION CACHE)
d2153 1
a2153 1
IF(WIN32 AND NOT CYGWIN AND ENABLE_INSTALL)
d2165 1
a2165 1
ENDIF(WIN32 AND NOT CYGWIN AND ENABLE_INSTALL)
@


1.1.1.16
log
@libarchive: import version 3.8.1
@
text
@d1260 1
a1260 1
      SET(CMAKE_REQUIRED_LIBRARIES "xmllite" "uuid")
d1271 1
a1271 1
        LIST(APPEND ADDITIONAL_LIBS "xmllite" "uuid")
@


1.1.1.17
log
@libarchive: imported version 3.8.2
@
text
@a5 3
# Include standard installation directories
include(GNUInstallDirs)
#
a257 4
IF(WIN32 AND MSVC)
  OPTION(MSVC_USE_STATIC_CRT "Use static CRT" OFF)
ENDIF()

a1474 2
CHECK_FUNCTION_EXISTS_GLIBC(closefrom HAVE_CLOSEFROM)
CHECK_FUNCTION_EXISTS_GLIBC(close_range HAVE_CLOSE_RANGE)
a1491 1
CHECK_FUNCTION_EXISTS_GLIBC(getegid HAVE_GETEGID)
a1495 1
CHECK_FUNCTION_EXISTS_GLIBC(getpid HAVE_GETPID)
d1498 1
a1498 2
CHECK_FUNCTION_EXISTS_GLIBC(getresgid HAVE_GETRESGID)
CHECK_FUNCTION_EXISTS_GLIBC(getresuid HAVE_GETRESUID)
a1500 1
CHECK_FUNCTION_EXISTS_GLIBC(issetugid HAVE_ISSETUGID)
d1582 6
@


1.1.1.18
log
@libarchive: import version 3.8.3
@
text
@a1531 1
CHECK_FUNCTION_EXISTS_GLIBC(posix_spawn HAVE_POSIX_SPAWN)
@


1.1.1.19
log
@libarchive: import version 3.8.5
@
text
@d142 1
a142 6
  IF(CMAKE_SYSTEM_NAME MATCHES "Darwin")
    SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-dead_strip")
    SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-dead_strip")
  ELSEIF(CMAKE_SYSTEM_NAME MATCHES "SunOS")
    # SunOS linker doesn't support --gc-sections
  ELSE()
d151 4
a154 1
  ENDIF()
d1088 2
a1089 2
      # success of iconv detection with a warning, which would be a false
      # positive.  So this is needed for all build modes, even in release mode.
@


1.1.1.20
log
@libarchive: imported version 3.8.7
@
text
@a749 1
LA_CHECK_INCLUDE_FILE("stdio.h" HAVE_STDIO_H)
@


1.1.1.21
log
@libarchive: import 3.8.8
@
text
@d344 1
a344 1
MACRO (GENERATE_LIST_H _listfile _cmlist _target __list_sources)
d346 18
a363 30
  # Remove _listfile, _cmlist, and _target from _argv
  LIST(REMOVE_AT _argv 0 1 2)
  # Convert source paths to absolute so discover_tests.cmake can find them
  # regardless of the working directory when cmake -P runs.
  SET(_gl_abs_sources "")
  FOREACH(_gl_src ${_argv})
    IF(IS_ABSOLUTE "${_gl_src}")
      LIST(APPEND _gl_abs_sources "${_gl_src}")
    ELSE()
      LIST(APPEND _gl_abs_sources "${CMAKE_CURRENT_SOURCE_DIR}/${_gl_src}")
    ENDIF()
  ENDFOREACH()
  # Stamp out discover_tests.cmake with source list and output path baked in.
  SET(SOURCES "${_gl_abs_sources}")
  SET(OUTPUT "${_listfile}")
  CONFIGURE_FILE(
    ${CMAKE_SOURCE_DIR}/build/cmake/discover_tests.cmake.in
    ${CMAKE_CURRENT_BINARY_DIR}/discover_tests.cmake
    @@ONLY)
  UNSET(SOURCES)
  UNSET(OUTPUT)
  # list.h is regenerated at build time whenever any test .c file changes.
  ADD_CUSTOM_COMMAND(
    OUTPUT "${_listfile}"
    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/discover_tests.cmake
    DEPENDS ${_gl_abs_sources}
    COMMENT "Generating ${_listfile}"
    VERBATIM)
  # Attaching list.h to the target tells CMake to build it before compiling.
  TARGET_SOURCES(${_target} PRIVATE "${_listfile}")
a364 30

#
# Register individual tests with CTest by scanning DEFINE_TEST() declarations.
#
MACRO (DISCOVER_TESTS _component __list_sources)
  IF(ENABLE_TEST)
    SET(_sources ${ARGV})
    LIST(REMOVE_AT _sources 0)
    FOREACH (_src ${_sources})
      IF (_src MATCHES "test_[^/]+\\.c$")
        FILE(STRINGS "${_src}" _lines REGEX "^DEFINE_TEST\(.*\)")
        FOREACH (_line ${_lines})
          STRING(REGEX MATCH "DEFINE_TEST\((.*)\)" _full_match ${_line})
          # CMake REGEX seems to handle ( and \( rather inconsistently...
          # So we go through an extra dance to definitively strip the parens
          STRING(REPLACE "(" "" _test_name_with_paren "${CMAKE_MATCH_1}")
          STRING(REPLACE ")" "" _test_name "${_test_name_with_paren}")
          SET(_full_test_name "${_component}_${_test_name}")
          ADD_TEST(NAME ${_full_test_name}
                   COMMAND ${_component}_test -vv
                                   -r ${CMAKE_CURRENT_SOURCE_DIR}
                                   -s
                                   ${_test_name})
          SET_TESTS_PROPERTIES(${_full_test_name} PROPERTIES SKIP_RETURN_CODE 2)
        ENDFOREACH (_line)
      ENDIF (_src MATCHES "test_[^/]+\\.c$")
    ENDFOREACH (_src)
  ENDIF(ENABLE_TEST)
ENDMACRO (DISCOVER_TESTS __list_sources)

d666 1
a666 1
  FIND_LIBRARY(ZSTD_LIBRARY NAMES zstd libzstd zstd_static HINTS ${PC_ZSTD_LIBDIR} ${PC_ZSTD_LIBRARY_DIRS})
a734 1
LA_CHECK_INCLUDE_FILE("intsafe.h" HAVE_INTSAFE_H)
a748 1
LA_CHECK_INCLUDE_FILE("stdckdint.h" HAVE_STDCKDINT_H)
a783 11
    # bcrypt supports these algorithms on all available versions
    SET(ARCHIVE_CRYPTO_MD5        1)
    SET(ARCHIVE_CRYPTO_MD5_WIN    1)
    SET(ARCHIVE_CRYPTO_SHA1       1)
    SET(ARCHIVE_CRYPTO_SHA1_WIN   1)
    SET(ARCHIVE_CRYPTO_SHA256     1)
    SET(ARCHIVE_CRYPTO_SHA256_WIN 1)
    SET(ARCHIVE_CRYPTO_SHA384     1)
    SET(ARCHIVE_CRYPTO_SHA384_WIN 1)
    SET(ARCHIVE_CRYPTO_SHA512     1)
    SET(ARCHIVE_CRYPTO_SHA512_WIN 1)
d789 1
a816 1
    CMAKE_PUSH_CHECK_STATE()
a821 2
    CMAKE_POP_CHECK_STATE()

a836 1
    CMAKE_PUSH_CHECK_STATE()
a844 2
    CMAKE_POP_CHECK_STATE()

a859 2

    CMAKE_PUSH_CHECK_STATE()
a864 2
    CMAKE_POP_CHECK_STATE()

a884 2

  CMAKE_PUSH_CHECK_STATE()
a887 2
  CMAKE_POP_CHECK_STATE()

d999 79
d2179 10
a2188 9
IF(CMAKE_SYSTEM_NAME MATCHES "Darwin")
  CHECK_CRYPTO("MD5;SHA1;SHA256;SHA384;SHA512" LIBSYSTEM)
ELSE()
  CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" LIBC)
  CHECK_CRYPTO("SHA256;SHA384;SHA512" LIBC2)
  CHECK_CRYPTO("SHA256;SHA384;SHA512" LIBC3)
  CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" MBEDTLS)
  CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" NETTLE)
  CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" OPENSSL)
d2190 1
a2190 3
  # Libmd has to be probed after OpenSSL.
  CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA512" LIBMD)
ENDIF()
@


