CMake <PROJECT-NAME>_SOURCE_DIR 变量范围

CMake <PROJECT-NAME>_SOURCE_DIR Variable Scope

本文关键字:DIR 变量 SOURCE 范围 gt lt PROJECT-NAME CMake      更新时间:2023-10-16

基于线程" cmake变量范围,add_subDirectory",CMAKE SET命令仅在当前范围中设置变量,除非指定PARENT_SCOPE参数。

最近,当我查看项目命令时,将设置变量<PROJECT-NAME>_SOURCE_DIR<PROJECT-NAME>_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)的变量呢?<Module>_FOUND变量的范围是什么?谢谢!

我通过仔细查看cmake源代码来找出答案。项目命令实际上是在顶层设置高速缓存条目。这样,$proj1_SOURCE_DIR$proj1_BINARY_DIR将可用于其他兄弟姐妹范围。

https://github.com/kitware/cmake/blob/420874BFAA2077252525C60B20D1EE5B6EF5B6EF5ED9298/Source/cmprojectCompcommand.cxx #l30-l30-l40

总的来说,对于命令项目(ProJ1),CMAKE将做: set(proj1_SOURCE_DIR, CACHE STATIC "") set(proj1_BINARY_DIR, CACHE STATIC "")

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

来自 project的文档:

top级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在功能及其呼叫站点的上下文中很有用。