mirror of https://github.com/qt/qtgrpc.git
Create both plugin and backing library in qt_add_protobuf
This approach allows reusing the existing backing target if it's library and makes step towards plugin-less Qml module. Pick-to: 6.6 Task-number: QTBUG-115117 Change-Id: I02243d700683ac9e01c1471c3ccccaae71841165 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
This commit is contained in:
parent
16713c6e32
commit
e9f6546483
|
|
@ -419,6 +419,32 @@ function(qt6_add_protobuf target)
|
|||
target_sources(${target} PRIVATE ${type_registrations})
|
||||
endif()
|
||||
|
||||
if(arg_QML)
|
||||
string(REPLACE "." "/" qml_module_output_path "${qml_uri}")
|
||||
set(qml_module_output_full_path "${CMAKE_CURRENT_BINARY_DIR}/${qml_module_output_path}")
|
||||
|
||||
qt_policy(SET QTP0001 NEW)
|
||||
qt6_add_qml_module(${target}
|
||||
URI ${qml_uri}
|
||||
NO_GENERATE_PLUGIN_SOURCE
|
||||
NO_PLUGIN_OPTIONAL
|
||||
PLUGIN_TARGET "${target}plugin"
|
||||
VERSION 1.0
|
||||
OUTPUT_DIRECTORY "${qml_module_output_full_path}"
|
||||
)
|
||||
target_sources(${target}plugin PRIVATE
|
||||
"${output_directory}/${qml_plugin_base_name}plugin.cpp")
|
||||
set_target_properties(${target}plugin
|
||||
PROPERTIES
|
||||
AUTOMOC ON
|
||||
)
|
||||
target_link_libraries(${target}plugin PRIVATE
|
||||
${QT_CMAKE_EXPORT_NAMESPACE}::Protobuf
|
||||
)
|
||||
|
||||
list(APPEND ${arg_OUTPUT_TARGETS} ${target}plugin)
|
||||
endif()
|
||||
|
||||
if(DEFINED arg_OUTPUT_HEADERS)
|
||||
set(${arg_OUTPUT_HEADERS} "${generated_headers}" PARENT_SCOPE)
|
||||
endif()
|
||||
|
|
@ -426,20 +452,6 @@ function(qt6_add_protobuf target)
|
|||
if(DEFINED arg_OUTPUT_TARGETS)
|
||||
set(${arg_OUTPUT_TARGETS} "${${arg_OUTPUT_TARGETS}}" PARENT_SCOPE)
|
||||
endif()
|
||||
|
||||
if(arg_QML)
|
||||
qt_policy(SET QTP0001 NEW)
|
||||
string(REPLACE "." "/" output_qml_plugin "${qml_uri}")
|
||||
qt6_add_qml_module(${target}
|
||||
URI ${qml_uri}
|
||||
PLUGIN_TARGET ${target}
|
||||
NO_PLUGIN_OPTIONAL
|
||||
NO_GENERATE_PLUGIN_SOURCE
|
||||
VERSION 1.0
|
||||
OUTPUT_DIRECTORY
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${output_qml_plugin}
|
||||
)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
|
||||
|
|
|
|||
|
|
@ -207,11 +207,18 @@ void QProtobufGenerator::GenerateQmlPluginIntro(Printer *printer,
|
|||
}
|
||||
printer->Print("\n");
|
||||
printer->Print(CommonTemplates::QmlPluginExportMacroTemplate());
|
||||
|
||||
std::string qmlPackageEscaped = utils::escapedQmlUri(qmlPackageUri);
|
||||
printer->Print({{"qml_package", qmlPackageUri},
|
||||
{"qml_package_escaped", qmlPackageEscaped}},
|
||||
CommonTemplates::QmlExtensionPluginPreamble());
|
||||
|
||||
printer->Print({{"plugin_name", pluginClassName}},
|
||||
CommonTemplates::QmlExtensionPluginClass());
|
||||
|
||||
printer->Print({{"plugin_name", pluginClassName},
|
||||
{"qml_package", qmlPackageUri}},
|
||||
{"qml_package", qmlPackageUri},
|
||||
{"qml_package_escaped", qmlPackageEscaped}},
|
||||
CommonTemplates::QmlExtensionPluginClassBody());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1042,6 +1042,12 @@ const char *CommonTemplates::QmlPluginExportMacroTemplate()
|
|||
"#endif\n";
|
||||
}
|
||||
|
||||
const char *CommonTemplates::QmlExtensionPluginPreamble()
|
||||
{
|
||||
return "\nextern void qml_register_types_$qml_package_escaped$();\n"
|
||||
"Q_GHS_KEEP_REFERENCE(qml_register_types_$qml_package_escaped$);\n";
|
||||
}
|
||||
|
||||
const char *CommonTemplates::QmlExtensionPluginClass()
|
||||
{
|
||||
return "\nclass QPB_QML_EXPORT $plugin_name$Plugin : public QQmlExtensionPlugin\n";
|
||||
|
|
@ -1057,6 +1063,8 @@ const char *CommonTemplates::QmlExtensionPluginClassBody()
|
|||
" void registerTypes(const char *uri) override\n"
|
||||
" {\n"
|
||||
" Q_ASSERT(uri == QLatin1String(\"$qml_package$\"));\n"
|
||||
" volatile auto registration = &qml_register_types_$qml_package_escaped$;\n"
|
||||
" Q_UNUSED(registration);\n"
|
||||
" qmlRegisterModule(uri, 1, 0);\n";
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -204,6 +204,7 @@ public:
|
|||
static const char *ExportMacroTemplate();
|
||||
|
||||
static const char *QmlPluginExportMacroTemplate();
|
||||
static const char *QmlExtensionPluginPreamble();
|
||||
static const char *QmlExtensionPluginClass();
|
||||
static const char *QmlExtensionPluginClassNoExport();
|
||||
static const char *QmlExtensionPluginClassBody();
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
|
||||
#include <ctype.h>
|
||||
#include <assert.h>
|
||||
#include <regex>
|
||||
|
||||
namespace {
|
||||
const std::string_view asciiSpacing = " \t\n\r\f\v";
|
||||
|
|
@ -100,6 +101,13 @@ std::string deCapitalizeAsciiName(std::string name)
|
|||
return name;
|
||||
}
|
||||
|
||||
std::string escapedQmlUri(const std::string &uri)
|
||||
{
|
||||
assert(!uri.empty());
|
||||
static std::regex uriExceptionsRegex("[^a-zA-Z0-9]");
|
||||
return std::regex_replace(uri, uriExceptionsRegex, "_");
|
||||
}
|
||||
|
||||
std::string &rtrim(std::string &s)
|
||||
{
|
||||
const size_t cut = s.find_last_not_of(asciiSpacing);
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ std::string removeFileSuffix(std::string fileName);
|
|||
std::string extractFileBasename(std::string fileName);
|
||||
std::string capitalizeAsciiName(std::string name);
|
||||
std::string deCapitalizeAsciiName(std::string name);
|
||||
std::string escapedQmlUri(const std::string &uri);
|
||||
std::string &rtrim(std::string &s);
|
||||
// trim from beginning of string (left)
|
||||
std::string <rim(std::string &s);
|
||||
|
|
|
|||
|
|
@ -13,6 +13,9 @@
|
|||
# define QPB_QML_EXPORT
|
||||
#endif
|
||||
|
||||
extern void qml_register_types_nopackage_uri_test();
|
||||
Q_GHS_KEEP_REFERENCE(qml_register_types_nopackage_uri_test);
|
||||
|
||||
class QPB_QML_EXPORT NopackageUriTestPlugin : public QQmlExtensionPlugin
|
||||
{
|
||||
Q_OBJECT
|
||||
|
|
@ -24,6 +27,8 @@ public:
|
|||
void registerTypes(const char *uri) override
|
||||
{
|
||||
Q_ASSERT(uri == QLatin1String("nopackage.uri.test"));
|
||||
volatile auto registration = &qml_register_types_nopackage_uri_test;
|
||||
Q_UNUSED(registration);
|
||||
qmlRegisterModule(uri, 1, 0);
|
||||
qmlRegisterUncreatableMetaObject(
|
||||
::TestEnumGadget::staticMetaObject,
|
||||
|
|
|
|||
|
|
@ -14,6 +14,9 @@
|
|||
# define QPB_QML_EXPORT
|
||||
#endif
|
||||
|
||||
extern void qml_register_types_qtprotobufnamespace_tests();
|
||||
Q_GHS_KEEP_REFERENCE(qml_register_types_qtprotobufnamespace_tests);
|
||||
|
||||
class QPB_QML_EXPORT QtprotobufnamespaceTestsPlugin : public QQmlExtensionPlugin
|
||||
{
|
||||
Q_OBJECT
|
||||
|
|
@ -25,6 +28,8 @@ public:
|
|||
void registerTypes(const char *uri) override
|
||||
{
|
||||
Q_ASSERT(uri == QLatin1String("qtprotobufnamespace.tests"));
|
||||
volatile auto registration = &qml_register_types_qtprotobufnamespace_tests;
|
||||
Q_UNUSED(registration);
|
||||
qmlRegisterModule(uri, 1, 0);
|
||||
qmlRegisterUncreatableMetaObject(
|
||||
qtprotobufnamespace::tests::SimpleEnumMessage::staticMetaObject,
|
||||
|
|
|
|||
Loading…
Reference in New Issue