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

时间:2018-09-28 13:46:44

标签: cmake code-generation

让我们假设我有一个脚本,该脚本生成一组源文件,这些源文件构成了我要在CMakeLists.txt中链接的目标。如果文件名对于后者是已知的,那么通常的add_custom_target()add_custom_command()命令将使使用生成的文件作为目标源成为可能。

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

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

想法1

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

想法2

类似于想法#1,但是脚本用execute_process()调用,因此在配置时出现generated.cmake。问题:在后续版本中不再调用该脚本,因此忽略了对其输入的可能更改。

想法3

该脚本会传回父级CMakeLists.txt认为 的目标和文件的列表。到目前为止,我还没有找到一种方法。

1 个答案:

答案 0 :(得分:0)

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

第一个想法的解决方案

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

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

this answer to "Add dependency to the CMake-generated build-system itself"中所述,可以编辑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)