使用cmake构建时,如果CMake已经附带了一个,则阻止第三方库使用自己的find模块实现

时间:2013-05-04 15:18:21

标签: cmake openscenegraph

改述问题

如何控制CMake使用FindXXX.cmake模块的顺序?

我的确切问题

例如,OpenSceneGraph带有自己的FindZLIB,它不如FindZLIB Cmake自带的那么好.OSG附带的FindZLIB模块无法找到我的ZLIB安装。我在CMAKE_INSTALL_PREFIX路径中安装了ZLIB。

在构建期间,cmake警告我这件事。

OSG将模块路径设置为自己的目录,因此FindPNG(来自CMake)不正确地使用FindZLIB OpenSceneGraph自带的。因此,它找不到ZLIB。

如何防止这种情况发生? 我正在通过调用ExternalProject_Add来构建OpenSceneGraph。我读过设置一个cmake策略(准确地说CMP0017)可能会修复它吗?我不知道如何通过ExternalProject_Add。

更多详情

当cmake(从生成的visual studio解决方案调用)尝试配置和构建OSG时,这是相关的警告: 4> C语言中的CMake警告(dev)/ / 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.

1 个答案:

答案 0 :(得分:1)

您只需设置提到的cmake政策即可。我不知道如何通过ExternalProject_add来做到这一点,但它确实解决了这个问题。源分发附带的CMakeLists.txt文件有一个部分,其中已设置了一些cmake策略。您可以添加一行,将CMP0017策略设置为NEW,并删除此警告。

if (COMMAND cmake_policy)
    ...

    cmake_policy (SET CMP0017 NEW)

    ...
endif ()