CMake 将文件内容列表收集到多个子模块的变量中

CMake collect list of file contents into a variable from multiple submodules

一个最小的例子是:

root 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 文件,虽然可以这样做,但我想避免它。

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

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

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

此外,CMake 脚本会按照它们写入的顺序执行,因此文件中后面写入的任何内容都会稍后执行。