Исключить функцию в конфигурации CMake

#configuration #cmake #autotools

#конфигурация #cmake #автоинструменты

Вопрос:

С помощью настройки autotool каждая функция может быть явно включена --with-feature=... / --enable-feature=... или явно отключена --without-feature / --disable-feature .

Некоторые сценарии поиска пакетов CMake сначала оценивают переменные feature_ROOT для поиска там, но это редкость и не рекомендуется. CMake оценивает несколько путей и пытается найти там библиотеки. Чтобы добавить компонент, которого нет в путях по умолчанию, можно добавить правильный путь.

Как можно отключить функцию, которая установлена в системе и, следовательно, обнаруживается настройкой CMake? Например, Java установлена по умолчанию ниже /usr и найдена CMake без добавления пути к CMake; как я могу отключить Java? Она всегда будет найдена.

Я не хочу вручную изменять CMakeCache.txt .

Подводя итог: у меня есть проект, который я не хочу / не могу изменять, у него есть find_package , и у меня установлен пакет (например, Java), но я не хочу, чтобы CMake использовал этот пакет. Я хочу, чтобы переключатель / флаг деактивировал установленный и обычно найденный пакет.

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

1. Для команды find_package существует множество вложенных опций. Например, если вы установите NO_DEFAULT_PATH , то поиск в стандартных расположениях будет отключен. how can I disable Java? Из документации : The caller may set variable JAVA_HOME to specify a Java installation prefix explicitly.

2. but it is uncommon and discouraged Ну, я не могу согласиться с разработчиками здесь) Я не вижу, что плохого, если у вас будет больше возможностей указать местоположение пакета. В этом случае вы можете исправить Find*.cmake модули по умолчанию и поместить их в свой репозиторий. Затем добавьте их CMAKE_MODULE_PATH и используйте.

3. Чтобы уточнить: я хочу отключить функцию с точки зрения пользователя, например, чтобы отключить неработающую установку Java. Изменение исходного кода не является вариантом.

4. Итак, у вас есть проект, который вы не можете изменить, и у которого есть команда find_package(Java) (и вы не хотите устанавливать java)? Я думаю, что выхода нет, тогда вам нужно изменить исходный код.

5. Создайте свой собственный FindJava.cmake файл и добавьте его в CMAKE_MODULE_PATH . Когда команда find_package будет вызвана, она загрузит вашу версию. Как насчет этого? 🙂

Ответ №1:

Как я обнаружил, это совсем не сложно. Чтобы предотвратить обнаружение моей функции, я передаю

 -DFEATURE_FOUND=FALSE
 

в CMake, а затем он не найден, даже при установке.

Или можно передать

 -DCMAKE_DISABLE_FIND_PACKAGE_FEATURE=TRUE
 

чтобы полностью отключить модуль поиска.