CMake 2.8.11介绍了target_include_directories
和target_compile_definitions
。但是我工作的一些设备有2.8.9。而且我不想在那里编译和构建最新的CMake。那么我可以有条件地使用这些设备的替代方案是什么?
如何从CMakeLists.txt中检查此cmake是否有target_include_directories
?
答案 0 :(得分:1)
没有简单的方法可以在早期的CMake版本上获得此功能,因为它们所基于的相应目标属性(INTERFACE_INCLUDE_DIRECTORIES
和INTERFACE_COMPILE_DEFINITIONS
)都缺失。
这一点至关重要,因为CMake使用这些目标属性自动将公共和接口字段传播到依赖目标。从CMake代码模拟这种行为是相当困难的。对于一个内部项目,我们建立了一个系统,在CMake支持它之前的几年就可以做到这一点。这基本上需要为add_library
和add_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()