gpt4 book ai didi

c++ - 如何在具有依赖关系的 qbs 产品之间强制同步?

转载 作者:太空宇宙 更新时间:2023-11-04 12:33:27 25 4
gpt4 key购买 nike

我有一个包含多个产品的项目,其中一些取决于生成的代码(cpp 和 hpp 文件)。此生成的代码是自依赖于作为 CppApplication 的 code_generator 产品。

我希望 code_generator 在他的源更改时重建,然后始终运行。它只会在输出文件发生变化时修改它们(它在内部将它们生成在一个临时文件夹中,并在将它们移动到正确的位置之前使用校验和检查更改)。然后一旦文件生成,其他产品的编译就可以开始了。

我的问题是在构建 code_generator.exe 之前开始构建我放置生成文件的 StaticLibrary。其他依赖静态库的产品也可以在生成.hpp文件之前开始构建。

所以我的问题是:是否有一些机制可用于让产品等待特定依赖项完全构建?

我对任何类型的解决方案持开放态度,生成的代码可以在任何类型的模块中,我只是尝试使用 StaticLibrary,因为它看起来更方便。

PS:code_generator 产品生成了很多文件并接受了一些我在 qbs 中没有精确输入的输入,因为它始终可以运行,并且可以将其视为输入本身,因为它可以更改。这就是为什么我不确定使用 Rule 对我来说真的很有趣。

这是我的 qbs 文件的摘录:

    CppApplication
{
name: "code_generator"

consoleApplication: true

files: [
"../sources/code_generator/code_generator.cpp",
"../sources/code_generator/code_generator.hpp",
...
]

Depends { name: "default-cpp-configuration" }
Depends { name: "tinyxml2" }

destinationDirectory: "../" // @Warning we move the binary to ease his usage by the "generated_code" module
}

StaticLibrary // @Warning as static library to build those sources only once
{
name: "generated_code"

Depends { name: "default-cpp-configuration" }
Depends { name: "code_generator" }

Rule {
multiplex: true
alwaysRun: true
// inputs: [project.buildDirectory + "/../code_generator.exe"]

Artifact { filePath: "generated/common/directx/driver_call_table.cpp"; fileTags: "cpp" }
Artifact { filePath: "generated/common/directx/driver_call_table.hpp"; fileTags: "hpp" }
Artifact { filePath: "generated/common/directx/d3d11.def"; fileTags: "def" }
Artifact { filePath: "generated/common/directx/uuid_helpers.cpp"; fileTags: "cpp" }
Artifact { filePath: "generated/common/directx/uuid_helpers.hpp"; fileTags: "hpp" }


prepare: {
var code_generator_path = project.buildDirectory + "/../code_generator.exe";

var cmd = new Command(code_generator_path, ["DirectX", "Outdir=${GENERATED_SOURCES_PATH}", "Indir=${CMAKE_SOURCE_DIR}/lib/specs", "CompilerPath=${CMAKE_CXX_COMPILER}", "--preprocess"]);
cmd.description = "generating sources";
return cmd;
}
}
}

CppApplication
{
name: "client"

consoleApplication: true

files: [
"../sources/client/main.cpp",
]

Depends { name: "default-cpp-configuration" }
Depends { name: "generated_code" }
Depends { name: "openssl" }
}

最佳答案

产品依赖性只是使产品的工件在依赖产品的规则中可用。它们不会自己引起同步。同步发生在工件级别;否则,并行化将受到阻碍。您的问题是您的规则没有声明它取决于代码生成器可执行文件。它应该是这样的(未经测试):

Rule {
multiplex: true
inputsFromDependencies: "application" // These are tags, not paths!
Artifact {
filePath: "generated/common/directx/driver_call_table.cpp"
fileTags: "cpp"
}
Artifact {
filePath: "generated/common/directx/driver_call_table.hpp"
fileTags: "hpp"
}
Artifact {
filePath: "generated/common/directx/d3d11.def"
fileTags: "def"
}
Artifact {
filePath: "generated/common/directx/uuid_helpers.cpp"
fileTags: "cpp"
}
Artifact {
filePath: "generated/common/directx/uuid_helpers.hpp"
fileTags: "hpp"
}
prepare: {
var code_generator_path = inputs.application[0].filePath;
var args = [
"DirectX", "Outdir=${GENERATED_SOURCES_PATH}",
"Indir=${CMAKE_SOURCE_DIR}/lib/specs",
CompilerPath=${CMAKE_CXX_COMPILER}", "--preprocess"
];
var cmd = new Command(code_generator_path, args);
cmd.description = "generating sources";
return cmd;
}
}

关于c++ - 如何在具有依赖关系的 qbs 产品之间强制同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57588456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com