1

当在具有产品依赖关系的模块内使用规则时,FileTagger 会破坏 qbs 中依赖关系的解析。

我们的项目中有一个 CodeGenerator,它是由项目本身构建的。此 CodeGenerator 从 *.asd 文件生成 C++ 类。名为“Core”的产品使用该 CodeGenerator 从 Core.asd 文件生成类。

我不确定这是否是 qbs 中的错误,但由于 qbs 1.8,我们项目的这一部分不再起作用。

我创建了一个小型测试项目来说明该问题:

RuleUsesProduct.qbs

import qbs

Project {
    minimumQbsVersion: "1.8.0"

    references: [
        "Core/Core.qbs",
        "CodeGenerator/CodeGenerator.qbs"
    ]

    qbsSearchPaths: "QBS"
}

核心.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
        }
    }
}

代码生成器.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
    }

}

任何帮助深表感谢!

4

1 回答 1

2

Qbs 知道两种类型的规则:多路复用和非多路复用规则。详细信息可以在这里找到:https ://doc.qt.io/qbs/rule-item.html 。对您来说重要的一点是,非多路复用规则会为每个输入调用一次它们的准备脚本。这意味着在您的示例中,准备脚本运行两次:一次用于 asd 输入,一次用于应用程序输入。相应的其他输入不可见。这不适合您的用例,因为您希望同时查看两个输入。因此,您需要使您的规则成为多路复用规则:

multiplex: true

在准备脚本中,您需要为每个 asd 类型的输入创建一个命令(除非您的生成器可以同时接受多个输入)。

经验法则(没有双关语):如果您的规则声明了多个输入标签,则它可能应该是多路复用规则。

于 2017-06-16T15:37:57.997 回答