]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Issue 36: Fix acl probing on Linux.
authorTim Kientzle <kientzle@gmail.com>
Sun, 16 Aug 2009 00:21:30 +0000 (20:21 -0400)
committerTim Kientzle <kientzle@gmail.com>
Sun, 16 Aug 2009 00:21:30 +0000 (20:21 -0400)
I used the additional library checks directly from the patch provided.
Probing the functions properly proved a bit more challenging because
the indicated headers aren't the same on all systems.  Instead, I
generalized the existing header tests to build up a list ${INCLUDE}
of all headers present on the local system and used that.

SVN-Revision: 1376

CMakeLists.txt

index b81f795c4748736c439ca598127341ba24104140..c79dae1cc40c9c99a91223fa10b6a4e25c103cae 100644 (file)
@@ -182,62 +182,68 @@ ENDIF(LZMA_FOUND)
 CHECK_HEADER_STDC()
 CHECK_HEADER_DIRENT()
 
-CHECK_INCLUDE_FILE("acl/libacl.h" HAVE_ACL_LIBACL_H)
-CHECK_INCLUDE_FILE("attr/xattr.h" HAVE_ATTR_XATTR_H)
-CHECK_INCLUDE_FILE("ctype.h" HAVE_CTYPE_H)
-CHECK_INCLUDE_FILE("direct.h" HAVE_DIRECT_H)
-CHECK_INCLUDE_FILE("dlfcn.h" HAVE_DLFCN_H)
-CHECK_INCLUDE_FILE("errno.h" HAVE_ERRNO_H)
-CHECK_INCLUDE_FILE("ext2fs/ext2_fs.h" HAVE_EXT2FS_EXT2_FS_H)
-CHECK_INCLUDE_FILE("fcntl.h" HAVE_FCNTL_H)
-CHECK_INCLUDE_FILE("grp.h" HAVE_GRP_H)
-CHECK_INCLUDE_FILE("inttypes.h" HAVE_INTTYPES_H)
-CHECK_INCLUDE_FILE("io.h" HAVE_IO_H)
-CHECK_INCLUDE_FILE("langinfo.h" HAVE_LANGINFO_H)
-CHECK_INCLUDE_FILE("limits.h" HAVE_LIMITS_H)
-CHECK_INCLUDE_FILE("linux/fs.h" HAVE_LINUX_FS_H)
-CHECK_INCLUDE_FILE("locale.h" HAVE_LOCALE_H)
-CHECK_INCLUDE_FILE("memory.h" HAVE_MEMORY_H)
-CHECK_INCLUDE_FILE("paths.h" HAVE_PATHS_H)
-CHECK_INCLUDE_FILE("poll.h" HAVE_POLL_H)
-CHECK_INCLUDE_FILE("process.h" HAVE_PROCESS_H)
-CHECK_INCLUDE_FILE("pwd.h" HAVE_PWD_H)
-CHECK_INCLUDE_FILE("regex.h" HAVE_REGEX_H)
-CHECK_INCLUDE_FILE("signal.h" HAVE_SIGNAL_H)
-CHECK_INCLUDE_FILE("stdarg.h" HAVE_STDARG_H)
-CHECK_INCLUDE_FILE("stdint.h" HAVE_STDINT_H)
-CHECK_INCLUDE_FILE("stdlib.h" HAVE_STDLIB_H)
-CHECK_INCLUDE_FILE("string.h" HAVE_STRING_H)
-CHECK_INCLUDE_FILE("strings.h" HAVE_STRINGS_H)
-CHECK_INCLUDE_FILE("sys/acl.h" HAVE_SYS_ACL_H)
-CHECK_INCLUDE_FILE("sys/ioctl.h" HAVE_SYS_IOCTL_H)
-CHECK_INCLUDE_FILE("sys/mkdev.h" HAVE_SYS_MKDEV_H)
-CHECK_INCLUDE_FILE("sys/param.h" HAVE_SYS_PARAM_H)
-CHECK_INCLUDE_FILE("sys/poll.h" HAVE_SYS_POLL_H)
-CHECK_INCLUDE_FILE("sys/select.h" HAVE_SYS_SELECT_H)
-CHECK_INCLUDE_FILE("sys/stat.h" HAVE_SYS_STAT_H)
-CHECK_INCLUDE_FILE("sys/time.h" HAVE_SYS_TIME_H)
-CHECK_INCLUDE_FILE("sys/types.h" HAVE_SYS_TYPES_H)
-CHECK_INCLUDE_FILE("sys/utime.h" HAVE_SYS_UTIME_H)
-CHECK_INCLUDE_FILE("sys/wait.h" HAVE_SYS_WAIT_H)
-CHECK_INCLUDE_FILE("time.h" HAVE_TIME_H)
-CHECK_INCLUDE_FILE("unistd.h" HAVE_UNISTD_H)
-CHECK_INCLUDE_FILE("utime.h" HAVE_UTIME_H)
-CHECK_INCLUDE_FILE("wchar.h" HAVE_WCHAR_H)
-CHECK_INCLUDE_FILE("wctype.h" HAVE_WCTYPE_H)
-CHECK_INCLUDE_FILE("windows.h" HAVE_WINDOWS_H)
-
-IF(HAVE_SYS_TYPES_H)
-  SET(_sys_types_h "sys/types.h")
-ELSE(HAVE_SYS_TYPES_H)
-  UNSET(_sys_types_h)
-ENDIF(HAVE_SYS_TYPES_H)
+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)
+
+# Few headers that must precede other headers
+# Must precede sys/extattr.h on FreeBSD
+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("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)
+LA_CHECK_INCLUDE_FILE("fcntl.h" HAVE_FCNTL_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/fs.h" HAVE_LINUX_FS_H)
+LA_CHECK_INCLUDE_FILE("locale.h" HAVE_LOCALE_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("pwd.h" HAVE_PWD_H)
+LA_CHECK_INCLUDE_FILE("regex.h" HAVE_REGEX_H)
+LA_CHECK_INCLUDE_FILE("signal.h" HAVE_SIGNAL_H)
+LA_CHECK_INCLUDE_FILE("stdarg.h" HAVE_STDARG_H)
+LA_CHECK_INCLUDE_FILE("stdint.h" HAVE_STDINT_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/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/param.h" HAVE_SYS_PARAM_H)
+LA_CHECK_INCLUDE_FILE("sys/poll.h" HAVE_SYS_POLL_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/time.h" HAVE_SYS_TIME_H)
+LA_CHECK_INCLUDE_FILE("sys/utime.h" HAVE_SYS_UTIME_H)
+LA_CHECK_INCLUDE_FILE("sys/wait.h" HAVE_SYS_WAIT_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)
 
 
 #
 # Some headers require extra includes when they're available.
 #
-CHECK_INCLUDE_FILES("${_sys_types_h};sys/extattr.h" HAVE_SYS_EXTATTR_H)
 
 #
 # Find OpenSSL
@@ -250,16 +256,17 @@ ENDIF(OPENSSL_FOUND)
 #
 # Check MD5/RMD160/SHA headers
 #
-CHECK_INCLUDE_FILE("openssl/md5.h" HAVE_OPENSSL_MD5_H)
-CHECK_INCLUDE_FILE("openssl/ripemd.h" HAVE_OPENSSL_RIPEMD_H)
-CHECK_INCLUDE_FILE("openssl/sha.h" HAVE_OPENSSL_SHA_H)
-CHECK_INCLUDE_FILES(${_sys_types_h} "md5.h" HAVE_MD5_H)
-CHECK_INCLUDE_FILE("ripemd.h" HAVE_RIPEMD_H)
-CHECK_INCLUDE_FILE("rmd160.h" HAVE_RMD160_H)
-CHECK_INCLUDE_FILE("sha.h" HAVE_SHA_H)
-CHECK_INCLUDE_FILE("sha1.h" HAVE_SHA1_H)
-CHECK_INCLUDE_FILE("sha2.h" HAVE_SHA2_H)
-CHECK_INCLUDE_FILE("sha256.h" HAVE_SHA256_H)
+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
 #
@@ -573,8 +580,8 @@ CHECK_FILE_OFFSET_BITS()
 # Check for Extended Attribute libraries, headers, and functions
 #
 IF(ENABLE_XATTR)
-  CHECK_INCLUDE_FILE(attr/xattr.h     HAVE_ATTR_XATTR_H)
-  CHECK_INCLUDE_FILE(sys/xattr.h      HAVE_SYS_XATTR_H)
+  LA_CHECK_INCLUDE_FILE(attr/xattr.h     HAVE_ATTR_XATTR_H)
+  LA_CHECK_INCLUDE_FILE(sys/xattr.h      HAVE_SYS_XATTR_H)
   CHECK_LIBRARY_EXISTS(attr "setxattr" "" HAVE_ATTR_LIB)
   IF(HAVE_ATTR_LIB)
     SET(CMAKE_REQUIRED_LIBRARIES "attr")
@@ -603,6 +610,8 @@ IF(ENABLE_ACL)
   CHECK_LIBRARY_EXISTS(acl "acl_get_file" "" HAVE_ACL_LIB)
   IF(HAVE_ACL_LIB)
     SET(CMAKE_REQUIRED_LIBRARIES "acl")
+    FIND_LIBRARY(ACL_LIBRARY NAMES acl)
+    LIST(APPEND ADDITIONAL_LIBS ${ACL_LIBRARY})
   ENDIF(HAVE_ACL_LIB)
   #
   CHECK_FUNCTION_EXISTS_GLIBC(acl_create_entry HAVE_ACL_CREATE_ENTRY)
@@ -610,25 +619,21 @@ IF(ENABLE_ACL)
   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 "sys/types.h;sys/acl.h"    HAVE_ACL_PERMSET_T)
+  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_SYMBOL_EXISTS(acl_get_perm
-      "sys/types.h;sys/acl.h" HAVE_ACL_GET_PERM)
-  CHECK_SYMBOL_EXISTS(acl_get_perm_np
-      "sys/types.h;sys/acl.h" HAVE_ACL_GET_PERM_NP)
-  CHECK_SYMBOL_EXISTS(acl_get_link
-      "sys/types.h;sys/acl.h" HAVE_ACL_GET_LINK)
-  CHECK_SYMBOL_EXISTS(acl_get_link_np
-      "sys/types.h;sys/acl.h" HAVE_ACL_GET_LINK_NP)
+  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)
 
   # MacOS has an acl.h that isn't POSIX.  It can be detected by
   # checking for ACL_USER
-  CHECK_SYMBOL_EXISTS(ACL_USER         "sys/acl.h" HAVE_ACL_USER)
+  CHECK_SYMBOL_EXISTS(ACL_USER "${INCLUDES}" HAVE_ACL_USER)
 ENDIF(ENABLE_ACL)
 
 # Check whether printf() supports "%jd"