【问题标题】:CMake <PROJECT-NAME>_SOURCE_DIR Variable ScopeCMake <PROJECT-NAME>_SOURCE_DIR 变量范围
【发布时间】:2018-05-20 18:05:58
【问题描述】:

基于thread "cmake variable scope, add_subdirectory",CMake set 命令将仅在当前范围内设置变量,除非指定了PARENT_SCOPE 参数。

最近,当我查看 project 命令时,根据 CMake 文档,将设置变量 &lt;PROJECT-NAME&gt;_SOURCE_DIR&lt;PROJECT-NAME&gt;_BINARY_DIR。但它没有提到这些变量的范围是什么。这些变量可以在其他子目录中使用吗?例如:

|- root | |- CMakeLists.txt // add_subdirectory(proj1); add_subdirectory(proj2) | | | |- proj1 | | |- CMakeLists.txt // project(proj1) | | | |- proj2 | | |- CMakeLists.txt // Does this have access to proj1_SOURCE_DIR or // poj1_BINARY_DIR?

对于像Find_Package 这样的其他命令的变量呢? &lt;Module&gt;_FOUND 变量的范围是什么?谢谢!

【问题讨论】:

    标签: c++ variables cmake


    【解决方案1】:

    我通过仔细查看 cmake 源代码找到了答案。 project 命令实际上是在顶层设置缓存条目。这样,$proj1_SOURCE_DIR$proj1_BINARY_DIR 将可用于其他同级作用域。

    https://github.com/Kitware/CMake/blob/420874bfaa20772525c60b20d1ee5b6ef5ed9298/Source/cmProjectCommand.cxx#L30-L40

    总之,对于命令 project(proj1),cmake 会做: set(proj1_SOURCE_DIR, CACHE STATIC "") set(proj1_BINARY_DIR, CACHE STATIC "")

    与常规的set(var value) 不同,缓存条目可以由其他同级作用域共享。

    【讨论】:

      【解决方案2】:

      来自project的文档:

      项目的顶级 CMakeLists.txt 文件必须包含 文字,直接调用 project() 命令;通过加载一个 include() 命令是不够的。如果不存在这样的调用,CMake 将 在启用默认语言的顶部隐式添加一个(C 和 CXX)。

      因此,这些变量已经存在,并在布局中传播范围。

      现在,project 命令通常应该在项目中使用一次,因为它设置了各种标志。如果您的其他子项目也需要自己构建为独立的,那么一个常见的习惯是有这样的检查:

      if(CURRENT_CMAKE_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
        project(foo CXX)
      
        # other stuff here
      endif()
      

      请注意,PARENT_SCOPE 在函数及其调用站点的上下文中很有用。

      【讨论】:

      • "范围......所以,proj2 cmake 文件不应该有权访问 proj1_SOURCE_DIR 等。"我不认为这是真的。
      • 是的,这不是很清楚。事实上,它们的行为与其他 var 相同,但在 when 定义它们时会得到特殊处理。更新了我的答案以反映这一点。另请注意,add_subdirectory 的顺序仍然扮演通常的角色。
      • 感谢您对此进行调查。你可以看看我的发现,看看我是否遗漏了什么。
      猜你喜欢
      • 2021-10-24
      • 1970-01-01
      • 2020-08-10
      • 2014-01-31
      • 2021-12-22
      相关资源
      最近更新 更多