From: Tim Kientzle Date: Sun, 16 Aug 2009 00:21:30 +0000 (-0400) Subject: Issue 36: Fix acl probing on Linux. X-Git-Tag: v2.8.0~422 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=79150845c0362f6a24635ac74a81f1f551d2063d;p=thirdparty%2Flibarchive.git Issue 36: Fix acl probing on Linux. 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 --- diff --git a/CMakeLists.txt b/CMakeLists.txt index b81f795c4..c79dae1cc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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"