diff options
author | Alexandru Croitor <alexandru.croitor@qt.io> | 2021-03-19 13:45:46 +0100 |
---|---|---|
committer | Alexandru Croitor <alexandru.croitor@qt.io> | 2021-03-25 12:59:17 +0100 |
commit | 04df85bbecdc034876d509b9c96a4f17fc990293 (patch) | |
tree | 5c60fd152ee463a5e0db45ff3382e8a2581de595 /src/corelib/kernel/qobject.cpp | |
parent | eadfb2cc1ab428bb052ed1d5d39d17fac97e3c7e (diff) |
CMake: Get rid of the Core_qobject static library
The Core_qobject target was problematic for a few reasons.
In the very beginning, Core_qobject was an OBJECT library, explaining
its existence with the following comment "requires to spill internals
into users". The object library contained qobject.cpp and
qproperty.cpp and their manually generated moc files.
It was was a dependency of Core.
Afterwards it got converted into a static library instead, presumably
to circumvent some issues with metatype generation.
Unfortunately making it a static library was wrong, because it leads
to linker failures (undefined symbols) in a static Qt build when
trying to link a project that uses only QtCore.
Both Core and Core_qobject refer to each other's symbols, and
whichever library came first on the link line, many of its symbols
were discarded by the linker.
Transforming Core_qobject back into an object library could be an
option, but that leads to trouble with creating proper prl files
(our infrastructure doesn't quite support that for object libraries
yet).
Furthermore, there was some internal discussion and concern
about how to merge the two metatype json file lists (Core and
Core_qobject) into a single file.
Instead of using an object library, move qobject.cpp and qproperty.cpp
to be directly a part of Core again and remove the Core_qobject
target.
In order to do that, we have to circumvent some issues with
AUTOMOC.
First, we have to disable AUTOMOC for qobject.cpp and its headers.
qobject.cpp contains Q_GADGET, Q_NAMESPACE, etc keywords
in its doc comments. That confuses AUTOMOC, because it expects a
qobject.moc file which is not included by qobject.cpp.
See e2ff9e3b9957f844d6530cc92096bed3c16fa46a for some details
on the Q_GADGET + AUTOMOC issue.
We still need to run moc on on qobject.h and compile moc_qobject.cpp,
so we manually run moc on the header file. Because qobject.cpp
directly includes moc_qobject.cpp, we need to adjust the header
include path to the generated file.
Second, we remove the direct inclusion of moc_qnamespace.cpp
in qobject.cpp to prevent duplicate symbol compilation, because
the symbols were compiled both as part of qobject.cpp and
mocs_compilation.cpp.
Finally, because manual moc is used on qobject.h, the generated json
file needs to be explicitly passed to Core's metatype generation
step.
Amends e57a94cbd8f28ccab8b3368afc4365237c533a4f
Amends 3c4c02b3f1cec8ebc0134fd05b0e51f1f771937d
Pick-to: 6.1
Task-number: QTBUG-87580
Change-Id: I859a7d2f95508eda211a0a0b4ec132540b78bda4
Reviewed-by: Alexey Edelev <alexey.edelev@qt.io>
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Diffstat (limited to 'src/corelib/kernel/qobject.cpp')
-rw-r--r-- | src/corelib/kernel/qobject.cpp | 1 |
1 files changed, 0 insertions, 1 deletions
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index 4d2f801c7b..343922581c 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -5243,5 +5243,4 @@ bool QMetaObject::Connection::isConnected_helper() const QT_END_NAMESPACE -#include "moc_qnamespace.cpp" #include "moc_qobject.cpp" |