先讲一点上下文-我正在将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