Cmake find_包(需要ACL)未停止处理
我目前正试图为我的一个小型C库建立一个基于CMake的构建系统。由于此库依赖于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 )
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
)