Hi,

I would like to propose considering making Qt suitable for CMake UNITY_BUILDs ( https://bugreports.qt.io/browse/QTBUG-109394 , https://cmake.org/cmake/help/latest/prop_tgt/UNITY_BUILD.html ) .

This has originally been proposed for Qt for Python ( https://bugreports.qt.io/browse/PYSIDE-2155 ). It has greatly benefited from it; builds are much faster; particuarly for us in home-office where no distributed build environment exists.

It is basically what webengine has been using for a long time: Source files are concatenated to jumbo files which are then compiled.

For Qt for Python with its lots of generated files, the speed-up is drastic (~10x); for an average module (qttools), less so, but still:

Initial build of qttools:

Standard (675 files): real 3m26,016s / user 19m4,352s / sys 1m48,346s
Unity (203 files) : real 2m2,557s / user 9m40,147s / sys 0m47,144s (CMAKE_UNITY_BUILD_BATCH_SIZE=16)

with CCACHE/warmed up:

Standard (675 files): real 1m50,605s / user 8m9,512s  / sys 1m9,187s
Unity (203 files)   : real 1m30,990s / user 5m11,773s / sys 0m39,687s

Increasing CMAKE_UNITY_BUILD_BATCH_SIZE might also give better results.

Some modifications of the source code are required, though. The majority is actually improvements; things like missing header guards and macro re-definitions immediately show up; also Q_DECLARE_METATYPE() can be removed (see https://lists.qt-project.org/pipermail/development/2022-July/042744.html ).

But there is also a part that is more questionable; static functions need to be disambiguated; "using namespace" can cause clashes; class member fields from anonymous namespaces cause errors ( -Werror=subobject-linkage producing qerrormessage.cpp:38:7: error: ‘QErrorMessagePrivate’ has a field ‘QErrorMessagePrivate::pending’ whose type uses the anonymous namespace ) and similar.

Some things are not fixable; exclusions can be done on a source file or project level. Alternatively, one can group suitable source files together; but this requires more work.

In development work, if COIN uses UNITY_BUILD, there is also a small risk of changes with missing header files being accepted.

Summmarising: we stand to gain a speed-up of compilation; particularly for clean builds like in COIN; but it requires some work. We might do a step-by step approach process enabling modules one by one. What do you think?

Regards, Friedemann

--

Friedemann Kleint
The Qt Company GmbH

_______________________________________________
Development mailing list
Development@qt-project.org
https://lists.qt-project.org/listinfo/development

Reply via email to