[Qbs] Running a helper application right after it is build

Карелин Павел hkarel at yandex.ru
Tue Aug 14 13:27:35 CEST 2018


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 ...)
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.

     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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/qbs/attachments/20180814/5f9f2ba6/attachment.html>


More information about the Qbs mailing list