summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Griebl <robert.griebl@qt.io>2023-02-10 16:54:05 +0100
committerRobert Griebl <robert.griebl@qt.io>2023-02-16 15:16:41 +0100
commitfd900784f41711c500369e1c39e46c73e95878cb (patch)
treed45ac7f23ffc4f10f795623c0ec663eb67681bbd
parent4a14abf206c548b80f2942c4d42e23b0e97ddeb1 (diff)
downloadqtapplicationmanager-fd900784f41711c500369e1c39e46c73e95878cb.tar.gz
Allow the registration of custom runtimes without patching
The new configuration key runtimes.registerCustomIds will now allow a configuration based registration of custom runtimes. Change-Id: Id94ab614a8460e4d941b97d8ed008f75b3d88d27 Task-number: QTBUG-107886 Pick-to: 6.5 Reviewed-by: Dominik Holland <dominik.holland@qt.io>
-rw-r--r--doc/configuration.qdoc4
-rw-r--r--src/main-lib/configuration.cpp19
-rw-r--r--src/main-lib/configuration.h1
-rw-r--r--src/main-lib/configuration_p.h1
-rw-r--r--src/main-lib/main.cpp13
-rw-r--r--src/main-lib/main.h3
-rw-r--r--tests/auto/configuration/data/config1.yaml1
-rw-r--r--tests/auto/configuration/data/config2.yaml1
-rw-r--r--tests/auto/configuration/tst_configuration.cpp4
9 files changed, 39 insertions, 8 deletions
diff --git a/doc/configuration.qdoc b/doc/configuration.qdoc
index 18473bb1..495794c6 100644
--- a/doc/configuration.qdoc
+++ b/doc/configuration.qdoc
@@ -408,6 +408,10 @@ ui:
\li This option can be used to specify options for runtimes, as a map of key-value pairs.
The key is the runtime's name; the value is interpreted by the respective runtime
implementation. For more information, see \l {Runtime Configuration}.
+ There is one special key named \c{additionalLaunchers}: the value is an array of \c id
+ strings, and all these ids are registered as custom runtimes. A corresponding
+ \c{appman-launcher-<id>} executable is expected to be available when launching apps
+ based on the respective runtime.
\row
\li [\c containers]
\li map<object>
diff --git a/src/main-lib/configuration.cpp b/src/main-lib/configuration.cpp
index f070c399..a94e2389 100644
--- a/src/main-lib/configuration.cpp
+++ b/src/main-lib/configuration.cpp
@@ -375,7 +375,7 @@ void Configuration::parseWithArguments(const QStringList &arguments)
}
-const quint32 ConfigurationData::DataStreamVersion = 9;
+const quint32 ConfigurationData::DataStreamVersion = 10;
ConfigurationData *ConfigurationData::loadFromCache(QDataStream &ds)
@@ -438,7 +438,8 @@ ConfigurationData *ConfigurationData::loadFromCache(QDataStream &ds)
>> cd->wayland.extraSockets
>> cd->flags.allowUnsignedPackages
>> cd->flags.allowUnknownUiClients
- >> cd->instanceId;
+ >> cd->instanceId
+ >> cd->runtimes.additionalLaunchers;
return cd;
}
@@ -502,7 +503,8 @@ void ConfigurationData::saveToCache(QDataStream &ds) const
<< wayland.extraSockets
<< flags.allowUnsignedPackages
<< flags.allowUnknownUiClients
- << instanceId;
+ << instanceId
+ << runtimes.additionalLaunchers;
}
template <typename T> void mergeField(T &into, const T &from, const T &def)
@@ -604,6 +606,7 @@ void ConfigurationData::mergeFrom(const ConfigurationData *from)
MERGE_FIELD(flags.allowUnsignedPackages);
MERGE_FIELD(flags.allowUnknownUiClients);
MERGE_FIELD(instanceId);
+ MERGE_FIELD(runtimes.additionalLaunchers);
}
QByteArray ConfigurationData::substituteVars(const QByteArray &sourceContent, const QString &fileName)
@@ -672,7 +675,10 @@ ConfigurationData *ConfigurationData::loadFromSource(QIODevice *source, const QS
}
} },
{ "runtimes", false, YamlParser::Map, [&cd](YamlParser *p) {
- cd->runtimes.configurations = p->parseMap(); } },
+ cd->runtimes.configurations = p->parseMap();
+ QVariant additionalLaunchers = cd->runtimes.configurations.take(qSL("additionalLaunchers"));
+ cd->runtimes.additionalLaunchers = variantToStringList(additionalLaunchers);
+ } },
{ "containers", false, YamlParser::Map, [&cd](YamlParser *p) {
cd->containers.configurations = p->parseMap();
@@ -1165,6 +1171,11 @@ QVariantMap Configuration::containerConfigurations() const
return m_data->containers.configurations;
}
+QStringList Configuration::runtimeAdditionalLaunchers() const
+{
+ return m_data->runtimes.additionalLaunchers;
+}
+
QVariantMap Configuration::runtimeConfigurations() const
{
return m_data->runtimes.configurations;
diff --git a/src/main-lib/configuration.h b/src/main-lib/configuration.h
index dffce6c7..98e6e154 100644
--- a/src/main-lib/configuration.h
+++ b/src/main-lib/configuration.h
@@ -86,6 +86,7 @@ public:
QList<QPair<QString, QString>> containerSelectionConfiguration() const;
QVariantMap containerConfigurations() const;
+ QStringList runtimeAdditionalLaunchers() const;
QVariantMap runtimeConfigurations() const;
QVariantMap dbusPolicy(const char *interfaceName) const;
diff --git a/src/main-lib/configuration_p.h b/src/main-lib/configuration_p.h
index 6e2de47f..78b4643e 100644
--- a/src/main-lib/configuration_p.h
+++ b/src/main-lib/configuration_p.h
@@ -32,6 +32,7 @@ struct ConfigurationData
QString instanceId;
struct Runtimes {
+ QStringList additionalLaunchers;
QVariantMap configurations;
} runtimes;
diff --git a/src/main-lib/main.cpp b/src/main-lib/main.cpp
index 6c2e7e67..25966a01 100644
--- a/src/main-lib/main.cpp
+++ b/src/main-lib/main.cpp
@@ -192,8 +192,9 @@ void Main::setup(const Configuration *cfg) Q_DECL_NOEXCEPT_EXPR(false)
setMainQmlFile(cfg->mainQmlFile());
setupSingleOrMultiProcess(cfg->forceSingleProcess(), cfg->forceMultiProcess());
- setupRuntimesAndContainers(cfg->runtimeConfigurations(), cfg->openGLConfiguration(),
+ setupRuntimesAndContainers(cfg->runtimeConfigurations(), cfg->runtimeAdditionalLaunchers(),
cfg->containerConfigurations(), cfg->pluginFilePaths("container"),
+ cfg->openGLConfiguration(),
cfg->iconThemeSearchPaths(), cfg->iconThemeName());
loadPackageDatabase(cfg->clearCache() || cfg->noCache(), cfg->singleApp());
@@ -360,8 +361,9 @@ void Main::setupSingleOrMultiProcess(bool forceSingleProcess, bool forceMultiPro
#endif
}
-void Main::setupRuntimesAndContainers(const QVariantMap &runtimeConfigurations, const QVariantMap &openGLConfiguration,
+void Main::setupRuntimesAndContainers(const QVariantMap &runtimeConfigurations, const QStringList &runtimeAdditionalLaunchers,
const QVariantMap &containerConfigurations, const QStringList &containerPluginPaths,
+ const QVariantMap &openGLConfiguration,
const QStringList &iconThemeSearchPaths, const QString &iconThemeName)
{
if (m_isSingleProcessMode) {
@@ -372,9 +374,14 @@ void Main::setupRuntimesAndContainers(const QVariantMap &runtimeConfigurations,
#if defined(AM_MULTI_PROCESS)
RuntimeFactory::instance()->registerRuntime(new NativeRuntimeManager());
RuntimeFactory::instance()->registerRuntime(new NativeRuntimeManager(qSL("qml")));
- //RuntimeFactory::instance()->registerRuntime(new NativeRuntimeManager(qSL("html")));
+
+ for (const QString &runtimeId : runtimeAdditionalLaunchers)
+ RuntimeFactory::instance()->registerRuntime(new NativeRuntimeManager(runtimeId));
ContainerFactory::instance()->registerContainer(new ProcessContainerManager());
+#else
+ if (!runtimeAdditionalLaunchers.isEmpty())
+ qCWarning(LogSystem) << "Addtional runtime launchers are ignored in single-process mode";
#endif
auto containerPlugins = loadPlugins<ContainerManagerInterface>("container", containerPluginPaths);
for (auto iface : std::as_const(containerPlugins))
diff --git a/src/main-lib/main.h b/src/main-lib/main.h
index 6dc0e907..a6652383 100644
--- a/src/main-lib/main.h
+++ b/src/main-lib/main.h
@@ -75,8 +75,9 @@ protected:
const std::function<QVariantMap(const char *)> &policyForInterface, const QString &instanceId);
void setMainQmlFile(const QString &mainQml) Q_DECL_NOEXCEPT_EXPR(false);
void setupSingleOrMultiProcess(bool forceSingleProcess, bool forceMultiProcess) Q_DECL_NOEXCEPT_EXPR(false);
- void setupRuntimesAndContainers(const QVariantMap &runtimeConfigurations, const QVariantMap &openGLConfiguration,
+ void setupRuntimesAndContainers(const QVariantMap &runtimeConfigurations, const QStringList &runtimeAdditionalLaunchers,
const QVariantMap &containerConfigurations, const QStringList &containerPluginPaths,
+ const QVariantMap &openGLConfiguration,
const QStringList &iconThemeSearchPaths, const QString &iconThemeName);
void loadPackageDatabase(bool recreateDatabase, const QString &singlePackage) Q_DECL_NOEXCEPT_EXPR(false);
void setupIntents(int disambiguationTimeout, int startApplicationTimeout,
diff --git a/tests/auto/configuration/data/config1.yaml b/tests/auto/configuration/data/config1.yaml
index 0db3414e..8f9263fa 100644
--- a/tests/auto/configuration/data/config1.yaml
+++ b/tests/auto/configuration/data/config1.yaml
@@ -2,6 +2,7 @@ formatVersion: 1
formatType: am-configuration
---
runtimes:
+ additionalLaunchers: a
r-test:
r-parameter: r-value
diff --git a/tests/auto/configuration/data/config2.yaml b/tests/auto/configuration/data/config2.yaml
index 763f40d5..1913d4e5 100644
--- a/tests/auto/configuration/data/config2.yaml
+++ b/tests/auto/configuration/data/config2.yaml
@@ -2,6 +2,7 @@ formatVersion: 1
formatType: am-configuration
---
runtimes:
+ additionalLaunchers: [ b, c ]
r-test:
r-parameter: xr-value
r-test2:
diff --git a/tests/auto/configuration/tst_configuration.cpp b/tests/auto/configuration/tst_configuration.cpp
index 56eed174..603fca67 100644
--- a/tests/auto/configuration/tst_configuration.cpp
+++ b/tests/auto/configuration/tst_configuration.cpp
@@ -88,6 +88,7 @@ void tst_Configuration::defaultConfig()
QCOMPARE(c.containerSelectionConfiguration(), {});
QCOMPARE(c.containerConfigurations(), QVariantMap {});
+ QCOMPARE(c.runtimeAdditionalLaunchers(), QStringList {});
QCOMPARE(c.runtimeConfigurations(), QVariantMap {});
QCOMPARE(c.dbusRegistration("iface1"), qSL("auto"));
@@ -192,6 +193,7 @@ void tst_Configuration::simpleConfig()
{ qSL("r-parameter"), qSL("r-value") }
} }
}));
+ QCOMPARE(c.runtimeAdditionalLaunchers(), QStringList(qSL("a")));
QCOMPARE(c.dbusRegistration("iface1"), qSL("foobus"));
@@ -333,6 +335,7 @@ void tst_Configuration::mergedConfig()
} }
}));
+ QCOMPARE(c.runtimeAdditionalLaunchers(), QStringList({ qSL("a"), qSL("b"), qSL("c") }));
QCOMPARE(c.dbusRegistration("iface1"), qSL("foobus1"));
QCOMPARE(c.dbusRegistration("iface2"), qSL("foobus2"));
@@ -480,6 +483,7 @@ void tst_Configuration::commandLineConfig()
QCOMPARE(c.containerSelectionConfiguration(), {});
QCOMPARE(c.containerConfigurations(), QVariantMap{});
QCOMPARE(c.runtimeConfigurations(), QVariantMap{});
+ QCOMPARE(c.runtimeAdditionalLaunchers(), QStringList{});
QCOMPARE(c.dbusRegistration("iface1"), qSL("system"));