代码生成器生成自己的 CMake 文件和目标



假设我有一个脚本,它生成一组源文件,形成我想在CMakeLists.txt中链接的目标。如果后者知道文件名,则通常的add_custom_target()add_custom_command()命令将使生成的文件用作目标源成为可能。

但是,让我们假设只有生成器脚本知道文件名和位置。如何生成目标库,以便父CMakeLists.txt可以在不知道实际文件名的情况下链接到它?

请注意,依赖项主题不在此问题的范围内,因为脚本知道何时重新生成。这不是 CMake 的最佳用途,但在此用例中就足够了。

想法#1

该脚本还使用include(generated.cmake)生成父文件包含的generated.cmake文件。问题:CMake 找不到generated.cmake,因为它在配置时不存在。

想法#2

与想法 #1 类似,但脚本是随execute_process()一起调用的,因此generated.cmake在配置时存在。问题:在后续构建中不再调用脚本,因此忽略对其输入的可能更改。

想法#3

该脚本传回父CMakeLists.txt以某种方式考虑的目标和文件列表。到目前为止,我找不到这样做的方法。

我提出的解决方案最终是所有三个想法的混合。

想法#1问题的解决方案

execute_process()实际上确保generated_targets.cmake在配置时存在。

想法#2和#3问题的解决方案

如"将依赖项添加到 CMake 生成的生成系统本身"的回答中所述,可以编辑CMAKE_CONFIGURE_DEPENDS目录属性以添加其触摸重新触发配置步骤的文件。

关键的成功因素是此属性可以在初始execute_process()调用之后设置,以便脚本可以识别并列出其输入依赖项(在输出文件中(,然后将其添加到CMAKE_CONFIGURE_DEPENDS,从而也解决了输入依赖项问题。

生成的伪代码

# The script generates:
# - <output_dir>/cmake/input_files
# - <output_dir>/cmake/generated_targets.cmake
execute_process(
COMMAND myScript
--output-dir ${CMAKE_CURRENT_BINARY_DIR}/generated
)
# Mark the input files as configure step dependencies so that the execute_process
# commands are retriggered on input file change.
file(STRINGS ${CMAKE_CURRENT_BINARY_DIR}/generated/cmake/input_files _input_files)
set_property(
DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS
${_input_files}
)
# Add the generated CMake targets.
include(${CMAKE_CURRENT_BINARY_DIR}/generated/cmake/generated_targets.cmake)

最新更新