• Sebastian Holtermann's avatar
    Autogen: Refactor AUTOMOC and AUTOUIC and add source file parse data caching · 7d50e1c6
    Sebastian Holtermann authored
    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`.
    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"
cmQtAutoGen.cxx 11.2 KB