Browse Source

Migrate to new types registration approach

- Use static type registration instead of previous global
  registration approach
- All protobuf types including generated will be registred by
  qRegisterProtobufTypes

Fixes: #55
Alexey Edelev 5 years ago
parent
commit
8c865b408f

+ 11 - 4
README.md

@@ -155,10 +155,6 @@ int main(int argc, char *argv[])
 }
 ```
 
-**For each generated class you also need to call 'qRegisterProtobufType<GeneratedClassName>' to enable serialization and QML support**
-
-**Other option is to include common "qtprotobuf_global.qpb.h" file and call apptopriate qRegisterProtobufTypes() method for you package**
-
 ### Code exceptions
 
 If any prohibited Qt/QML keyword is used as field name, generator appends '*Proto*' suffix to generated filed name. It's required to omit overloading for example QML reserved names like '*id*' or '*objectName*'.
@@ -214,6 +210,17 @@ Due to cmake restrictions it's required to specify resulting artifacts manually
 
 *QtProtobuf_GENERATED* - variable that will contain generated STATIC library target name
 
+### qtprotobuf_link_archive
+
+qtprotobuf_link_archive is cmake helper function that links whole archive to your library or executable target. It's useful when you try to link generated target to shared library or/and to executable that doesn't utilize all protobuf generated classes directly from C++ code, but requires them from QML.
+
+**Parameters**
+
+*TARGET* - name of target to link to
+
+*GENERATED_TARGET* - protobuf generated target name
+
+
 ### Usefull definitions
 
 *QTPROTOBUF_MAKE_COVERAGE* - if **TRUE/ON**, QtProtobuf will be built with gcov intergration, to collect code coverage reports(usefull for developers). **FALSE** by default

+ 2 - 1
cmake/QtProtobufCommon.cmake

@@ -72,13 +72,14 @@ function(add_test_target)
         PROTO_INCLUDES ${add_test_target_PROTO_INCLUDES})
 
     add_executable(${add_test_target_TARGET} ${add_test_target_SOURCES})
+    qtprotobuf_link_archive(${add_test_target_TARGET} ${QtProtobuf_GENERATED})
 
     if(Qt5_POSITION_INDEPENDENT_CODE)
         set_target_properties(${add_test_target_TARGET} PROPERTIES POSITION_INDEPENDENT_CODE FALSE)
         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
     endif()
     add_dependencies(${add_test_target_TARGET} ${QtProtobuf_GENERATED})
-    target_link_libraries(${add_test_target_TARGET} gtest_main gtest ${QtProtobuf_GENERATED} ${QTPROTOBUF_COMMON_NAMESPACE}::QtProtobuf ${QTPROTOBUF_COMMON_NAMESPACE}::QtGrpc Qt5::Core Qt5::Test Qt5::Network ${CMAKE_THREAD_LIBS_INIT})
+    target_link_libraries(${add_test_target_TARGET} gtest_main gtest ${QTPROTOBUF_COMMON_NAMESPACE}::QtProtobuf ${QTPROTOBUF_COMMON_NAMESPACE}::QtGrpc Qt5::Core Qt5::Test Qt5::Network ${CMAKE_THREAD_LIBS_INIT})
     if (${add_test_target_QML})
         target_link_libraries(${add_test_target_TARGET} Qt5::Qml)
     endif()

+ 19 - 0
cmake/QtProtobufGen.cmake

@@ -109,3 +109,22 @@ function(generate_qtprotobuf)
     endif()
 endfunction()
 
+function(qtprotobuf_link_archive TARGET GENERATED_TARGET)
+    set_target_properties(${TARGET} PROPERTIES LINK_DIRECTORIES "$<TARGET_FILE_DIR:${GENERATED_TARGET}>")
+    get_target_property(EXISTING_FLAGS ${TARGET} LINK_FLAGS)
+    if(WIN32)
+        if("${EXISTING_FLAGS}" STREQUAL "EXISTING_FLAGS-NOTFOUND")
+            set_target_properties(${TARGET} PROPERTIES LINK_FLAGS "/WHOLEARCHIVE:${GENERATED_TARGET}")
+        else()
+            set_target_properties(${TARGET} PROPERTIES LINK_FLAGS "${EXISTING_FLAGS} /WHOLEARCHIVE:${GENERATED_TARGET}")
+        endif()
+    else()
+        if("${EXISTING_FLAGS}" STREQUAL "EXISTING_FLAGS-NOTFOUND")
+            set_target_properties(${TARGET} PROPERTIES LINK_FLAGS "-Wl,--whole-archive -l${GENERATED_TARGET} -Wl,--no-whole-archive")
+        else()
+            set_target_properties(${TARGET} PROPERTIES LINK_FLAGS "${EXISTING_FLAGS} -Wl,--whole-archive -l${GENERATED_TARGET} -Wl,--no-whole-archive")
+        endif()
+    endif()
+    target_include_directories(${TARGET} PRIVATE $<TARGET_PROPERTY:${GENERATED_TARGET},INCLUDE_DIRECTORIES>)
+    add_dependencies(${TARGET} ${GENERATED_TARGET})
+endfunction()

+ 0 - 2
examples/addressbook/main.cpp

@@ -31,7 +31,6 @@
 
 #include "addressbookengine.h"
 #include "addressbook.qpb.h"
-#include "qtprotobuf_global.qpb.h"
 
 #include <QMetaProperty>
 #include <QQmlPropertyMap>
@@ -41,7 +40,6 @@ using namespace qtprotobuf::examples;
 int main(int argc, char *argv[])
 {
     QtProtobuf::qRegisterProtobufTypes();
-    qtprotobuf::examples::qRegisterProtobufTypes();
 
     QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
 

+ 0 - 2
examples/simplechat/main.cpp

@@ -30,7 +30,6 @@
 #include <QQmlContext>
 
 #include "simplechat.qpb.h"
-#include "qtprotobuf_global.qpb.h"
 
 #include "simplechatengine.h"
 
@@ -43,7 +42,6 @@ using namespace qtprotobuf::examples;
 int main(int argc, char *argv[])
 {
     QtProtobuf::qRegisterProtobufTypes();
-    qtprotobuf::examples::qRegisterProtobufTypes();
 
     QGuiApplication app(argc, argv);
 

+ 1 - 1
src/generator/enumssourcegenerator.cpp

@@ -73,7 +73,7 @@ void EnumsSourceGenerator::printRegisterBody()
                                                                        {"type", mClassName},
                                                                        {"namespaces", mNamespacesColonDelimited},
                                                                        {"package", packageName}};
-
+    mPrinter->Print(registrationProperties, Templates::EnumRegistrarTemplate);
     mPrinter->Print(registrationProperties, Templates::ManualRegistrationGlobalEnumDefinition);
     Indent();
     if (GeneratorOptions::instance().hasQml()) {

+ 0 - 65
src/generator/generatorbase.cpp

@@ -68,70 +68,5 @@ void GeneratorBase::iterateNonNestedFileds(const ::google::protobuf::FileDescrip
 
 bool GeneratorBase::GenerateAll(const std::vector<const FileDescriptor *> &files, const string &parameter, GeneratorContext *generatorContext, string *error) const
 {
-    PackagesList packageList;
-    for (auto file : files) {
-        packageList[file->package()].push_back(file);
-    }
-
-    std::shared_ptr<io::ZeroCopyOutputStream> outfHeader(generatorContext->Open(Templates::GlobalDeclarationsFilename + Templates::ProtoFileSuffix + ".h"));
-    std::shared_ptr<::google::protobuf::io::Printer> outfHeaderPrinter(new ::google::protobuf::io::Printer(outfHeader.get(), '$'));
-
-    outfHeaderPrinter->Print(Templates::DisclaimerTemplate);
-    outfHeaderPrinter->Print(Templates::PreambleTemplate);
-    outfHeaderPrinter->Print(Templates::DefaultProtobufIncludesTemplate);
-
-    if (GeneratorOptions::instance().hasQml()) {
-        outfHeaderPrinter->Print(Templates::QmlProtobufIncludesTemplate);
-    }
-
-    bool addGlobalEnumsHeader = false;
-    for (auto file : files) {
-        if (m_mode == SingleMode) {
-            if (file->message_type_count() > 0 || file->enum_type_count() > 0) {
-                outfHeaderPrinter->Print({{"include", utils::extractFileName(file->name()) + Templates::ProtoFileSuffix}}, Templates::InternalIncludeTemplate);
-            }
-        } else {
-            iterateNonNestedFileds(file, [&outfHeaderPrinter, file, &addGlobalEnumsHeader](const ::google::protobuf::Descriptor *message) {
-                std::string messageName = message->name();
-                utils::tolower(messageName);
-                outfHeaderPrinter->Print({{"include", messageName}}, Templates::InternalIncludeTemplate);
-                if (file->enum_type_count() > 0) {
-                    addGlobalEnumsHeader = true;
-                }
-            });
-        }
-    }
-
-    if (addGlobalEnumsHeader) {
-        outfHeaderPrinter->Print({{"include", "globalenums"}}, Templates::InternalIncludeTemplate);
-    }
-
-    for (auto package : packageList) {
-        std::vector<std::string> namespaces;
-        utils::split(package.first, namespaces, '.');
-        for (auto ns : namespaces) {
-            outfHeaderPrinter->Print({{"namespace", ns}}, Templates::NamespaceTemplate);
-        }
-        outfHeaderPrinter->Print("inline void qRegisterProtobufTypes() {\n");
-        outfHeaderPrinter->Indent();
-        outfHeaderPrinter->Indent();
-        for (auto file : package.second) {
-            iterateNonNestedFileds(file, [&outfHeaderPrinter](const ::google::protobuf::Descriptor *message) {
-                outfHeaderPrinter->Print({{"classname", utils::upperCaseName(message->name())}}, "qRegisterProtobufType<$classname$>();\n");
-            });
-
-            for (int i = 0; i < file->enum_type_count(); i++) {
-                std::string enumRegistator = file->enum_type(i)->name() + Templates::EnumClassSuffix + "::registerTypes();\n";
-                outfHeaderPrinter->Print(enumRegistator.c_str());
-            }
-        }
-        outfHeaderPrinter->Outdent();
-        outfHeaderPrinter->Outdent();
-        outfHeaderPrinter->Print("}\n");
-        for (size_t i = 0; i < namespaces.size(); i++) {
-            outfHeaderPrinter->Print("}\n");
-        }
-    }
-
     return CodeGenerator::GenerateAll(files, parameter, generatorContext, error);
 }

+ 1 - 0
src/generator/protobufsourcegenerator.cpp

@@ -410,6 +410,7 @@ void ProtobufSourceGenerator::printGetters()
 
 void ProtobufSourceGenerator::printDestructor()
 {
+    mPrinter->Print({{"classname", mClassName}}, Templates::RegistrarTemplate);
     mPrinter->Print({{"classname", mClassName}}, "$classname$::~$classname$()\n"
                                                  "{}\n\n");
 }

+ 13 - 15
src/generator/templates.cpp

@@ -125,30 +125,30 @@ const char *Templates::MoveFieldTemplate = "set$property_name_cap$(std::exchange
 const char *Templates::EnumMoveFieldTemplate = "m_$property_name$ = other.m_$property_name$;\n";
 
 const char *Templates::AssignmentOperatorDeclarationTemplate = "$classname$ &operator =(const $classname$ &other);\n";
-const char *Templates::AssignmentOperatorDefinitionTemplate = "$classname$ &$classname$::operator =(const $classname$ &other) {\n";
+const char *Templates::AssignmentOperatorDefinitionTemplate = "$classname$ &$classname$::operator =(const $classname$ &other)\n{\n";
 const char *Templates::AssignmentOperatorReturnTemplate = "return *this;\n";
 
 const char *Templates::MoveAssignmentOperatorDeclarationTemplate = "$classname$ &operator =($classname$ &&other);\n";
-const char *Templates::MoveAssignmentOperatorDefinitionTemplate = "$classname$ &$classname$::operator =($classname$ &&other) {\n";
+const char *Templates::MoveAssignmentOperatorDefinitionTemplate = "$classname$ &$classname$::operator =($classname$ &&other)\n{\n";
 
 const char *Templates::EqualOperatorDeclarationTemplate = "bool operator ==(const $classname$ &other) const;\n";
-const char *Templates::EqualOperatorDefinitionTemplate = "bool $classname$::operator ==(const $classname$ &other) const {\n"
+const char *Templates::EqualOperatorDefinitionTemplate = "bool $classname$::operator ==(const $classname$ &other) const\n{\n"
                                                "    return ";
 const char *Templates::EqualOperatorPropertyTemplate = "m_$property_name$ == other.m_$property_name$";
 const char *Templates::EqualOperatorMessagePropertyTemplate = "*m_$property_name$ == *other.m_$property_name$";
 
 const char *Templates::NotEqualOperatorDeclarationTemplate = "bool operator !=(const $classname$ &other) const;\n";
-const char *Templates::NotEqualOperatorDefinitionTemplate = "bool $classname$::operator !=(const $classname$ &other) const {\n"
+const char *Templates::NotEqualOperatorDefinitionTemplate = "bool $classname$::operator !=(const $classname$ &other) const\n{\n"
                                                   "    return !this->operator ==(other);\n"
                                                   "}\n\n";
 
 const char *Templates::GetterPrivateMessageDeclarationTemplate = "$type$ *$property_name$_p() const;\n";
-const char *Templates::GetterPrivateMessageDefinitionTemplate = "$type$ *$classname$::$property_name$_p() const {\n"
+const char *Templates::GetterPrivateMessageDefinitionTemplate = "$type$ *$classname$::$property_name$_p() const\n{\n"
                                         "    return m_$property_name$.get();\n"
                                         "}\n\n";
 
 const char *Templates::GetterMessageDeclarationTemplate = "const $type$ &$property_name$() const;\n";
-const char *Templates::GetterMessageDefinitionTemplate = "const $type$ &$classname$::$property_name$() const {\n"
+const char *Templates::GetterMessageDefinitionTemplate = "const $type$ &$classname$::$property_name$() const\n{\n"
                                         "    return *m_$property_name$;\n"
                                         "}\n\n";
 
@@ -157,17 +157,17 @@ const char *Templates::GetterTemplate = "const $type$ $property_name$() const {\
                                         "}\n\n";
 
 const char *Templates::GetterContainerExtraDeclarationTemplate = "$type$ &$property_name$();\n";
-const char *Templates::GetterContainerExtraDefinitionTemplate = "$type$ &$classname$::$property_name$() {\n"
+const char *Templates::GetterContainerExtraDefinitionTemplate = "$type$ &$classname$::$property_name$()\n{\n"
                                         "    return m_$property_name$;\n"
                                         "}\n\n";
 
 const char *Templates::GetterQmlListDeclarationTemplate = "QQmlListProperty<$type_nolist$> $property_name$_l();\n";
-const char *Templates::GetterQmlListDefinitionTemplate = "QQmlListProperty<$type_nolist$> $classname$::$property_name$_l() {\n"
+const char *Templates::GetterQmlListDefinitionTemplate = "QQmlListProperty<$type_nolist$> $classname$::$property_name$_l()\n{\n"
                                                "    return QtProtobuf::constructQmlListProperty<$type_nolist$>(this, &m_$property_name$);\n"
                                                "}\n\n";
 
 const char *Templates::SetterPrivateTemplateDeclarationMessageType = "void set$property_name_cap$_p($type$ *$property_name$);\n";
-const char *Templates::SetterPrivateTemplateDefinitionMessageType = "void $classname$::set$property_name_cap$_p($type$ *$property_name$) {\n"
+const char *Templates::SetterPrivateTemplateDefinitionMessageType = "void $classname$::set$property_name_cap$_p($type$ *$property_name$)\n{\n"
                                                    "    if ($property_name$ == nullptr) {\n"
                                                    "        *m_$property_name$ = {};\n"
                                                    "        return;\n"
@@ -181,7 +181,7 @@ const char *Templates::SetterPrivateTemplateDefinitionMessageType = "void $class
                                                    "}\n\n";
 
 const char *Templates::SetterTemplateDeclarationMessageType = "void set$property_name_cap$(const $type$ &$property_name$);\n";
-const char *Templates::SetterTemplateDefinitionMessageType = "void $classname$::set$property_name_cap$(const $type$ &$property_name$) {\n"
+const char *Templates::SetterTemplateDefinitionMessageType = "void $classname$::set$property_name_cap$(const $type$ &$property_name$)\n{\n"
                                                    "    if (*m_$property_name$ != $property_name$) {\n"
                                                    "        *m_$property_name$ = $property_name$;\n"
                                                    "        $property_name$Changed();\n"
@@ -189,7 +189,7 @@ const char *Templates::SetterTemplateDefinitionMessageType = "void $classname$::
                                                    "}\n\n";
 
 const char *Templates::SetterTemplateDeclarationComplexType = "void set$property_name_cap$(const $type$ &$property_name$);\n";
-const char *Templates::SetterTemplateDefinitionComplexType = "void $classname$::set$property_name_cap$(const $type$ &$property_name$) {\n"
+const char *Templates::SetterTemplateDefinitionComplexType = "void $classname$::set$property_name_cap$(const $type$ &$property_name$)\n{\n"
                                                    "    if (m_$property_name$ != $property_name$) {\n"
                                                    "        m_$property_name$ = $property_name$;\n"
                                                    "        $property_name$Changed();\n"
@@ -270,7 +270,8 @@ const char *Templates::ClientMethodDefinitionAsync2Template = "\nvoid $classname
 
 const char *Templates::RegisterSerializersTemplate = "qRegisterProtobufType<$classname$>();\n";
 const char *Templates::RegisterEnumSerializersTemplate = "qRegisterProtobufEnumType<$type$>();\n";
-const char *Templates::RegistratorTemplate = "static QtProtobuf::QProtobufRegistrationHelper helper(registerTypes);\n";
+const char *Templates::RegistrarTemplate = "static QtProtobuf::ProtoTypeRegistrar<$classname$> ProtoTypeRegistrar$classname$(qRegisterProtobufType<$classname$>);\n";
+const char *Templates::EnumRegistrarTemplate = "static QtProtobuf::ProtoTypeRegistrar<$classname$> ProtoTypeRegistrar$classname$($classname$::registerTypes);\n";
 const char *Templates::QmlRegisterTypeTemplate = "qmlRegisterType<$namespaces$::$classname$>(\"$package$\", 1, 0, \"$classname$\");\n";
 const char *Templates::QmlRegisterTypeUncreatableTemplate = "qmlRegisterUncreatableType<$namespaces$::$classname$>(\"$package$\", 1, 0, \"$classname$\", \"$namespaces$::$classname$ Could not be created from qml context\");\n";
 
@@ -312,6 +313,3 @@ const char *Templates::ProtoFileSuffix = ".qpb";
 const char *Templates::GrpcFileSuffix = "_grpc";
 
 const char *Templates::EnumClassSuffix = "Gadget";
-
-const std::string Templates::GlobalDeclarationsFilename = std::string("qtprotobuf_global");
-

+ 2 - 2
src/generator/templates.h

@@ -147,7 +147,8 @@ public:
     static const char *MapSerializationRegisterTemplate;
     static const char *RegisterSerializersTemplate;
     static const char *RegisterEnumSerializersTemplate;
-    static const char *RegistratorTemplate;
+    static const char *RegistrarTemplate;
+    static const char *EnumRegistrarTemplate;
     static const char *QmlRegisterTypeTemplate;
     static const char *QmlRegisterTypeUncreatableTemplate;
     //Service templates
@@ -175,7 +176,6 @@ public:
     static const char *EnumClassSuffix;
 
     static const std::unordered_map<::google::protobuf::FieldDescriptor::Type, std::string> TypeReflection;
-    static const std::string GlobalDeclarationsFilename;
 };
 
 } //namespace generator

+ 9 - 0
src/protobuf/qtprotobuf.cpp

@@ -82,6 +82,11 @@ void registerBasicConverters() {
 
 }
 
+std::list<RegisterFunction>& registerFunctions() {
+    static std::list<std::function<void(void)>> registrationList;
+    return registrationList;
+}
+
 void qRegisterProtobufTypes() {
     static bool registred = false;
     if (registred) {
@@ -119,5 +124,9 @@ void qRegisterProtobufTypes() {
     registerBasicConverters<sfixed64>();
     registerBasicConverters<fixed32>();
     registerBasicConverters<fixed64>();
+
+    for (auto registerFunc : registerFunctions()) {
+        registerFunc();
+    }
 }
 }

+ 16 - 0
src/protobuf/qtprotobuftypes.h

@@ -31,6 +31,8 @@
 #include <QMetaType>
 
 #include <unordered_map>
+#include <functional>
+#include <list>
 
 namespace QtProtobuf {
 
@@ -237,6 +239,20 @@ using DoubleList = QList<double>;
 extern Q_PROTOBUF_EXPORT void qRegisterProtobufTypes();
 
 /*! \} */
+
+//!\private
+using RegisterFunction = std::function<void(void)>;
+
+//!\private
+extern Q_PROTOBUF_EXPORT std::list<RegisterFunction>& registerFunctions();
+
+//!\private
+template <typename T>
+struct ProtoTypeRegistrar {
+    ProtoTypeRegistrar(RegisterFunction initializer) {
+        registerFunctions().push_back(initializer);
+    }
+};
 }
 
 Q_DECLARE_METATYPE(QtProtobuf::int32)

+ 0 - 2
tests/test_grpc/clienttest.cpp

@@ -24,7 +24,6 @@
  */
 
 #include "testservice_grpc.qpb.h"
-#include "qtprotobuf_global.qpb.h"
 #include <QGrpcHttp2Channel>
 #include <QGrpcCredentials>
 #include <QGrpcInsecureCredentials>
@@ -46,7 +45,6 @@ class ClientTest : public ::testing::Test
 protected:
     static void SetUpTestCase() {
         QtProtobuf::qRegisterProtobufTypes();
-        qRegisterProtobufType<SimpleStringMessage>();
     }
     static QCoreApplication m_app;
     static int m_argc;

+ 0 - 4
tests/test_protobuf/deserializationtest.cpp

@@ -26,7 +26,6 @@
 #include "deserializationtest.h"
 
 #include "simpletest.qpb.h"
-#include "qtprotobuf_global.qpb.h"
 
 using namespace qtprotobufnamespace::tests;
 using namespace QtProtobuf::tests;
@@ -36,9 +35,6 @@ void DeserializationTest::SetUpTestCase()
 {
     //Register all types
     QtProtobuf::qRegisterProtobufTypes();
-    qtprotobufnamespace::tests::qRegisterProtobufTypes();
-    qtprotobufnamespace1::externaltests::qRegisterProtobufTypes();
-    qtprotobufnamespace::tests::globalenums::qRegisterProtobufTypes();
 }
 
 void DeserializationTest::SetUp()

+ 0 - 4
tests/test_protobuf/jsonserializationtest.cpp

@@ -30,7 +30,6 @@
 #include <qprotobufjsonserializer.h>
 
 #include "simpletest.qpb.h"
-#include "qtprotobuf_global.qpb.h"
 
 using namespace qtprotobufnamespace::tests;
 
@@ -44,9 +43,6 @@ public:
     void SetUp() override;
     static void SetUpTestCase() {
         QtProtobuf::qRegisterProtobufTypes();
-        qtprotobufnamespace::tests::qRegisterProtobufTypes();
-        qtprotobufnamespace1::externaltests::qRegisterProtobufTypes();
-        qtprotobufnamespace::tests::globalenums::qRegisterProtobufTypes();
     }
 
 protected:

+ 0 - 4
tests/test_protobuf/serializationtest.cpp

@@ -26,7 +26,6 @@
 #include "serializationtest.h"
 
 #include "simpletest.qpb.h"
-#include "qtprotobuf_global.qpb.h"
 
 using namespace qtprotobufnamespace::tests;
 using namespace QtProtobuf::tests;
@@ -37,9 +36,6 @@ void SerializationTest::SetUpTestCase()
 {
     //Register all types
     QtProtobuf::qRegisterProtobufTypes();
-    qtprotobufnamespace::tests::qRegisterProtobufTypes();
-    qtprotobufnamespace1::externaltests::qRegisterProtobufTypes();
-    qtprotobufnamespace::tests::globalenums::qRegisterProtobufTypes();
 }
 
 void SerializationTest::SetUp()

+ 4 - 0
tests/test_protobuf/simpletest.cpp

@@ -24,5 +24,9 @@
  */
 
 #include "simpletest.qpb.h"
+#include "sequencetest.qpb.h"
+#include "externalpackagetest.qpb.h"
+#include "globalenums.qpb.h"
+#include "globalenumssamenamespace.qpb.h"
 
 #include "./simpletest.cpp.inc"

+ 0 - 6
tests/test_protobuf/simpletest.cpp.inc

@@ -29,8 +29,6 @@
 
 #include <gtest/gtest.h>
 
-#include "qtprotobuf_global.qpb.h"
-
 using namespace qtprotobufnamespace::tests;
 
 namespace QtProtobuf {
@@ -61,10 +59,6 @@ public:
 void SimpleTest::SetUpTestCase()
 {
     QtProtobuf::qRegisterProtobufTypes();
-    qtprotobufnamespace::tests::qRegisterProtobufTypes();
-    qtprotobufnamespace1::externaltests::qRegisterProtobufTypes();
-    qtprotobufnamespace::tests::globalenums::qRegisterProtobufTypes();
-    qtprotobufnamespace::tests::sequence::qRegisterProtobufTypes();
 }
 
 TEST_F(SimpleTest, SimpleBoolMessageTest)

+ 1 - 0
tests/test_protobuf_multifile/simpletest.cpp

@@ -85,6 +85,7 @@
 #include "lowercasesequence2.h"
 #include "lowercasemessagename.h"
 #include "lowercasefieldmessagename.h"
+#include "messageuppercase.h"
 
 #include "globalenums.h"
 

+ 2 - 1
tests/test_qml/CMakeLists.txt

@@ -9,7 +9,8 @@ file(GLOB SOURCES main.cpp)
 file(GLOB QML_FILES qml/tst_simple.qml)
 
 add_executable(${TARGET} ${SOURCES} ${QML_FILES})
-target_link_libraries(${TARGET} Qt5::Core Qt5::Qml Qt5::Network Qt5::Quick Qt5::Test Qt5::QuickTest qtprotobuf_test_qtprotobuf_gen QtProtobufProject::QtProtobuf)
+target_link_libraries(${TARGET} Qt5::Core Qt5::Qml Qt5::Network Qt5::Quick Qt5::Test Qt5::QuickTest QtProtobufProject::QtProtobuf)
+qtprotobuf_link_archive(${TARGET} qtprotobuf_test_qtprotobuf_gen)
 
 add_target_qml(TARGET ${TARGET} QML_FILES ${QML_FILES})
 add_target_windeployqt(TARGET ${TARGET} QML_DIR ${CMAKE_CURRENT_SOURCE_DIR}/qml)

+ 0 - 3
tests/test_qml/main.cpp

@@ -28,7 +28,6 @@
 #include <QQmlContext>
 
 #include "simpletest.qpb.h"
-#include "qtprotobuf_global.qpb.h"
 
 using namespace qtprotobufnamespace::tests;
 
@@ -37,8 +36,6 @@ class TestSetup : public QObject {
 public:
     TestSetup() {
         QtProtobuf::qRegisterProtobufTypes();
-        qtprotobufnamespace::tests::qRegisterProtobufTypes();
-
     }
     ~TestSetup() = default;
 public slots: