При сборке с помощью cmake запретите сторонней библиотеке использовать собственную реализацию модуля поиска, если CMake уже поставляется с одним

Перефразированный вопрос

Как я могу контролировать порядок, в котором CMake использует модули FindXXX.cmake?

Моя точная проблема

Например, OpenSceneGraph поставляется со своим собственным FindZLIB, который не так хорош, как FindZLIB Cmake. Модуль FindZLIB, поставляемый с OSG, не может найти мою установку ZLIB. У меня ZLIB установлен по пути CMAKE_INSTALL_PREFIX.

Во время сборки cmake предупреждает меня об этом.

OSG устанавливает путь к модулю в свой собственный каталог, и, таким образом, FindPNG (из CMake) неправильно использует FindZLIB OpenSceneGraph, поставляемый с ним. Итак, он не может найти ZLIB.

Как я могу предотвратить это? Я создаю OpenSceneGraph через вызов ExternalProject_Add. Я читал, что установка политики cmake (точнее, CMP0017) может это исправить? Я не знаю, как это сделать через ExternalProject_Add.

Подробнее

Это соответствующее предупреждение, когда cmake (вызванный из сгенерированного решения Visual Studio) пытается настроить и собрать OSG: 4> Предупреждение CMake (dev) в C:/Program Files (x86)/CMake 2.8/share/cmake-2.8/Modules /FindPNG.cmake:34 (find_package):

4>    File C:/Program Files (x86)/CMake 2.8/share/cmake-2.8/Modules/FindPNG.cmake
4>    includes E:/project/third-party/OpenSceneGraph/CMakeModules/FindZLIB.cmake
4>    (found via CMAKE_MODULE_PATH) which shadows C:/Program Files (x86)/CMake
4>    2.8/share/cmake-2.8/Modules/FindZLIB.cmake.  This may cause errors later on
4>    .
4>  
4>    Policy CMP0017 is not set: Prefer files from the CMake module directory
4>    when including from there.  Run "cmake --help-policy CMP0017" for policy
4>    details.  Use the cmake_policy command to set the policy and suppress this
4>    warning.

person Ed Rowlett-Barbu    schedule 04.05.2013    source источник
comment
Я думаю, вам придется изменить CMakeLists.txt OpenSceneGraph. Найдите строку, которая, вероятно, должна выглядеть примерно так: set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules ${CMAKE_MODULE_PATH}). Другими словами, он помещает собственный путь поиска модуля OSG перед путем CMake, чтобы он предшествовал ему.   -  person Alexander Shukaev    schedule 05.05.2013
comment
@Haroogan спасибо за комментарий Haroogan. Я знаю, как OSG меняет путь к модулю. У него также есть свои собственные модули, поэтому ему нужно установить путь к модулю, чтобы он мог их использовать. Я не могу просто удалить эту строку. Модифицировать его тоже не лучше, чем просто удалить модуль FindZLIB в OSG. Я бы предпочел обходной путь, который никоим образом не требует изменения исходных кодов OSG.   -  person Ed Rowlett-Barbu    schedule 05.05.2013
comment
Не удаляйте эту строку, конечно, просто измените порядок на: set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake/modules), чтобы модули CMake имели приоритет над модулями OSG, а ZLib находилась в соответствии с правилами CMake по умолчанию. К сожалению, я думаю, что у вас нет вариантов, это разработчики OSG виноваты в таком тупом решении, которое они предлагают.   -  person Alexander Shukaev    schedule 05.05.2013


Ответы (1)


Вы можете просто установить упомянутую политику cmake. Я не знаю, как это сделать через ExternalProject_add, но это решает проблему. В файле CMakeLists.txt, входящем в исходный дистрибутив, есть раздел, в котором уже заданы некоторые политики cmake. Вы можете добавить строку, которая устанавливает для политики CMP0017 значение NEW, и это избавит вас от этого предупреждения.

if (COMMAND cmake_policy)
    ...

    cmake_policy (SET CMP0017 NEW)

    ...
endif ()
person Kabbotta    schedule 26.07.2015