[Qbs] Running a helper application right after it is build
Christian Kandeler
christian.kandeler at qt.io
Tue Aug 14 13:53:46 CEST 2018
On Tue, 14 Aug 2018 14:27:35 +0300
Карелин Павел <hkarel at yandex.ru> wrote:
> Today, with a fresh head, I decided to shorten the script a little (see
> below). At me all has turned out - the project was builded. But last
> night at me this version of the scenario hasn't earned, the problem was
> that the rule for "sonnet-parse-trigrams-run" was executed earlier than
> the utility sonnet_parsetrigrams was created (maybe I made a mistake
> somewhere else ...)
That's not possible with the code you have pasted here. If the tool's tag is an input to a rule, then that rule will always wait for the rule which produces the tool.
> I had a question: the rules for the "type" property are executed in the
> same order as they are declared or they can be executed in parallel.
Everything is potentially run in parallel unless an ordering is introduced by a rule. You have such an ordering, because you tell qbs that "sonnet-parse-trigrams" is an input to your rule. Therefore, the application will be built before your rule runs.
>
> Product {
> id: sonnetParseTrigrams
> //type: "application"
> type: ["application", "sonnet-parse-trigrams-run"]
> consoleApplication: true
> destinationDirectory: "./bin"
>
> name: "SonnetParseTrigrams"
> targetName: "sonnet_parsetrigrams"
>
> Depends { name: "cpp" }
> Depends { name: "SonnetCore" }
> Depends { name: "Qt"; submodules: ["core"] }
>
> cpp.defines: sonnet.cppDefines
>
> cpp.cxxLanguageVersion: "c++14"
> cpp.cxxFlags: sonnet.cxxFlags
>
> files: [
> "data/parsetrigrams.cpp"
> ]
>
> Group {
> fileTagsFilter: "application"
> fileTags: "sonnet-parse-trigrams"
> }
>
> Rule {
> inputs: ["sonnet-parse-trigrams"]
>
> // no inputs -> just a generator
> //multiplex: true
>
> Artifact {
> fileTags: ["sonnet-parse-trigrams-run"]
> filePath:
> FileInfo.joinPaths(product.destinationDirectory, "trigrams.map")
> }
> prepare: {
> var runUtl = input.filePath;
> var sourceDir =
> FileInfo.joinPaths(product.sourceDirectory, "data/trigrams");
> var outputFile =
> FileInfo.joinPaths(product.destinationDirectory, "trigrams.map");
>
> console.info("=== runUtl ===");
> console.info(runUtl);
> console.info(sourceDir);
> console.info(outputFile);
>
> var cmd = new Command(runUtl, [sourceDir,
> outputFile]); cmd.description = "sonnet parse trigrams";
> cmd.highlight = "filegen";
> return cmd;
> }
> }
> }
>
>
> 14.08.2018 12:23, Christian Kandeler пишет:
> > On Tue, 14 Aug 2018 02:03:28 +0300
> > Карелин Павел <hkarel at yandex.ru> wrote:
> >
> >> I found a solution, but I would like to know how it is optimal:
> > Yes, that looks about right.
> >
> >> Product {
> >> id: sonnetParseTrigrams
> >> //type: "application"
> >> type: ["application", "sonnet-parse-trigrams-run"]
> >> consoleApplication: true
> >> destinationDirectory: "./bin"
> >>
> >> name: "SonnetParseTrigrams"
> >> targetName: "sonnet_parsetrigrams"
> >>
> >> Depends { name: "cpp" }
> >> Depends { name: "SonnetCore" }
> >> Depends { name: "Qt"; submodules: ["core"] }
> >>
> >> cpp.defines: sonnet.cppDefines
> >>
> >> cpp.cxxLanguageVersion: "c++14"
> >> cpp.cxxFlags: sonnet.cxxFlags
> >>
> >> files: [
> >> "data/parsetrigrams.cpp"
> >> ]
> >>
> >> Group {
> >> fileTagsFilter: "application"
> >> fileTags: "sonnet-parse-trigrams"
> >> }
> >> }
> >>
> >> Product {
> >> type: "sonnet-parse-trigrams-run"
> >> name: "SonnetParseTrigramsRun"
> >> Depends { name: "SonnetParseTrigrams" }
> >> }
> >>
> >> Rule {
> >> inputs: ["sonnet-parse-trigrams"]
> >>
> >> // no inputs -> just a generator
> >> //multiplex: true
> >>
> >> Artifact {
> >> fileTags: ["sonnet-parse-trigrams-run"]
> >> filePath:
> >> FileInfo.joinPaths(product.destinationDirectory, "trigrams.map")
> >> }
> >> prepare: {
> >> var runUtl = input.filePath;
> >> var sourceDir =
> >> FileInfo.joinPaths(product.sourceDirectory, "data/trigrams");
> >> var outputFile =
> >> FileInfo.joinPaths(product.destinationDirectory, "trigrams.map");
> >>
> >> console.info("=== runUtl ===");
> >> console.info(runUtl);
> >> console.info(sourceDir);
> >> console.info(outputFile);
> >>
> >> var cmd = new Command(runUtl, [sourceDir,
> >> outputFile]); cmd.description = 'sonnet parse trigrams ';
> >> cmd.highlight = "filegen";
> >> return cmd;
> >>
> >> }
> >> }
> >>
> >>
> >> 13.08.2018 18:47, Карелин Павел пишет:
> >>>
> >>> 13.08.2018 11:31, Christian Kandeler пишет:
> >>>> On Sun, 12 Aug 2018 22:56:31 +0300
> >>>> Карелин Павел<hkarel at yandex.ru> wrote:
> >>>>
> >>>>> I have a project in which, in addition to the main application,
> >>>>> auxiliary utilities are builded. In this regard, I have two
> >>>>> questions:
> >>>>>
> >>>>> 1) How do I run an auxiliary utility right after his built, so
> >>>>> that it could generate necessary data?
> >>>> It works the same way as always: You trigger creation of the
> >>>> data by giving it some tag, and the tool's tag appears as some
> >>>> sort of input in the respective rule (which has the data as
> >>>> outputs).
> >>> That's the problem, that I do not have clear how to do it.
> >>> Not so long ago I made a rule for compiling cuda-files. Here is a
> >>> shortened version:
> >>>
> >>> Module {
> >>> id: cuda
> >>> Depends { name: "cpp" }
> >>>
> >>> FileTagger {
> >>> patterns: "*.cu"
> >>> fileTags: ["cuda"]
> >>> }
> >>>
> >>> Rule {
> >>> id: cudaCompiler
> >>> inputs: ["cuda"]
> >>> auxiliaryInputs: ["hpp"]
> >>>
> >>> Artifact {
> >>> fileTags: ["obj"]
> >>> filePath: FileInfo.joinPaths(".obj",
> >>> Utilities.getHash(input.baseDir), input.fileName + ".o")
> >>> }
> >>>
> >>> prepare: {
> >>> var args = [];
> >>> args.push(...);
> >>>
> >>> var cmd = new Command("/usr/bin/nvcuda", args);
> >>> cmd.description = 'cuda compiling ' + input.fileName;
> >>> cmd.highlight = "compiler";
> >>> return cmd;
> >>> }
> >>> }
> >>> }
> >>>
> >>> Everything is clear: there are files with the extension 'cu', the
> >>> files are connected to the project. And there is a cuda compiler:
> >>> /usr/bin/nvcuda.
> >>>
> >>> In the current project, instead of /usr/bin/nvcuda, the
> >>> newly-built utility should be used (call it
> >>> sonnet_parsetrigrams). I do not understand how to write it down.
> >>> Also what should I write in the FileTagger section? Files do not
> >>> have an extension, these files are not connected to the project.
> >>> All that is - the name of the directory in which these files are
> >>> located. The call of the utility is as follows:
> >>> sonnet_parsetrigrams MyProjectDir/trigramsDir > trigrams.map
> >>>>> 2) How to pass parameters to the auxiliary utility? The matter
> >>>>> is that the utility has one parameter - a directory name. It
> >>>>> directory contains text files without expansion, the utility
> >>>>> has to process these files. The output should be one file with
> >>>>> the extension 'map'
> >>>> You rule has to take care of that when creating the Command.
> >>>>
> >>>>
> >>>> Christian
> >>>> _______________________________________________
> >>>> Qbs mailing list
> >>>> Qbs at qt-project.org
> >>>> http://lists.qt-project.org/mailman/listinfo/qbs
> >>>
> >>>
> >>> _______________________________________________
> >>> Qbs mailing list
> >>> Qbs at qt-project.org
> >>> http://lists.qt-project.org/mailman/listinfo/qbs
> > _______________________________________________
> > Qbs mailing list
> > Qbs at qt-project.org
> > http://lists.qt-project.org/mailman/listinfo/qbs
>
More information about the Qbs
mailing list