Исключение собственных модулей распространения cmake с помощью `find_package()`

Cmake включает в себя различные модули распространения (т. е. размещенные внутри каталога Modules/ установки cmake; например, /usr/share/cmake-3.5/Modules/FindBoost.cmake).

Это создает проблемы при разработке кода, который включает внутренние библиотеки с именами, конфликтующими с этими модулями распространения, поскольку find_package(Xyz) находит модуль распространения (/usr/share/cmake-3.5/Modules/FindXyz.cmake), а не пользовательский модуль (/home/user/opt/lib/cmake/Xyz-config.cmake). Пробовал ставить CMAKE_FIND_ROOT_PATH и CMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY, но безрезультатно.

Как я могу заставить cmake исключить свои собственные модули распространения при оценке find_package()?

Просто передайте CONFIG или NO_MODULE на find_package звонок. Так что он не будет искать FindXXX.cmake модуль.

Tsyvarev 09.12.2020 20:41

@Tsyvarev О, отлично! Большое спасибо, пропустил. Хотите добавить в качестве ответа, чтобы я мог принять? В идеале я не хочу менять способ вызова find_package(), поскольку у меня может не быть доступа к этому (например, к стороннему репозиторию). Ваш комментарий привел меня к CMAKE_FIND_PACKAGE_PREFER_CONFIG, и я уверен, что это то, что я хочу.

sircolinton 09.12.2020 20:56

@Tsyvarev А, очень интересно, спасибо! Ваши комментарии решают мои разочарования и очень ценятся! Если вы вставите их в ответ, я отмечу их как принятые.

sircolinton 09.12.2020 23:33

Хм, на самом деле переменная Boost_NO_BOOST_CMAKE имеет противоположный эффект: будучи включенной, она запрещает скрипту FindBoost.cmake, поставляемому с CMake, искать скрипт конфигурации (boost-config.cmake). Я удалил свой предыдущий комментарий, так как он был неправильным.

Tsyvarev 10.12.2020 00:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
4
133
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как автор проекта, вы можете счесть «устаревший» скрипт поиска (FindXXX.cmake) неподходящим для вас и предпочесть вместо него использовать «современный» скрипт конфигурации (XXXConfig.cmake или config-xxx.cmake). В этом случае вы можете передать дополнительную опцию CONFIG или NO_MODULE в find_package:

find_package(Boost NO_MODULE)

Это предотвратит поиск скрипта FindBoost.cmake CMake и заставит его искать BoostConfig.cmake (или config-boost.cmake).

Если скрипт конфигурации не может быть найден с параметром NO_MODULE или CONFIG, то CMake сообщит об ошибке, даже если соответствующий скрипт поиска существует.

Кроме того, вы можете установить переменную CMAKE_FIND_PACKAGE_PREFER_CONFIG:

set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)

поэтому CMake сначала проверит скрипт конфигурации. Но если этот скрипт отсутствует, то CMake попытается использовать скрипт поиска.


Как пользователь проекта, вы можете найти скрипт конфигурации для какого-то пакета лучше, чем скрипт поиска... но в этом случае лучше ничего не менять: возможно, проект, который вы используете, может работать только со скриптом поиска, и не может работать с конфигом один. (Например, в проекте используются переменные, созданные скриптом поиска для ссылки на библиотеки, но скрипты конфигурации обычно создают ИМПОРТНЫЕ цели).

Спасибо; очень интересный момент относительно того, почему пользователи могут не захотеть этого делать.

sircolinton 10.12.2020 00:40

Обратите внимание, что мой ответ касается выбора между сценариями поиска (FindXXX.cmake) и сценариями конфигурации (XXXConfig.cmake). А точнее, о выборе между режимами MODULE и CONFIG find_package. Мой ответ НЕ касается выбора между несколькими установками пакета. Как пользователь проекта, для которого требуется какой-либо пакет, вы можете захотеть, чтобы CMake нашел конкретную установку этого пакета вместо «по умолчанию» (системной). А CMake предоставляет четко определенные механизмы для выражения ваших предпочтений. Но эти механизмы — отдельная история.

Tsyvarev 10.12.2020 09:19

Другие вопросы по теме