find_package (ACL REQUIRED) не останавливает обработку - PullRequest
2 голосов
/ 28 сентября 2019

В настоящее время я пытаюсь настроить систему сборки на основе CMake для моей небольшой библиотеки Си.Так как эта библиотека зависит от libacl, CMake должен проверить, присутствует ли она в системе или нет, если нет.

Поскольку предопределенного модуля FindACL нет, я использовал модуль из KDE.проект :

[...] check_include_files [...] find_library [...]

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}")
endif (ACL_HEADERS_FOUND AND ACL_LIBS AND ATTR_LIBS)

Я называю это с помощью следующего (минимального) 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,но не останавливает обработку, даже если в руководстве указано, что

Параметр REQUIRED прекращает обработку с сообщением об ошибке, если пакет не может быть найден.

Нужно ли явно проверять, установлено ли ACL_FOUND, с помощью оператора if?

Я использую 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

1 Ответ

1 голос
/ 29 сентября 2019

Похоже, что с некоторого времени CMake ожидает сценарий FindXXX.cmake (используемый в режиме MODULE для find_package) для проверки опции REQUIRED и выдачи ошибки при необходимости.Такое изменение в поведении CMake приводит к тому, что старые унаследованные сценарии «Поиск», такие как FindACL.cmake, будут повреждены.

Косвенное подтверждение этого можно найти в этой «Общей ошибке в модуле поиска», описанной в CMake wiki :

Модуль не проверяет _FIND_REQUIRED или _FIND_QUIETLY - и, таким образом, аргументы find_package QUIET и REQUIRED не будут работать

Итак, 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_package и заботится о его параметрах.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, которые обрабатываются в CONFIG режиме find_package, все по-другому.Эти сценарии должны только установить для переменной XXX_FOUND значение false, и CMake будет обрабатывать опцию REQUIRED самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...