From ef9ac8f2f43af1effacb985dc6c4eff6cf742985 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Mon, 29 Jan 2018 13:38:41 +0100 Subject: [PATCH] QmlProject: Add support for setting the environment This allows setting arbitrary environment variables in the .qmlproject. This is required for example qtquickcontrols2.conf and QT_AUTO_SCREEN_SCALE_FACTOR. Task-number: QTCREATORBUG-19513 Change-Id: I8421a9fc7f85d24b3564f1b60f383be3838f2af4 Reviewed-by: Alessandro Portale --- .../qml-type-descriptions/qmlproject.qmltypes | 3 +++ .../fileformat/qmlprojectfileformat.cpp | 7 +++++++ .../qmlprojectmanager/fileformat/qmlprojectitem.cpp | 10 ++++++++++ .../qmlprojectmanager/fileformat/qmlprojectitem.h | 6 ++++++ src/plugins/qmlprojectmanager/qmlproject.cpp | 7 +++++++ src/plugins/qmlprojectmanager/qmlproject.h | 4 ++++ .../qmlprojectmanager/qmlprojectenvironmentaspect.cpp | 6 ++++++ 7 files changed, 43 insertions(+) diff --git a/share/qtcreator/qml-type-descriptions/qmlproject.qmltypes b/share/qtcreator/qml-type-descriptions/qmlproject.qmltypes index 70003d049f9..4f914d45989 100644 --- a/share/qtcreator/qml-type-descriptions/qmlproject.qmltypes +++ b/share/qtcreator/qml-type-descriptions/qmlproject.qmltypes @@ -70,4 +70,7 @@ Module { ] Property { name: "filter"; type: "string" } } + Component { + name: "Environment" + } } diff --git a/src/plugins/qmlprojectmanager/fileformat/qmlprojectfileformat.cpp b/src/plugins/qmlprojectmanager/fileformat/qmlprojectfileformat.cpp index 6154ecd3d72..01054df1271 100644 --- a/src/plugins/qmlprojectmanager/fileformat/qmlprojectfileformat.cpp +++ b/src/plugins/qmlprojectmanager/fileformat/qmlprojectfileformat.cpp @@ -127,6 +127,13 @@ QmlProjectItem *QmlProjectFileFormat::parseProjectFile(const Utils::FileName &fi OtherFileFilterItem *otherFileFilterItem = new OtherFileFilterItem(projectItem); setupFileFilterItem(otherFileFilterItem, childNode); projectItem->appendContent(otherFileFilterItem); + } else if (childNode->name() == "Environment") { + const auto properties = childNode->properties(); + auto i = properties.constBegin(); + while (i != properties.constEnd()) { + projectItem->addToEnviroment(i.key(), i.value().toString()); + ++i; + } } else { qWarning() << "Unknown type:" << childNode->name(); } diff --git a/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp b/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp index 8e9e99475fc..b462bf48b86 100644 --- a/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp +++ b/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp @@ -106,4 +106,14 @@ bool QmlProjectItem::matchesFile(const QString &filePath) const return false; } +QList QmlProjectItem::environment() const +{ + return m_environment; +} + +void QmlProjectItem::addToEnviroment(const QString &key, const QString &value) +{ + m_environment.append(Utils::EnvironmentItem(key, value)); +} + } // namespace QmlProjectManager diff --git a/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.h b/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.h index 757e5714687..e3c65e7ef13 100644 --- a/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.h +++ b/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.h @@ -25,6 +25,8 @@ #pragma once +#include + #include #include #include @@ -60,6 +62,9 @@ public: void appendContent(QmlProjectContentItem *item) { m_content.append(item); } + QList environment() const; + void addToEnviroment(const QString &key, const QString &value); + signals: void qmlFilesChanged(const QSet &, const QSet &); @@ -69,6 +74,7 @@ protected: QStringList m_importPaths; QStringList m_absoluteImportPaths; QString m_mainFile; + QList m_environment; QList m_content; // content property }; diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp index 2f9ab498daa..471ef4a13b5 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.cpp +++ b/src/plugins/qmlprojectmanager/qmlproject.cpp @@ -213,6 +213,13 @@ Utils::FileName QmlProject::targetFile(const Utils::FileName &sourceFile, return Utils::FileName::fromString(QDir::cleanPath(targetDir.absoluteFilePath(relative))); } +QList QmlProject::environment() const +{ + if (m_projectItem) + return m_projectItem.data()->environment(); + return {}; +} + bool QmlProject::validProjectFile() const { return !m_projectItem.isNull(); diff --git a/src/plugins/qmlprojectmanager/qmlproject.h b/src/plugins/qmlprojectmanager/qmlproject.h index c1b667d21a1..4ecd7b226e6 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.h +++ b/src/plugins/qmlprojectmanager/qmlproject.h @@ -30,6 +30,8 @@ #include +#include + #include namespace ProjectExplorer { class RunConfiguration; } @@ -65,6 +67,8 @@ public: Utils::FileName targetDirectory(const ProjectExplorer::Target *target) const; Utils::FileName targetFile(const Utils::FileName &sourceFile, const ProjectExplorer::Target *target) const; + + QList environment() const; QStringList customImportPaths() const; bool addFiles(const QStringList &filePaths); diff --git a/src/plugins/qmlprojectmanager/qmlprojectenvironmentaspect.cpp b/src/plugins/qmlprojectmanager/qmlprojectenvironmentaspect.cpp index 626c8895518..5cc6fe9988c 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectenvironmentaspect.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectenvironmentaspect.cpp @@ -25,6 +25,8 @@ #include "qmlprojectenvironmentaspect.h" +#include "qmlproject.h" + #include #include #include @@ -57,6 +59,10 @@ Utils::Environment QmlProjectEnvironmentAspect::baseEnvironment() const if (base == static_cast(KitEnvironmentBase)) runConfiguration()->target()->kit()->addToEnvironment(env); + QmlProject *project = qobject_cast(runConfiguration()->target()->project()); + if (project) + env.modify(project->environment()); + return env; }