在规则 ([asd] -> [cpp]) 中使用产品 (CodeGenerator) 时,依赖关系未正确解析
Dependency not resolved correctly when Product (CodeGenerator) used in Rule ([asd] -> [cpp])
在依赖于产品的模块中使用规则时,FileTagger 会破坏 qbs 中依赖项的解析。
我们项目中有一个CodeGenerator,是项目自己构建的。
此 CodeGenerator 从 *.asd-Files 生成 C++-类。
名为 "Core" 的产品使用该代码生成器从 Core.asd 文件生成 类。
我不确定这是否是 qbs 中的错误,但自 qbs 1.8 以来,我们项目的这一部分不再有效。
我创建了一个小测试项目来说明这个问题:
RuleUsesProduct.qbs
import qbs
Project {
minimumQbsVersion: "1.8.0"
references: [
"Core/Core.qbs",
"CodeGenerator/CodeGenerator.qbs"
]
qbsSearchPaths: "QBS"
}
Core.qbs
import qbs
CppApplication {
Depends { name: "Qt.core" }
cpp.cxxLanguageVersion: "c++11"
cpp.defines: [
]
consoleApplication: true
files: [
"main.cpp",
"core.asd"
]
Depends{ name:"CodeGenerator"}
Depends{ name:"CodeGeneration"}
Group { // Properties for the produced executable
fileTagsFilter: product.type
qbs.install: true
}
}
Db2cppModule.qbs
这是通过来自 RuleUsesProductTest.qbs
的 qbsSearchPath 间接包含的
import qbs 1.0
import qbs.Environment
import qbs.FileInfo
import qbs.TextFile
import qbs.Process
import qbs.File
Module {
FileTagger {
patterns: ["*.asd"]
fileTags: ["asd"]
}
Rule {
id: dbRule
inputs: ["asd"]
inputsFromDependencies: ["application"]
multiplex: true
outputFileTags: ["cpp", "hpp"]
outputArtifacts: {
// dummy code that should call the CodeGenerator.exe with some parameters...
var process = new Process();
console.warn("# " + inputs["application"][0].filePath)
var cmdExp = "" + inputs["application"][0].filePath;
process.exec(cmdExp, [], false);
return []
}
prepare: {
console.warn("*" + inputs["application"][0].filePath)
var cmdExp = "" + inputs["application"][0].filePath;
var cmd = new Command(cmdExp, []);
return cmd
}
}
}
CodeGenerator.qbs
import qbs
CppApplication {
Depends { name: "Qt.core" }
cpp.cxxLanguageVersion: "c++11"
cpp.defines: [
]
consoleApplication: true
files: [
"codegenerator.cpp"
]
Group { // Properties for the produced executable
fileTagsFilter: product.type
qbs.install: true
}
}
非常感谢任何帮助!
Qbs 知道两种类型的规则:多重规则和非多重规则。可在此处找到详细信息:https://doc.qt.io/qbs/rule-item.html。
对您来说重要的一点是,非多路复用规则会为每个输入调用一次它们的准备脚本。这意味着在您的示例中,准备脚本运行两次:一次用于 asd 输入,一次用于应用程序输入。相应的其他输入不可见。这不适合您的用例,因为您希望同时查看两个输入。因此,您需要将您的规则设为多路复用规则:
multiplex: true
在准备脚本中,您需要为 asd 类型的每个输入创建一个命令(除非您的生成器可以一次接受多个输入)。
经验法则(无双关语意):如果您的规则声明了多个输入标签,它可能应该是一个多重规则。
在依赖于产品的模块中使用规则时,FileTagger 会破坏 qbs 中依赖项的解析。
我们项目中有一个CodeGenerator,是项目自己构建的。 此 CodeGenerator 从 *.asd-Files 生成 C++-类。 名为 "Core" 的产品使用该代码生成器从 Core.asd 文件生成 类。
我不确定这是否是 qbs 中的错误,但自 qbs 1.8 以来,我们项目的这一部分不再有效。
我创建了一个小测试项目来说明这个问题:
RuleUsesProduct.qbs
import qbs
Project {
minimumQbsVersion: "1.8.0"
references: [
"Core/Core.qbs",
"CodeGenerator/CodeGenerator.qbs"
]
qbsSearchPaths: "QBS"
}
Core.qbs
import qbs
CppApplication {
Depends { name: "Qt.core" }
cpp.cxxLanguageVersion: "c++11"
cpp.defines: [
]
consoleApplication: true
files: [
"main.cpp",
"core.asd"
]
Depends{ name:"CodeGenerator"}
Depends{ name:"CodeGeneration"}
Group { // Properties for the produced executable
fileTagsFilter: product.type
qbs.install: true
}
}
Db2cppModule.qbs
这是通过来自 RuleUsesProductTest.qbs
import qbs 1.0
import qbs.Environment
import qbs.FileInfo
import qbs.TextFile
import qbs.Process
import qbs.File
Module {
FileTagger {
patterns: ["*.asd"]
fileTags: ["asd"]
}
Rule {
id: dbRule
inputs: ["asd"]
inputsFromDependencies: ["application"]
multiplex: true
outputFileTags: ["cpp", "hpp"]
outputArtifacts: {
// dummy code that should call the CodeGenerator.exe with some parameters...
var process = new Process();
console.warn("# " + inputs["application"][0].filePath)
var cmdExp = "" + inputs["application"][0].filePath;
process.exec(cmdExp, [], false);
return []
}
prepare: {
console.warn("*" + inputs["application"][0].filePath)
var cmdExp = "" + inputs["application"][0].filePath;
var cmd = new Command(cmdExp, []);
return cmd
}
}
}
CodeGenerator.qbs
import qbs
CppApplication {
Depends { name: "Qt.core" }
cpp.cxxLanguageVersion: "c++11"
cpp.defines: [
]
consoleApplication: true
files: [
"codegenerator.cpp"
]
Group { // Properties for the produced executable
fileTagsFilter: product.type
qbs.install: true
}
}
非常感谢任何帮助!
Qbs 知道两种类型的规则:多重规则和非多重规则。可在此处找到详细信息:https://doc.qt.io/qbs/rule-item.html。 对您来说重要的一点是,非多路复用规则会为每个输入调用一次它们的准备脚本。这意味着在您的示例中,准备脚本运行两次:一次用于 asd 输入,一次用于应用程序输入。相应的其他输入不可见。这不适合您的用例,因为您希望同时查看两个输入。因此,您需要将您的规则设为多路复用规则:
multiplex: true
在准备脚本中,您需要为 asd 类型的每个输入创建一个命令(除非您的生成器可以一次接受多个输入)。
经验法则(无双关语意):如果您的规则声明了多个输入标签,它可能应该是一个多重规则。