“$ {CMAKE_CURRENT_SOURCE_DIR}”和“。”之间的区别是什么?在INCLUDE_DIRECTORIES?

时间:2015-06-08 09:16:01

标签: cmake

我应该使用

INCLUDE_DIRECTORIES(
    ${CMAKE_CURRENT_SOURCE_DIR}
)

{{1}}

有什么区别,如果有的话?我见过大多数“。”在现有代码中,但在互联网上搜索点有点困难......

2 个答案:

答案 0 :(得分:6)

这两个用途生成几乎相同的输出,因为CMake跟踪当前目录并替换"的出现。"使用" $ {CMAKE_CURRENT_SOURCE_DIR} /."。唯一的区别是"。" variant具有额外的路径组件" /."追加。

无论你选择哪一个都是品味问题。

答案 1 :(得分:2)

在您的情况下,您可以考虑全局设置CMAKE_INCLUDE_CURRENT_DIRON

关于您的问题,答案主要取决于您自己的偏好。我更喜欢相对路径变体,以便您CMakeLists.txt文件的可读性。

如果您在cmTargetIncludeDirectoriesCommand ::Join()SystemTools::FileIsFullPath()查看CMake的源代码,您会发现CMake检查了以下条件 - 扩展变量后 - 如果它会将CMAKE_CURRENT_SOURCE_DIR附加到包含路径:

  • 通常情况下包含生成器表达式
  • 在Windows上,的所有内容均以\/开头,第二个字符 :
  • 在Unix上,的所有内容都以/~
  • 开头

结果是以下CMake代码

include_directories(.)
get_directory_property(_inc_dirs INCLUDE_DIRECTORIES)
message("_inc_dirs: ${_inc_dirs}")

将显示

_inc_dirs: [...your CMakeLists.txt path ...]/.

CMake的这种自动和绝对路径前缀行为是有意义的,因为可以 - 并且经常建议 - 在CMake中进行源外树构建(另请参阅CMake policy CMP0021)。

您可以考虑将CMAKE_USE_RELATIVE_PATHS设置为ON,这会将生成构建环境期间的包含路径转换回相对于CMAKE_BINARY_DIR目录的路径(但它仅适用于Makefile生成器)。

其他一些参考资料: