[Development] Notes on "Qt Build Systems" @ QtCon 2016

Christian Kandeler christian.kandeler at qt.io
Thu Sep 8 14:34:03 CEST 2016


On 09/08/2016 02:03 PM, Bo Thorsen wrote:
> Ok, go try it. Create a simple python or perl script that reads a file.
> The file just has a single number N inside it. And based on N the script
> outputs those files:
> 
> server.h
> method1.h
> method2.h
> ...
> methodN.h
> 
> Inside method1.h you write this:
> 
> #include <QObject>
> 
> class Method1 : public QObject {
>   Q_OBJECT
> };
> 
> server.h has this:
> 
> #include "method1.h"
> ...
> #include "methodN.h"
> 
> class Server {
> public:
>   Method1* call1() { return new Method1; }
>   ...
>   MethodN* callN() { return new MethodN; }
> };
> 
> In main.cpp you instantiate Server.
> 
> The only problem is that you have to run moc on each of the .h files.
> 
> Solution to the problem is only accepted if you can press build one
> single time inside both Visual Studio and Qt Creator and it builds this
> even when you modify the input file and the main.cpp.

In qbs:

Rule {
    inputs: ["metadata"]
    fileTags: ["hpp"]
    outputArtifacts: {
        var p = new Process();
        try {
            p.exec("path_to_script", ["--list", input.filePath]);
            var files = p.readStdout.split("\n");
            var artifacts = [];
            for (var i in files)
                artifacts.push({ filePath: files[i],
                                 fileTags: ["hpp"]});
            return artifacts:
        } finally {
            p.close();
        }
    prepare: {
        var cmd = new Command("path_to_script",
                              ["--generate", input.filePath]);
        cmd.description = "creating headers";
        return [cmd];
    }
}

(This is a somewhat more advanced example in that it is not assumed that
we have a priori knowledge about how the content of the input file
relates to the outputs.)


FYI,
Christian



More information about the Development mailing list