获取CMake configure_file调用的列表

2w3rbyxf  于 2022-11-11  发布在  其他
关注(0)|答案(2)|浏览(179)

首先介绍一下上下文-我正在将CMake构建系统转换为内部构建系统。为此,我迭代BUILDSYSTEM_TARGETS并使用get_property来获得我需要的所有属性,一切都正常,除了构建中缺少一些文件。在检查了原始构建系统中的CMakeLists.txt文件后,我意识到configure_file被用于许多非常随机的地方。
我***假设***CMake正在内部存储configure_file调用。如果是这样的话,是否可以访问它?

mtb9vblg

mtb9vblg1#

Tsyvarev的重新定义configure_file的答案是可行的,但是要注意克雷格Scott(CMake的维护者之一)有an article recommending against redefining CMake commands。使用内部下划线前缀的命令依赖于未记录的行为,在未来的版本中可能会改变。使用这种技巧也可能导致无限递归。
对于您的场景,它可以正常工作,但如果您不想使用这种技巧,可以在cmake命令中使用--trace*参数。
--trace将cmake置于跟踪模式,这将打印所有调用的跟踪以及调用的来源。
--trace-expand类似于--trace,但变量已展开。
--trace-format=<format>允许您在human(一种人类可读的格式(默认值))或json-v1(打印JSON)之间选择。
--trace-redirect=<file>将cmake置于跟踪模式,并将跟踪输出重定向到文件而不是stderr。
因此,您可以使用human格式和grep来搜索configure_file,也可以使用json-v1并以您选择的语言编写一个脚本来搜索JSON中对configure_file的调用,还可以使用命令行工具(如jq)来执行搜索。

5f0d552i

5f0d552i2#

你可以在项目的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()

相关问题