Skip to content

Autogen: Refactor AUTOMOC and AUTOUIC and add source file parse data caching

Sebastian Holtermann requested to merge sebholt/cmake:autogen_cache into master

New features

CMake's AUTOMOC and AUTOUIC now cache information extracted when parsing source files in CMakeFiles/<ORIGIN>_autogen.dir/ParseCache.txt. This leads to faster <ORIGIN>_autogen target rebuilds, because source files will be parsed again only if they're newer than the ParseCache.txt file. The parse cache will be recomputed if it is older than the CMake executable.

AUTOMOC and AUTOUIC now check if moc or uic output files are older than the moc or uic executable. If an output file is older than the compiler, it will be regenerated. Therefore if a new moc or uic version is installed, all output files will be regenerated.

AUTOMOC and AUTOUIC error and warning messages are more detailed.

Internal changes

moc and uic output file names are not computed in the _autogen target anymore but in cmQtAutoGenInitializer. This makes the available at the configuration stage for improved dependency computations (to be done).

In AutogenInfo.cmake, equally sized lists for "source file names", "source file flags" and "compiler output file names" are passed to the _autogen target. This replaces the separate file lists for AUTOMOC and AUTOUIC.

Files times are read from the file system only once by using cmFileTime instances instead of cmQtAutoGenerator::FileSystem::FileIsOlderThan calls.

All calls to not thread safe file system functions are moved to non concurrent fence jobs (see cmWorkerPool::JobT::IsFence()). This renders the cmQtAutoGenerator::FileSystem wrapper class obsolete and it is removed.

Instead of composing a single large settings string that is fed to the cmCryptoHash, now all setting sub strings are fed one by one to the cmCryptoHash and the finalized result is stored.

The std::mutex in cmQtAutoGenerator::Logger is tagged mutable and most cmQtAutoGenerator::Logger methods become const.

Outlook

This patch provides the framework required to

  • extract dependencies from .ui files in AUTOUIC. These will help to address issue #15420 "AUTOUIC: Track uic external inputs".

  • generate adaptive make and ninja files in the _autogen target. These will help to address issue #16776 "AUTOUIC: Ninja needs two passes to correctly build Qt project".

  • generate (possibly empty) moc and uic files for all headers instead of a mocs_compilation.cpp file. This will help to address issue #17277 "AUTOMOC: Provide a option to allow AUTOMOC to compile individual " "moc_x.cxx instead of including all in mocs_compilation.cxx"

Merge request reports