Руководство по использованию зависимостей
Введение
Для разработчиков, желающих использовать CMake для потребления стороннего бинарного пакета, существует несколько способов оптимальной работы, зависящих от того, насколько сторонняя библиотека поддерживает CMake.
Файлы CMake, поставляемые с пакетом программного обеспечения, содержат инструкции по поиску каждой зависимости сборки. Некоторые зависимости сборки являются необязательными, то есть сборка может быть успешной с другим набором функций, если зависимость отсутствует, а некоторые зависимости являются обязательными. CMake ищет известные расположения каждой зависимости, и предоставленное программное обеспечение может предоставить дополнительные подсказки или расположения для CMake, чтобы найти каждую зависимость.
Если требуемая зависимость не найдена командой cmake(1), в кэш записывается запись, содержащая NOTFOUND значение. Это значение можно заменить, указав его в командной строке или в инструменте ccmake(1) или cmake-gui(1). Смотрите User Interaction Guide для получения дополнительной информации о настройке записей кэша.
Библиотеки, предоставляющие пакеты файлов конфигурации
Самый удобный способ для сторонних поставщиков предоставить бинарные файлы библиотеки для использования с CMake — это предоставить пакеты файлов конфигурации. Эти пакеты — текстовые файлы, поставляемые с библиотекой, которые инструктируют CMake, как использовать бинарные файлы библиотеки и связанные заголовки, вспомогательные инструменты и макросы CMake, предоставляемые библиотекой.
Файлы конфигурации обычно можно найти в каталоге, имя которого соответствует шаблону lib/cmake/<PackageName>, хотя они могут находиться и в других местах. <PackageName> соответствует использованию в коде CMake с командой find_package(), например, find_package(PackageName REQUIRED).
Каталог lib/cmake/<PackageName> будет содержать файл, имя которого либо <PackageName>Config.cmake, либо <PackageName>-config.cmake. Это точка входа в пакет для CMake. В каталоге также может находиться отдельный необязательный файл с именем <PackageName>ConfigVersion.cmake. Этот файл используется CMake для определения, соответствует ли версия стороннего пакета требованиям использования команды find_package(), которые задают ограничения версии. Указывать версию при использовании команды find_package() необязательно, даже если файл ConfigVersion присутствует.
Если файл Config.cmake найден, и указанная версия удовлетворяет требованиям, то команда CMake find_package() считает пакет найденным, и весь пакет библиотеки предполагается полным по задумке.
Могут быть дополнительные файлы, предоставляющие макросы CMake или импортированные цели для использования. CMake не навязывает никакой согласованности имен для этих файлов. Они связаны с основным файлом Config с помощью команды CMake include().
Invoking CMake с целью использования пакета сторонних бинарных файлов требует, чтобы команды cmake find_package() успешно нашли пакет. Если расположение пакета находится в каталоге, известном CMake, вызов find_package() должен быть успешным. Каталоги, известные cmake, зависят от платформы. Например, пакеты, установленные на Linux с помощью стандартного менеджера пакетов, будут найдены в префиксе /usr автоматически. Пакеты, установленные в Program Files на Windows, также будут найдены автоматически.
Пакеты, которые не найдены автоматически, находятся в местах, которые непредсказуемы для CMake, например, /opt/mylib или $HOME/dev/prefix. Это обычная ситуация, и CMake предоставляет несколько способов для пользователей указать местоположение таких библиотек.
Переменная CMAKE_PREFIX_PATH может быть установлена при вызове CMake. Она обрабатывается как список путей для поиска пакетов файлов конфигурации. Пакет, установленный в /opt/somepackage обычно устанавливает файлы конфигурации, такие как /opt/somepackage/lib/cmake/somePackage/SomePackageConfig.cmake. В этом случае /opt/somepackage необходимо добавить в CMAKE_PREFIX_PATH.
Переменная среды CMAKE_PREFIX_PATH также может быть заполнена префиксами для поиска пакетов. Как и переменная среды PATH, это список, и необходимо использовать разделитель элементов списка переменной среды, специфичный для платформы (: в Unix и ; в Windows).
Переменная CMAKE_PREFIX_PATH обеспечивает удобство в тех случаях, когда необходимо указать несколько префиксов или когда доступно несколько различных бинарных файлов пакета в одном префиксе. Пути к пакетам также могут быть указаны путем задания переменных, соответствующих <PackageName>_DIR, например, SomePackage_DIR. Обратите внимание, что это не префикс, а полный путь к каталогу, содержащему файл пакета в стиле конфигурации, например, /opt/somepackage/lib/cmake/SomePackage/ в приведенном выше примере.
Импортированные цели из пакетов
Сторонний пакет, который предоставляет пакеты файлов конфигурации, также может предоставлять импортированные цели. Они будут указаны в файлах, содержащих пути к файлам, специфичным для конфигурации, относящиеся к пакету, например, к библиотекам версий debug и release.
Часто документация стороннего пакета указывает имена доступных импортированных целей после успешного find_package для библиотеки. Эти имена импортированных целей могут использоваться с командой target_link_libraries().
Пример полного использования сторонней библиотеки может выглядеть следующим образом:
cmake_minimum_required(VERSION 3.10) project(MyExeProject VERSION 1.0.0) find_package(SomePackage REQUIRED) add_executable(MyExe main.cpp) target_link_libraries(MyExe PRIVATE SomePrefix::LibName)
Дополнительную информацию о разработке системы сборки CMake см. в cmake-buildsystem(7).
Библиотеки, не предоставляющие пакеты файлов конфигурации
Сторонние библиотеки, не предоставляющие пакеты файлов конфигурации, все же могут быть найдены с помощью команды find_package(), если доступен файл FindSomePackage.cmake.
Эти пакеты файлов модуля отличаются от пакетов файлов конфигурации тем, что:
- Их не должен предоставлять сторонний поставщик, за исключением, возможно, в виде документации
- Доступность файла
Find<PackageName>.cmakeне указывает на доступность самих бинарных файлов. - CMake не ищет в
CMAKE_PREFIX_PATHфайлыFind<PackageName>.cmake. Вместо этого CMake ищет такие файлы в переменнойCMAKE_MODULE_PATH. Пользователи часто задают значение для переменнойCMAKE_MODULE_PATHпри запуске CMake, и распространённой практикой является добавление вCMAKE_MODULE_PATHдля использования локальных пакетов файлов модулей. - CMake поставляет файлы
Find<PackageName>.cmakeдля некоторыхthird party packagesдля удобства в тех случаях, когда сторонний поставщик не предоставляет пакеты файлов конфигурации напрямую. Эти файлы представляют собой бремя обслуживания для CMake, поэтому новые модули Find обычно больше не добавляются в CMake. Сторонние поставщики должны предоставлять пакеты файлов конфигурации вместо того, чтобы полагаться на предоставление модуля Find CMake.
Пакеты файлов модулей также могут предоставлять импортированные цели. Пример полного поиска такого пакета может выглядеть следующим образом:
cmake_minimum_required(VERSION 3.10)
project(MyExeProject VERSION 1.0.0)
find_package(PNG REQUIRED)
# Add path to a FindSomePackage.cmake file
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
find_package(SomePackage REQUIRED)
add_executable(MyExe main.cpp)
target_link_libraries(MyExe PRIVATE
PNG::PNG
SomePrefix::LibName
)
Переменная <PackageName>_ROOT также ищется как префикс для вызовов find_package() с использованием пакетов модуль-файлы, таких как FindSomePackage.
© 2000–2021 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.21/guide/using-dependencies/index.html