CMake将文件内容的集合列表从多个子模块中提取到一个变量中



一个最小的例子是:

根CMake:

cmake_minimum_required(VERSION 3.22)
project(cmake_add_file LANGUAGES CXX)
function(add_file_contents FILE_NAME)
file(READ ${FILE_NAME}  FILE_CONTENTS)
get_filename_component(STEM_FILE_NAME ${FILE_NAME} NAME_WE)
set(MY_ENTRIES "${MY_ENTRIES}${FILE_CONTENTS}" PARENT_SCOPE)
message("Adding contents of file ${FILE_NAME}: ${FILE_CONTENTS}")
endfunction()
add_subdirectory(sub1)
add_subdirectory(sub2)
message("I'd like to see a nice message from the submodules please: n ${MY_ENTRIES}")

sub1和sub2 CMake:

cmake_minimum_required(VERSION 3.22)
add_file_contents("message.txt")

当我为以上内容运行CMake时,它正确地输出了文件内容(在message.txt中(,但上次打印失败;

这是可以理解的,因为所有函数都会创建一个新的作用域,而设置PARENT_SCOPE只会在子文件夹的作用域中设置变量。我不想在子文件夹中再次转发它,因为在这种情况下,有很多子文件夹要附加CMakeLists.txt文件,虽然可以这样做,但我希望避免它。

  • 有没有办法将信息转发到两个作用域,以便从根CMake访问它
  • 是否有方法确保在使用此信息(打印出最终消息(之前处理了所有子文件夹?在这种情况下,顺序无关紧要,只是信息被正确地附加到根作用域。不幸的是,我不确定CMake是否按照CMakeLists.txt文件中的顺序执行此操作

通常你应该远离宏,但在你的情况下,它们看起来是一个很好的解决方案。因此,将您的函数更改为如下宏:

macro(add_file_contents FILE_NAME)
#<...>
endmacro()

宏不会引入新的作用域,因此父作用域将是父目录。

此外,CMake脚本按照它们编写的顺序执行,因此文件中稍后编写的内容都将稍后执行。

最新更新