4

我想使用 Qbs 来编译一个现有的项目。这个项目已经包含了一个在这个项目中大量使用的代码转换工具(my_tool)。

到目前为止,我有(简化):

import qbs 1.0

Project {
    Application {
        name: "my_tool"
        files: "my_tool/main.cpp"
        Depends { name: "cpp" }
    }

    Application {
        name: "my_app"
        Group {
            files: 'main.cpp.in'
            fileTags: ['cpp_in']
        }
        Depends { name: "cpp" }

        Rule {
            inputs: ["cpp_in"]
            Artifact {
                fileName: input.baseName
                fileTags: "cpp"
            }
            prepare: {

                var mytool = /* Reference to my_tool */;

                var cmd = new Command(mytool, input.fileName, output.fileName);
                cmd.description = "Generate\t" + input.baseName;
                cmd.highlight = "codegen";
                return cmd;
            }
        }
    }
}

如何获取对命令的 my_tool 的引用?

4

2 回答 2

7

这个答案基于 Qbs 作者 Joerg Bornemann 的一封电子邮件,他允许我在这里引用它。

Rule的属性usings允许将来自产品依赖项的工件添加到输入。在这种情况下,我们对“应用程序”工件感兴趣。

然后可以访问应用程序列表作为input.application

Application {
    name: "my_app"
    Group {
        files: 'main.cpp.in'
        fileTags: ['cpp_in']
    }
    Depends { name: "cpp" }

    // we need this dependency to make sure that my_tool exists before building my_app
    Depends { name: "my_tool" }

    Rule {
        inputs: ["cpp_in"]
        usings: ["application"] // dependent "application" products appear in inputs
        Artifact {
            fileName: input.completeBaseName
            fileTags: "cpp"
        }
        prepare: {
            // inputs["application"] is a list of "application" products
            var mytool = inputs["application"][0].fileName;
            var cmd = new Command(mytool, [inputs["cpp_in"][0].fileName, output.fileName]);
            cmd.description = "Generate\t" + input.baseName;
            cmd.highlight = "codegen";
            return cmd;
        }
    }
}
于 2013-06-26T09:56:20.200 回答
0

不幸的是,自 QBS 1.5.0 以来,a 中的usings属性已被弃用。Rule目前我有同样的要求。在非Multiplex中使用产品工件Rule

多路复用的问题Rule是,如果输入集中的单个文件发生更改,则所有输入工件都将被重新处理。就我而言,这相当耗时。

于 2017-07-20T11:54:01.633 回答