【发布时间】:2021-10-11 14:38:56
【问题描述】:
如果我有类似如下结构的项目树(每个子项目通过add_subdirectory()添加到父项目中):
CMakeLists.txt (TOP-LEVEL)
|
+ -- subproj1
| |
| + -- CMakeLists.txt (subproj1)
| |
| + -- subsubproj1
| |
| + -- CMakeLists.txt (subsubproj1)
|
+ -- subproj2
|
+ -- CMakeLists.txt (subproj2)
我想在subproj2 中公开subsubproj1 中的变量集。这个变量的性质无关紧要,但在我的例子中,它指向${CMAKE_CURRENT_SOURCE_DIR}/include,这是subsubproj1 的包含目录,(在我的例子中)是subproj2 使用的库。目前,我在每个中间 CMakeLists.txt 之间重新分配变量(此处为 subproj1),其中变量被分配了一个值到顶层并启用了 PARENT_SCOPE:
CMakeLists.txt (subsubproj1)
# Expose MY_VAR to subproj1
set(MY_VAR
"Hello"
PARENT_SCOPE
)
CMakeLists.txt (subproj1)
# Expose MY_VAR to top level project thus making it visible to all
set(MY_VAR
${MY_VAR}
PARENT_SCOPE
)
这可以应用于任意嵌套的项目树。
我的问题是做我上面描述的常见做法是什么?我可以将MY_VAR 声明为一个顶级变量,但如果出于某种原因我不想让它在那里可见(如书面文本)怎么办。在这种情况下,PARENT_SCOPE 不再是一个选项,而应该在顶层 CMakeLists.txt 中直接声明该变量?
【问题讨论】:
-
你说
I want to expose a variable set inside subsubproj1 in subproj2。所以:In which case is PARENT_SCOPE no longer an option and should be replaced with just a straight declaration of that variable in the top-level CMakeLists.txt?我不明白,在这种情况下,subsubproj1内部没有设置变量,所以违反了你的要求,所以在任何情况下都不应该替换它。what is the common practice of doing当您想在subsubproj1中设置一个可供父母使用的变量时,通常的做法是使用PARENT_SCOPE。 -
您的用例可能不那么广泛吗?你打算如何使用你的变量?做什么的?该变量的用途是什么?
subproj2打算如何使用它?变量会影响什么以及它的值如何变化? -
我将添加有关变量性质的详细信息。
-
通常你会使用缓存变量。这使得变量在任何地方都可见,但您不必担心通过目录层次结构传递变量。考虑到您对这是一个包含目录的描述,我看不出有理由不通过具有公共或接口可见性的
target_include_directory将目录添加到目标,这确保所有链接库都可以访问此包含目录,即使如果它们间接链接(只要除了最后一个链接之外的每个链接都具有公共或界面可见性)。
标签: cmake