cmake - 由 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
解决方案
这可能起作用的唯一方法是如果您创建一个superbuild,即使用ExternalProject
s 构建所有内容的 CMake 项目。原因是您无法在构建期间创建新目标或将源添加到现有目标。
使用超级构建,您至少需要 3 个独立的 CMake 项目:一个构建生成器然后生成文件,一个将生成的文件全局化并构建其余构建工件,以及添加两者的超级构建项目ExternalProject_Add
。通过正确设置依赖关系,您可以确保在生成生成项目之后配置使用生成文件的项目。
但是,无论如何都不鼓励在 CMake 中使用通配符,因此明确列出文件是正确的做法。如果您的代码生成器开始生成新文件,那么它们应该在同一次提交中手动添加到列表中,否则即使使用 globbing 和该方法CONFIGURE_DEPENDS
也不能保证新文件将被构建。ExternalProject
推荐阅读
- node.js - 在一个相互依赖的 Promise 中使用多个等待
- python - 日期时间中的舍入微秒
- flatbuffers - Flatbuffers 如何在低级别工作?vtable如何排列数据?
- angular - 然后测试模拟服务/捕获功能 - Angular/Karma
- intellij-idea - Grails 4-IntelliJ IDEA 版本 19 增加了编译时间
- c# - 如何通过 C# powershell SDK 正确运行 Install-WindowsFeature
- python - 如何使用 Flask & SQL Server 作为后端删除记录?
- numpy - 提高广播乘法和1-广播的性能
- sql - SQL 将单个结果显示为总数的百分比
- laravel - 如何使用 laravel 8 livewire 创建子组件?