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
文件,虽然可以这样做,但我想避免它。
- 有没有办法将信息向上转发两个范围,以便可以从根 CMake 访问它?
- 有没有办法确保在使用此信息(打印出最终消息)之前处理了所有子文件夹?在这种情况下,顺序无关紧要,只是将信息正确附加到根范围。不幸的是,我不确定 CMake 是否按照它在
CMakeLists.txt
文件中的顺序执行它。
通常你应该远离宏,但在你的情况下它们看起来是一个很好的解决方案。因此,将您的函数更改为这样的宏:
macro(add_file_contents FILE_NAME)
#<...>
endmacro()
宏不会引入新的作用域,因此父作用域将是父目录。
此外,CMake 脚本会按照它们写入的顺序执行,因此文件中后面写入的任何内容都会稍后执行。
一个最小的例子是:
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
文件,虽然可以这样做,但我想避免它。
- 有没有办法将信息向上转发两个范围,以便可以从根 CMake 访问它?
- 有没有办法确保在使用此信息(打印出最终消息)之前处理了所有子文件夹?在这种情况下,顺序无关紧要,只是将信息正确附加到根范围。不幸的是,我不确定 CMake 是否按照它在
CMakeLists.txt
文件中的顺序执行它。
通常你应该远离宏,但在你的情况下它们看起来是一个很好的解决方案。因此,将您的函数更改为这样的宏:
macro(add_file_contents FILE_NAME)
#<...>
endmacro()
宏不会引入新的作用域,因此父作用域将是父目录。
此外,CMake 脚本会按照它们写入的顺序执行,因此文件中后面写入的任何内容都会稍后执行。