[Qbs] Need help with setting up a code generator

Christian Kandeler christian.kandeler at qt.io
Mon Dec 11 13:27:28 CET 2017

On Mon, 11 Dec 2017 12:38:03 +0100
Ola Røer Thorsen <ola at silentwings.no> wrote:

> The code generator (a commandline tool) takes a set of C header files (.h)
> in a given directory, and another set of template files (names matching
> .tpl, .h and .cpp) in another directory. 

StaticLibrary {
    Depends { name: "cpp" }
    Group { 
        name: "header inputs"
        files: ["dir1/*.h"]
        fileTags: ["generator.in.headers"]
    Group { 
        name: "template inputs"
        prefix: "dir2/"
        files: ["*.tpl", "*.h", "*.cpp]
        fileTags: ["generator.in.templates"]

> The output is a set of C++ .h and
> .cpp files in an output directory. The number of output files is not the
> same as the number of input files.

    Rule {
        // See https://doc.qt.io/qbs/rule-item.html for details.
        multiplex: true // Probably. Not entirely clear from your description
        inputs: ["generator.in.headers", "generator.in.templates"]

        // I assume the number of output files is dynamic and depends on
        // the number and/or contents of the input files.
        outputFileTags: ["h", "cpp"]
        outputArtifacts: {
            // The following two are arrays of artifact objects.
            // Their file paths are available via the filePath property.
            var headerInputs = inputs["generator.in.headers"];
            var templateInputs = inputs["generator.in.templates"];

            var outList = [];
            // Do what you need to do here to calculate the output 
            // from the input artifacts. The return value is a list of
            // objects with properties filePath and fileTags.
            return outList;
        prepare: {
            var generatorArgs = [];
            // Generate the command-line arguments for the generator tool
            // from the inputs and outputs variables.
            var cmd = new Command("generator.exe", generatorArgs);
            cmd.description = "Running generator";
            return [cmd];

    // Use this property in the outputArtifacts script above.
    property string generatedIncludesDir: product.buildDirectory + "/includes"

> The resulting .h and .cpp files are to be built into a static library. Also
> those header files must be available in the includepath to those needing
> it.

    Export {
        Depends { name: "cpp" }
        cpp.includePaths: product.generatedIncludesDir

> Whenever any of the C headers or template files are modified, the code
> generator is to be run again.

This is basic built-in functionality.

> I'd really appreciate some hints or examples on how this can be done, I'm
> currently stuck trying to figure it out.

Hope this helps,

More information about the Qbs mailing list