Как мне использовать find_package в CMakeLists.txt таким образом, если необязательная зависимость не установлена, я все равно получаю makefile?

#cmake

#cmake

Вопрос:

Моя цель — создать CMakeLists.txt файл, который создает набор программ для локальной системы. Если условия для создания некоторых программ не выполняются, я хочу иметь возможность создавать остальные программы. Камнем преткновения, похоже, является gtk, но имейте в виду, что я не думаю, что метод, специфичный для gtk, является лучшим выбором.

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

find_package(PkgConfig REQUIRED)

Чтобы настроить оболочку pkg-config pkg_check_Modules , и если вы не используете REQUIRED , вы можете проверить _FOUND переменную:

 pkg_check_Modules(FT REQUIRED freetype2)
if (FT_FOUND)
   message(STATIC "Found freetype2")
   #Continue and succeed, using FreeType library
else()
   message(STATIC "Didn't find freetype2")
   #Continue and succeed, without using FreeType library
endif()
 

Другие библиотеки, похоже, не работают с pkg_check_modules, поэтому я прибегнул к find_package

 find_package(GTK2 2.0 QUIET gtk)
if (GTK2_FOUND)
...
endif()
 

Вот полное сокращение:

 cmake_minimum_required(VERSION 3.6.2)
project (test C CXX)

set (SOURCE a.cpp b.cpp)
find_package(AMAZING 2.0 QUIET amazing_testing)
if (AMAZING_FOUND)
list(APPEND SOURCE c.cpp)
else()
list(APPEND SOURCE d.cpp)
endif()

add_executable(test ${SOURCE})

 

Вышесказанное позволяет полностью CMakeLists.txt чтобы перейти к концу, но я получаю сообщение об ошибке, makefile не создается, и build/CMakeFiles/CMakeOutput .в журнале даже не упоминается gtk:

 CMake Error at gtk/CMakeLists.txt:4 (find_package):
  find_package called with invalid argument "amazing_testing"

## here would be further cmake processing logs from other necessary setup

-- Configuring incomplete, errors occurred!
See also "/home/menright/bit/build/CMakeFiles/CMakeOutput.log".

 

Как я могу настроить такое использование find_package , чтобы, если необязательный пакет не существует, настройка в любом случае завершилась успешно? В качестве альтернативы, что я должен использовать вместо find_package этого, чтобы кратко настроить использование библиотеки так, как это делает pkg_check_modules, и все же разрешить успех, если библиотека недоступна?

Комментарии:

1. Просто find_package(AMAZING 2.0 QUIET) . Я не понимаю — find_package также есть REQUIRED опция, и она работает точно так же, как и в pkg_check_modules . И я тоже не понимаю but I get an error, — да, как говорится в ошибке: find_package called with invalid argument "amazing_testing" так что удалите этот аргумент.

2. @ZamilCuk, я думаю, у вас в принципе есть ответ. Похоже, что, хотя я прочитал документацию find_package, я пропустил одну из подробностей о том, как использовать команду. первый параметр pkg_check_modules — это корень имен переменных, которые он будет заполнять результатами. С другой стороны, find_package проще, поскольку первым параметром является корень переменных и имя пакета.