[Qbs] qbs-autoproject
resurrection at centrum.cz
resurrection at centrum.cz
Sat Oct 28 09:02:38 CEST 2017
We have discussed some configuration issues via separate e-mail but few things worth pointing out here:
- I should likely call close() explicitly after reading a file. One gets spoiled from QFile's destructor. :-) That might alleviate the too many open files issue. I reckon it ultimately hits the OS limit on open file handles otherwise.
- modules are for external dependencies like Qt or your custom made modules. The path is the one I use for Qt, you should put your path or remove it altogether if your project is not using Qt.
- As mentioned the other issues are to do with configuration of the patterns as the described project is fairly standard.
- I have tried it on legacy code base of 400+ products without optimizing or ignoring any patterns and while it took long the results seemed reasonable especially considering how messy it is.
I will look into the performance issue for sure. And the readme should really be turned into the wiki.
______________________________________________________________
> Od: Christian Gagneraud <chgans at gmail.com>
> Komu: resurrection at centrum.cz, qbs at qt-project.org
> Datum: 28.10.2017 02:33
> Předmět: Re: [Qbs] qbs-autoproject
>
On 28/10/17 00:59, resurrection at centrum.cz wrote:
> Thanks for trying it out Christian! I will try to answer some of your
> questions:
>
> > qbs-autoproject tookssomething like 10 to 15 minutes (as advertised)
>
> Take a look
> at https://github.com/Resurr3ction/qbs-autoproject#performance-tips if
> any of those could help you there. Particularly not using the
> contentPattern and removing unused items should help a lot. If you just
> want to see the structure (like the qbs-create-project does) you may
> disable the dependency scanner by setting dependencyMode =
> DependencyMode.Disabled.
I now have disabled the dependency, i will sort out that later.
I have as well adjusted ignorePattern so that qbs-autoproject only see
the "easy" sub directories, mainly static libraries
>
>> At this stage, i'm not sure if qbs-autoproject refused to write the qbs
>> files, or if it allows to generate broken qbs files, that can then be
>> fixed manually.
>
> qbs-autoproject will write out only one file that will be named as your
> root directory. Since you cannot edit it (because it would be
> overwritten) I did not see any benefit in splitting it into multiple
> files. It is also easier to debug when all projects/products are in
> single file imho.
I'm fine with that.
However, qbs-autoproject fails to write the final qbs file:
$ qbs build
No build graph exists yet for this configuration.
Resolving project for configuration default
Nos @ Sat Oct 28 2017 12:38:16 GMT+1300 (NZDT)
--------------------------------------
Running steps...
[1/11] Parsing configuration...
Project root: /home/krys/Projects/nos-build-ng
Output path: /home/krys/Projects/nos-build-ng/.autoproject
Install path:
/home/krys/Projects/nos-build-ng/default/install-root/linux,unix-undefined-gcc
Output format: Tree
Dependency mode: Disabled
Items:
AutoprojectApp
AutoprojectDynamicLib
AutoprojectPlugin
AutoprojectStaticLib
AutoprojectInclude
AutoprojectDoc
Modules:
Qt
[1/11] Done (0ms)
[2/11] Scanning modules...
Qt
[2/11] Done (1ms)
[3/11] Creating projects...
<...> <- 1 project per subdir, recursively, starting with root
[3/11] Done (715ms)
[4/11] Creating products...
<...> <- 1 static lib per subdir, recursively
[4/11] Done (2390ms)
[5/11] Merging products...
<no log details here>
[5/11] Done (173ms)
[6/11] Consolidating products...
<...> <- Wrong association are made here
[6/11] Done (43859ms)
[7/11] Cleaning projects...
<...> <- Removes lot of empty project, including root :(
[7/11] Done (1949ms)
[8/11] Scanning dependencies...
Dependencies disabled --- skipping
[8/11] Done (0ms)
[9/11] Finding includes...
Dependencies disabled --- skipping
[9/11] Done (0ms)
[10/11] Setting dependencies...
Dependencies disabled --- skipping
[10/11] Done (0ms)
[11/11] Writing project...
ERROR: TypeError: Result of expression 'proj' [undefined] is not an object.
I'm suspecting a completely empty top project.
I think the problem comes from the consolidation phase:
Imagine you start with only 2 top level folders, that are 2 libraries:
- Feature
- Topic
If Topic contains a Feature sub-folder (which is not a library on it's
own, it's just source code organisation), the the consolidation phase
will merge Feature with Topic/Feature
A simple use case:
$ tree .
.
├── project.qbs
├── Core
│ ├── core.cpp
│ ├── core.qbs
│ └── Web
│ ├── web.cpp
│ └── web.h
├── Gui
│ ├── gui.cpp
│ ├── gui.qbs
│ └── Web
│ ├── web.cpp
│ └── web.h
└── Web
├── web.cpp
├── web.h
└── web.qbs
In this case the consolidator will merge Core/Web, Gui/Web with Web/
instead of simplifying to Core, Gui and Web as top libraries.
>> After trying the "full" dependency-tracked custom Qbs (Export items), i
>> decided that i don't want that. I like it, but I cannot afford so to
>> speak. My DAG is so wild, that qbs fight to load it and i end up with
>> Linux's limits.conf problems. Such as command line too long (true) and
>> too many open files (Ubuntu's mistake).
>
> Now this is interesting. Could you tell me more about these issues?
> Export item vs include-directory should not be a significant difference
> except for the cyclic dependency problem. Have you tried NoHeaderOnly
> dependencyMode?
Let me clarify, this has nothing to do with qbs-autoproject, I have used
my scripts as initial generator, and then manually polished the
generated files. I have something like 150 products (apps and libs), the
libraries have a complex inter-dependency. If I try to use the Export
Item on each of these, i end up with an app build command that has lot
of duplicated include search path (-I), a lot of duplicated library
search path (-L) and a lot of duplicated link objects (-lfoo, -lbar, ...)
This is where i hit the Linux limits.conf, I am not sure if I do it
wrong thought.
I as well hit the "too many open files" with qbs-autoproject, I have the
feeling that it keeps all the source files open while scanning.
JS File objects not garbage collected?
>> It's not clear to me how i can inject my initial qbs support files into
>> the qbs-autoproject ones, maybe i just need to edit '.qbs-autoproject/'
>> files. I found it hard to define "where the project is", "what the
>> project name is", and "where is my custom stuff".
>
> All your custom stuff should be done via custom items and modules. So in
> your case you would edit (or remove or add more) stuff in
> .autoproject/imports/ and then you would link these to the
> qbs-autproject via the `items` property - giving them the pattern etc.
Thanks, I get it now, this is pretty cool and very similar to how my
python scripts work.
What about the 'modules' property, why there is a 'Qt' module there with
an hard coded include path? Is it just an example?
I think i will want to use this feature, as i have a couple of special
ThirdParty libraries.
Thanks,
Chris
More information about the Qbs
mailing list