首先介绍一下上下文-我正在将CMake构建系统转换为内部构建系统。为此,我迭代BUILDSYSTEM_TARGETS并使用get_property来获得我需要的所有属性,一切都正常,除了构建中缺少一些文件。在检查了原始构建系统中的CMakeLists.txt文件后,我意识到configure_file被用于许多非常随机的地方。我***假设***CMake正在内部存储configure_file调用。如果是这样的话,是否可以访问它?
BUILDSYSTEM_TARGETS
get_property
configure_file
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)来执行搜索。
cmake
--trace*
--trace
--trace-expand
--trace-format=<format>
human
json-v1
--trace-redirect=<file>
jq
5f0d552i2#
你可以在项目的CMakeLists.txt的开头将configure_file重新定义为一个函数(或宏),这样你就可以在每次调用项目中的函数时运行任意代码。在重新定义的函数中,你可以实现你需要的逻辑。在重新定义的函数中调用原始函数时,使用带下划线前缀的名称(_configure_file):
CMakeLists.txt
_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()
2条答案
按热度按时间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
)来执行搜索。5f0d552i2#
你可以在项目的
CMakeLists.txt
的开头将configure_file
重新定义为一个函数(或宏),这样你就可以在每次调用项目中的函数时运行任意代码。在重新定义的函数中,你可以实现你需要的逻辑。在重新定义的函数中调用原始函数时,使用带下划线前缀的名称(
_configure_file
):