Как установить собственный модуль CMake-Find

Я настраиваю и упаковываю свою библиотеку с помощью CMake и CPack. Я написал свой собственный модуль поиска: FindMyLib.cmake.

Как указать CMake/CPack добавить этот файл в каталог модуля CMake, чтобы будущие разработчики могли просто указать FIND_PACKAGE(MyLib) для использования моей библиотеки?


person goocreations    schedule 26.05.2012    source источник


Ответы (3)


Вы можете установить CMAKE_MODULE_PATH и распространять свои собственные FindFoo.cmake вместе со своим проектом. Например:

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
person simont    schedule 26.05.2012
comment
Этот подход также предлагается здесь: cmake.org/Wiki/ - person Vincenzo Pii; 11.04.2014
comment
Это не ответ на вопрос. Идея заключается не в том, как пользователи MyLib могут включить его FindMyLib.cmake, а в том, как установить его, чтобы конечные пользователи могли использовать его как есть. То, что вы описываете, требует, чтобы пользователи MyLib скопировали файл .cmake в свое собственное дерево каталогов разработки... - person Alexis Wilke; 10.06.2015
comment
Есть ли какая-то особая причина для заглавной буквы М в модулях? - person einpoklum; 26.12.2016

Каталог модуля CMake является частью дерева установки самого CMake, и поэтому вам не следует пытаться что-либо добавлять туда.

Каталог модулей CMake содержит модули, которые были написаны или, по крайней мере, проверены Kitware, и добавление туда ваших собственных создаст впечатление у пользователей вашего проекта, что это относится и к вашему проекту.

Лучше просто установить FindMyLib.cmake в одно из мест, которые ищет find_package:

<prefix>/                                               (Windows)
<prefix>/(cmake|CMake)/                                 (Windows)
<prefix>/<name>*/                                       (Windows)
<prefix>/<name>*/(cmake|CMake)/                         (Windows)
<prefix>/(lib/<arch>|lib|share)/cmake/<name>*/          (Unix)
<prefix>/(lib/<arch>|lib|share)/<name>*/                (Unix)
<prefix>/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/  (Unix)
<prefix>/<name>.framework/Resources/                    (Apple)
<prefix>/<name>.framework/Resources/CMake/              (Apple)
<prefix>/<name>.framework/Versions/*/Resources/         (Apple)
<prefix>/<name>.framework/Versions/*/Resources/CMake/   (Apple)
<prefix>/<name>.app/Contents/Resources/                 (Apple)
<prefix>/<name>.app/Contents/Resources/CMake/           (Apple)


См. документацию для find_package, чтобы получить полную информацию о том, как find_package выполняет поиск. . Также в этом случае полезно руководство по упаковке CMake.

person Fraser    schedule 26.05.2012
comment
Вы должны отметить это как правильный ответ @goocreations. Кроме того, это слишком изящное решение. - person jackyalcine; 27.05.2013
comment
У меня это не сработало (используя cmake 3.3.1). Согласно документам, CMake ищет файл с именем Find‹package›.cmake в CMAKE_MODULE_PATH, за которым следует установка CMake. Однако я не могу найти, что это такое. Он ищет указанные выше пути для файлов конфигураций пакетов, а не для модулей CMake-Find. - person Joey Dumont; 08.09.2015
comment
Как значение <prefix> определяется CMake? - person nn0p; 07.09.2016
comment
Это задается CMAKE_SYSTEM_PREFIX_PATH или CMAKE_PREFIX_PATH - person Fraser; 12.09.2016
comment
Я думаю, что эти пути работают только для файлов <name>Config.cmake, а не для файлов find<name>.cmake. - person veio; 28.05.2020

Лучший способ позволить

будущие разработчики могут просто указать FIND_PACKAGE(MyLib) для использования моей библиотеки

заключается в написании файла конфигурации пакета (-config.cmake), а не модуля поиска. Затем файл конфигурации пакета должен быть установлен в одну из папок, где ищет модуль FindPackage (что-то вроде /lib/package/ или /lib/cmake/package, второе предпочтительнее)

Модуль FindPackage автоматически загрузит файл конфигурации, если сможет его там найти.

Вики CMake содержит более подробные инструкции по адресу https://gitlab.kitware.com/cmake/community/wikis/doc/tutorials/Packaging

person Triskeldeian    schedule 17.01.2016