[Development] Announcing moc_combine

Thiago Macieira thiago.macieira at intel.com
Tue May 31 19:42:01 CEST 2016

On terça-feira, 31 de maio de 2016 18:13:18 BRT Joerg Bornemann wrote:
> While this feature reduces the build time for full builds within a 
> measurable range, it drastically increases build time for incremental 
> builds. Changing just one Q_OBJECT header file results in full 
> regeneration of combined_moc.cpp.
> Take for example:
> touch src/widgets/dialogs/qprogressdialog.h
> make
> moc time without moc_combine:  0.8s
> moc time with moc_combine:    15.6s
> This feature is nice for source distributions but isn't suitable for 
> code being developed.

We can easily disable it for developer builds.

But note that due to rebases and touching central files like qglobal.h or 
qobject.h, everything rebuilds anyway.

The best of both worlds would be if:
 * moc could output more than one file
 * moc could be run once for however many files needed updating
 * moc could be given the list of files that have changed, but no others

GNU make helps us for the last option:


    The names of all the prerequisites that are newer than the target, with 
spaces between them. For prerequisites which are archive members, only the 
named member is used (see Archives). 

I don't know how to implement the first two. 

Also, qmake would need to list only the actual headers, not the indirect 
dependencies of them as it currently does. That would mean moc would not get 
rerun if an indirect dependency of a header changed. In Qt 4, that wasn't a 
problem; for Qt 5, given that moc parses plugin and metatype declarations from 
included headers, the rerun would not produce the same as a clean build.

Thiago Macieira - thiago.macieira (AT) intel.com
  Software Architect - Intel Open Source Technology Center

More information about the Development mailing list