CMake target_include_directories和target_compile_definitions替代

时间:2016-02-25 10:44:21

标签: c++ cmake

CMake 2.8.11介绍了target_include_directoriestarget_compile_definitions。但是我工作的一些设备有2.8.9。而且我不想在那里编译和构建最新的CMake。那么我可以有条件地使用这些设备的替代方案是什么?

如何从CMakeLists.txt中检查此cmake是否有target_include_directories

3 个答案:

答案 0 :(得分:1)

没有简单的方法可以在早期的CMake版本上获得此功能,因为它们所基于的相应目标属性(INTERFACE_INCLUDE_DIRECTORIESINTERFACE_COMPILE_DEFINITIONS)都缺失。

这一点至关重要,因为CMake使用这些目标属性自动将公共和接口字段传播到依赖目标。从CMake代码模拟这种行为是相当困难的。对于一个内部项目,我们建立了一个系统,在CMake支持它之前的几年就可以做到这一点。这基本上需要为add_libraryadd_executable编写自己的替换函数,以便通过用户定义的属性处理后台传播。然后,系统中的所有目标必须使用替换功能而不是原始CMake才能使系统正常工作。我会强烈建议重新考虑您的CMake升级政策,然后再选择此选项。

检查是否可以使用这些功能的最快方法是执行cmake_minimum_required(无论如何,您应该始终为所有项目执行此操作)。如果要使用这些命令,只需要至少2.8.11。如果你不能提出这个要求,那么首先使用这些功能是不可能的,你需要提出一个替代方案。在这种情况下,检查它们的存在是没有多大意义的。

答案 1 :(得分:0)

ComicSansMS在2.8.11之前无法进行仿真是正确的。

您可以使用

if (COMMAND target_include_directories)
endif()

if (COMMAND target_include_directories AND COMMAND target_compile_definitions)
endif()

作为对命令是否可用的测试。

答案 2 :(得分:-1)

  

如何从CMakeLists.txt内部检查此cmake是否有target_include_directories?

if (NOT CMAKE_VERSION VERSION_LESS 2.8.12)
  target_include_directories(...)
else()
  # Not available
endif()