The refactoring of cmQtAutoGenerators serializes the program flow and
makes it less jumpy in terms of function calling.
Instead of keeping and passing multiple std::vectors and std::maps in
function arguments, single lists with job descriptions are used,
one job list for MOC, UIC, RCC respectively.
Several utility functions and methods were replaced with scoped lambdas
and the remaining methods were sorted by their scope (MOC, UIC, RCC).
Error and warning messages were refactored to be more verbose
about the problem at hand.
The source parsing algorithms were rewritten in large parts.
In the process a lack of functionality of CMAKE_AUTOMOC_DEPEND_FILTERS
was discovered and fixed. CMAKE_AUTOMOC_DEPEND_FILTERS did not extract
dependency file names from headers that were not in the target sources
but were registered to AUTOMOC by a `#include "moc_<NAME>.cpp"` statement.
A test for this use case is provided in a follow up commit.
- The output file name of the `rcc` command get computed once
in the AUTOGEN initializer and is passed in the info file.
- The function name for the `-name` option of `rcc` gets computed
once in the AUTOGEN initializer and is passed along with the
other `rcc` options in the info file.
This is a large commit that serves multiple purposes
- Iterate source files only once and store all extracted
information in a cmQtAutogenDigest class that can be reused.
This is brings speed improvements because several properties
are only evaluated once. More that that it helps to avoid
duplication of code with non trivial files property checks.
- Fix the Visual Studio generator to use PRE_BUILD when possible.
- Convert `for( ... )` loops to C++11 range base loops where possible
(cmQtAutogen*.cxx only).
- String concatenation optimizations.
When encountering an `#include "<PATH>ui_<BASE>.h"` statement,
search for `<BASE>.ui` in
- <SOURCE_DIR>/<BASE>.ui
- <SOURCE_DIR>/<PATH><BASE>.ui
- <AUTOUIC_SEARCH_PATH>/<BASE>.ui
- <AUTOUIC_SEARCH_PATH>/<PATH><BASE>.ui
In CMake 3.8.2 the lookup list was
- <SOURCE_DIR>/<BASE>.ui
In CMake 3.9.[01] the lookup list was
- <SOURCE_DIR>/<PATH><BASE.ui>
- <AUTOUIC_SEARCH_PATH>/<PATH><BASE>.ui
Closes#17168
Qt is relying on whoever calls moc to include a file with the predefined
values that will be used by the compiler, otherwise moc takes wrong
paths and weird things happen.
Instead, generate an include file and feed it to all mocs to make sure
it's generating correct code.
Co-Author: Sebastian Holtermann <sebholt@xwmw.org>
Fixes: #16640
Make sure that `#include <cmConfigure.h>` is followed by an empty line
in header files. This is necessary to make sure that changing <> to ""
does not affect the include ordering of clang-format.
Automate with:
git grep -l '#include <cmConfigure.h>' | grep -v '.cxx$' \
| xargs sed -i '/#include <cmConfigure.h>/ { N; N; s/\n\{1,2\}/\n\n/ }'