让我们假设我有一个脚本,该脚本生成一组源文件,这些源文件构成了我要在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
认为 的目标和文件的列表。到目前为止,我还没有找到一种方法。
答案 0 :(得分:0)
我最终提出的解决方案是这三个想法的混合。
execute_process()
实际上确保generated_targets.cmake
在配置时出现。
如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)