首页 > 解决方案 > 由 sub_directory 二进制文件自动生成的 globbing 文件

问题描述

我有以下问题,我有一个单独的 cmake 项目来生成c++文件,我想将它们整合到使用它们的库中。现在这是以这种方式完成的

add_subdirectory(generator)
add_custom_target(run-generator ... byproduct GENERATED_FILES)
include(files.txt) 
target_link_libraries(library ${GENERATED_FILES})

include files.txt 实际上是一个 set(GENERATED_FILES all_autogen_files),现在它们是固定的,但将来它们可能会改变。这就是我想要的

add_subdirectory(generator)
execute_process(generator_binary ... commands)
file(glob ${GENERATED_FILES} output_location_of_gen_files) 
target_link_libraries(library ${GENERATED_FILES})

据我了解,execute_process 在现场运行被读取,所以这将在之前生成所有文件,file(glob)但我不知道我将如何在执行过程之前实际构建生成器二进制文件,因为现在之前构建它的是它依赖于target_link_libraries

标签: cmake

解决方案


这可能起作用的唯一方法是如果您创建一个superbuild,即使用ExternalProjects 构建所有内容的 CMake 项目。原因是您无法在构建期间创建新目标或将源添加到现有目标。

使用超级构建,您至少需要 3 个独立的 CMake 项目:一个构建生成器然后生成文件,一个将生成的文件全局化并构建其余构建工件,以及添加两者的超级构建项目ExternalProject_Add。通过正确设置依赖关系,您可以确保在生成生成项目之后配置使用生成文件的项目。

但是,无论如何都不鼓励在 CMake 中使用通配符,因此明确列出文件是正确的做法。如果您的代码生成器开始生成新文件,那么它们应该在同一次提交中手动添加到列表中,否则即使使用 globbing 和该方法CONFIGURE_DEPENDS也不能保证新文件将被构建。ExternalProject


推荐阅读