Autogen: Refactor AUTOMOC and AUTOUIC and add source file parse data caching
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 inAUTOUIC
. These will help to address issue #15420 "AUTOUIC: Track uic external inputs". -
generate adaptive
make
andninja
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
anduic
files for all headers instead of amocs_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"