转换CMake构建系统时,如何获取configure_file调用的列表?
configure_file的调用信息 CMake确实会跟踪configure_file生成的文件,但这类信息并未直接暴露给get_property接口或BUILDSYSTEM_TARGETS遍历逻辑。不过可以通过以下几种方式提取这些数据:
方法1:解析CMake生成的构建日志文件
CMake在构建目录下会生成CMakeFiles/CMakeConfigureLog.yaml,该文件完整记录了所有configure_file的调用细节,包括源文件路径、目标输出路径、是否仅在内容变化时复制等参数。直接解析这个YAML文件即可获取所需信息。
文件示例片段:
configure_file:
source: "/project/include/config.h.in"
destination: "/build/include/config.h"
copy_only: false
escape_quotes: true
@ONLY: false
方法2:在CMake脚本中主动收集调用记录
如果可以修改原CMakeLists.txt(或通过钩子脚本注入逻辑),可以自定义全局属性来记录所有configure_file调用:
# 在项目顶层CMakeLists.txt开头添加 define_property(GLOBAL PROPERTY CONFIGURE_FILE_CALLS BRIEF_DOCS "所有configure_file调用记录" FULL_DOCS "存储每个configure_file调用的(源文件, 目标文件, 选项)元组" ) # 重写configure_file命令,先记录再执行原逻辑 function(configure_file) get_property(existing_calls GLOBAL PROPERTY CONFIGURE_FILE_CALLS) list(APPEND existing_calls "${ARGV}") set_property(GLOBAL PROPERTY CONFIGURE_FILE_CALLS "${existing_calls}") # 调用CMake原生的configure_file命令 _configure_file(${ARGV}) endfunction()
之后在遍历目标的阶段,通过get_property(all_config_calls GLOBAL PROPERTY CONFIGURE_FILE_CALLS)即可获取所有调用记录,再解析每个记录的参数即可。
方法3:利用CMake跟踪日志提取信息
运行CMake时添加--trace-expand参数,会生成详细的执行日志,其中包含所有configure_file的调用细节。通过过滤日志中包含configure_file(的行即可提取信息:
cmake --trace-expand .. | grep "configure_file("
这种方法无需修改CMake脚本,但日志量较大,需要做好过滤和解析工作。
需要注意:如果configure_file生成的文件未被任何构建目标依赖(比如独立生成的配置文件),这些文件确实不会出现在BUILDSYSTEM_TARGETS关联的属性中,必须通过上述方式单独收集。
内容的提问来源于stack exchange,提问作者Mircea Ispas

