获取CMake配置文件调用的列表



先讲一点上下文-我正在将CMake构建系统转换为内部构建系统。为此,我迭代BUILDSYSTEM_TARGETS并使用get_property来获得我需要的所有属性,并且一切都很好,除了构建中缺少一些文件。在检查了原始构建系统中的CMakeLists.txt文件后,我意识到configure_file在许多非常随机的地方使用。

假设CMake在内部存储configure_file调用。如果是这样的话,有可能访问这个吗?

Tsyvarev重新定义configure_file的答案是有效的,但请注意Craig Scott(CMake的维护者之一(有一篇文章建议不要重新定义CMake命令。使用内部带下划线前缀的命令依赖于未记录的行为,这些行为在未来版本中可能会发生变化。使用这个技巧也可能导致无限递归。

虽然对于您的场景来说,它工作得很好,但如果您想避免使用这种技巧,可以对cmake命令使用--trace*参数。

--trace将cmake置于跟踪模式,该模式将打印所有调用的跟踪以及从何处进行的调用。

--trace-expand--trace类似,但变量已展开。

--trace-format=<format>允许您在human(一种人类可读的格式(默认值((和json-v1(打印JSON(之间进行选择。

--trace-redirect=<file>将cmake置于跟踪模式,并将跟踪输出重定向到文件而不是stderr。

因此,您可以对configure_file使用人工格式和grep,也可以使用json-v1格式,并根据自己的选择编写一个脚本,在JSON中搜索对configure_file的调用。您也可以使用类似jq的comandline工具来进行搜索。

您可以在项目的CMakeLists.txt开始时将configure_file重新定义为函数(或宏(。通过这种方式,您可以在每次项目中调用函数时运行任意代码。

在重新定义函数的内部,您可以实现所需的逻辑。对于重定义中的调用原始函数,请使用带下划线前缀的名称(_configure_file(:

function(configure_file input output)
# ...
# Do something with the 'output' file. E.g. add it to the global list.
# ...
# After custom processing call original function with all parameters.
_configure_file(${input} ${output} ${ARGN})
endfunction()

注意,通常不鼓励重新定义CMake函数(至少,函数的下划线版本是未记录的功能(。但对于调试的目的,它看起来是合理的。此外,调试是引入这种强调功能的主要原因:https://gitlab.kitware.com/cmake/cmake/-/issues/23482