保护代码取决于CMake版本

时间:2016-06-17 12:00:45

标签: cmake versioning

我们的项目有一个CMakeList.txt,但它不是我们的主要构建系统。在Mac OS X上,使用Cmake generates a warning(这里没有新内容):

MACOSX_RPATH is not specified for the following targets...

引用的问题/答案指出要使用set(CMAKE_MACOSX_RPATH 0)set(CMAKE_MACOSX_RPATH 1)。我们的问题是the feature is too new,它打破了现有的Cmake安装,就像在Ubuntu LTS或CentOS上找到的那样。我们需要保护其用于Cmake> = 2.8.12,但blog post不讨论如何操作。

搜索没有产生有用的结果:how to guard cmake directive。我无法找到相关结果可能是由于我对Cmake缺乏经验(其他人应该保留它)。

我们如何保护set(CMAKE_MACOSX_RPATH 0)set(CMAKE_MACOSX_RPATH 1)

请注意,我正在寻找cmake_minimum_required(VERSION 2.8.5 FATAL_ERROR)。我能说的最好的事情并不是一件可恶的事。从测试中我们知道它不会拒绝target_include_directories,即使target_include_directories不满足最低要求并导致Ubuntu LTS等下层客户端出现故障。

我认为我正在寻找的更接近C预处理器宏:

#define 2_8_12 ...
#if CMAKE_VERSION >= 2_8_12
set(CMAKE_MACOSX_RPATH 0)
#endif

3 个答案:

答案 0 :(得分:2)

if (CMAKE_VERSION VERSION_LESS 2.8.12)
  message("Not setting RPATH")
else()
  set(CMAKE_MACOSX_RPATH 0)
endif()

2.8.10的文档:https://cmake.org/cmake/help/v2.8.10/cmake.html#variable:CMAKE_VERSION

答案 1 :(得分:1)

或者,如果您只是想克服警告,您可以检查生成此警告的策略是否存在

if(POLICY CMP0042)
    set(CMAKE_MACOSX_RPATH 0)
endif()

这" if"表格在documentation中描述。

答案 2 :(得分:0)

为什么不为CMake正确处理它?有一个名为CMake RPATH handling的维基页面。根据你可以添加这样的东西:

string (TOLOWER ${CMAKE_SYSTEM_NAME} TARGET_OS)

if (TARGET_OS STREQUAL darwin)
    set (CMAKE_MACOSX_RPATH TRUE)
    set (CMAKE_SKIP_BUILD_RPATH FALSE)

    # Fix runtime paths on OS X 10.5 and less
    if (CMAKE_SYSTEM_VERSION VERSION_LESS "10.0.0")
        set (CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
    else()
        set (CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
    endif()

    set (CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
    set (CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

    list (FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir)

    if ("${isSystemDir}" STREQUAL "-1")
        set (CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
    endif ("${isSystemDir}" STREQUAL "-1")
endif()

此代码段应使用任何2.8.x版本修复CMP0042。