Cmake find_包(需要ACL)未停止处理

Cmake find_包(需要ACL)未停止处理,cmake,Cmake,我目前正试图为我的一个小型C库建立一个基于CMake的构建系统。由于此库依赖于libacl,CMake应验证它是否存在于系统中,否则将失败 由于没有预定义的FindACL模块,因此我使用了以下模块: 我使用以下(最小值)CMakeLists.txt: cmake_minimum_required(VERSION 3.12) project( cmaketest VERSION 1.0 DESCRIPTION "cmake test" LANGUAGES C )

我目前正试图为我的一个小型C库建立一个基于CMake的构建系统。由于此库依赖于
libacl
,CMake应验证它是否存在于系统中,否则将失败

由于没有预定义的
FindACL
模块,因此我使用了以下模块:

我使用以下(最小值)
CMakeLists.txt

cmake_minimum_required(VERSION 3.12)

project(
    cmaketest
    VERSION 1.0
    DESCRIPTION "cmake test"
    LANGUAGES C
)

set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
find_package(ACL REQUIRED) # ACL_LIBS
它正确地检测到我的系统缺少
libacl
includes,但不会停止处理,即使

如果找不到包,则所需选项将停止处理并显示错误消息

我是否必须通过
if
语句明确检查是否设置了
ACL\u FOUND

我正在使用CMake 3.13.4。终端输出:

-- The C compiler identification is GNU 8.3.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Looking for include file attr/libattr.h
-- Looking for include file attr/libattr.h - not found
-- Looking for include file sys/xattr.h
-- Looking for include file sys/xattr.h - found
-- Looking for include file sys/acl.h
-- Looking for include file sys/acl.h - not found
-- Looking for include file acl/libacl.h
-- Looking for include file acl/libacl.h - not found
-- Configuring done
-- Generating done
-- Build files have been written to: [redacted]/build

似乎有一段时间以来,CMake希望
FindXXX.CMake
脚本(在
find_package
模块模式中使用)检查所需选项,并在需要时发出错误。CMake行为中的这种变化使得旧的遗留“查找”脚本(如
FindACL.CMake
)被破坏

可在“查找模块中的常见错误”中找到间接确认,如中所述:

模块未选中“查找”或“需要” _安静地查找\u-因此查找\u包参数安静 并且要求将没有效果

因此,
FindACL.cmake
脚本可以重写如下:

# FindACL.cmake

# ...

if (ACL_HEADERS_FOUND AND ACL_LIBS AND ATTR_LIBS)
  set(ACL_FOUND TRUE)
  set(ACL_LIBS ${ACL_LIBS} ${ATTR_LIBS})
  message(STATUS "Found ACL support: ${ACL_LIBS}")
elif (ACL_FIND_REQUIRED)
  # ACL hasn't been found but REQUIRED. Emit an error.
  message(FATAL_ERROR "Cannot find ACL")
endif (ACL_HEADERS_FOUND AND ACL_LIBS AND ATTR_LIBS)
实际上,大多数“查找”脚本都使用特殊的帮助器,它设置
Find\u包的结果并关心它的选项
FindACL.cmake
也可以使用此帮助程序:

# FindACL.cmake

# ...

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(ACL
  # Use default message on fail.
  DEFAULT_MSG
  # Variables which should be true-evaluated for assume the package to be found
  ACL_HEADERS_FOUND ACL_LIBS ATTR_LIBS
)


XXXConfig.cmake
脚本的情况有所不同,它们是在
find\u package
CONFIG模式下处理的。这些脚本只应将
XXX\u FOUND
变量设置为false,CMake将自己处理所需的选项。

好的,然后我将调整脚本以发出错误,正如您所建议的那样。根据你的解释,我在官方的(?)教程中找到了一些支持你怀疑的线索:。非常感谢。是的,CMake Wiki可以被视为“官方”指南。谢谢你的链接,我已经将其添加到问题帖子中作为确认。(在此之前,我已经用CMake 3.5检查了您的代码及其在我的机器上的一些变体)。您使用的
FindACL.CMake
脚本似乎是一个遗留脚本(但是,在现代项目中使用)。你能在问题帖子中添加部分(原创!)脚本吗,这样在回购协议中更改脚本不会使你的问题无效?设置所找到的
ACL\u
变量的部分肯定足够了。当然!我已经添加了
FindACL.cmake
文件的相关部分。该链接还指向特定的修订,因此只要项目未移动,该链接就应保持有效。
# FindACL.cmake

# ...

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(ACL
  # Use default message on fail.
  DEFAULT_MSG
  # Variables which should be true-evaluated for assume the package to be found
  ACL_HEADERS_FOUND ACL_LIBS ATTR_LIBS
)