CMake <PROJECT-NAME>_SOURCE_DIR 变量范围
CMake <PROJECT-NAME>_SOURCE_DIR Variable Scope
基于线程" 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
在功能及其呼叫站点的上下文中很有用。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 将包含C样式数组的对象初始化为成员变量(C++)
- 当vector是tje全局变量时,c++中vector的内存管理
- 通过多个头文件使用常量变量
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 在UNIX系统中使用DIR查找文件的字节大小
- 执行函数时导致崩溃的变量