aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJake Petroules <jake.petroules@qt.io>2017-02-06 19:42:07 -0800
committerJake Petroules <jake.petroules@qt.io>2017-02-08 11:14:17 +0000
commit6deab2a10313ea7a7cf5ebb1be56384f5bc71368 (patch)
tree7cd9625ba5e7c4c3b8c065366633058ebee7c479
parentf9555c3103b5da16b84a315b97826e3f2e2d1a38 (diff)
Set product run environment in generated Visual Studio projects
Task-number: QBS-1100 Change-Id: Ic2edf882dacd17e4833074e52715dc42bb74cdac Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com> Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
-rw-r--r--src/lib/corelib/generators/visualstudio/msbuildqbsproductproject.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/lib/corelib/generators/visualstudio/msbuildqbsproductproject.cpp b/src/lib/corelib/generators/visualstudio/msbuildqbsproductproject.cpp
index d51534159..cac71f501 100644
--- a/src/lib/corelib/generators/visualstudio/msbuildqbsproductproject.cpp
+++ b/src/lib/corelib/generators/visualstudio/msbuildqbsproductproject.cpp
@@ -46,6 +46,7 @@
#include "msbuildutils.h"
#include "visualstudiogenerator.h"
+#include <api/runenvironment.h>
#include <tools/pathutils.h>
#include <tools/shellutils.h>
#include <tools/version.h>
@@ -97,6 +98,14 @@ static QString productTargetPath(const qbs::ProductData &productData)
return productData.properties().value(QStringLiteral("buildDirectory")).toString();
}
+static bool listEnvironmentVariableContainsValue(const QString &environmentVariable,
+ const QString &value)
+{
+ return environmentVariable.contains(QLatin1Char(';') + value + QLatin1Char(';'))
+ || environmentVariable.startsWith(value + QLatin1Char(';'))
+ || environmentVariable.endsWith(QLatin1Char(';') + value);
+}
+
void MSBuildQbsProductProject::addConfiguration(const GeneratableProject &project,
const Project &buildTask,
const ProductData &productData,
@@ -160,6 +169,50 @@ void MSBuildQbsProductProject::addConfiguration(const GeneratableProject &projec
propertyGroup1->appendProperty(QStringLiteral("LocalDebuggerWorkingDirectory"),
QStringLiteral("$(OutDir)"));
+ auto env = buildTask.getRunEnvironment(productData, project.installOptions,
+ QProcessEnvironment(), nullptr).runEnvironment();
+ if (!env.isEmpty()) {
+ const auto systemEnv = QProcessEnvironment::systemEnvironment();
+ for (const auto &key : systemEnv.keys()) {
+ if (!env.contains(key))
+ continue;
+
+ // Don't duplicate keys from the system environment
+ if (env.value(key) == systemEnv.value(key)) {
+ env.remove(key);
+ continue;
+ }
+
+ // Cleverly concatenate list variables to avoid duplicating system environment
+ const QString systemValue = systemEnv.value(key);
+ QString overriddenValue = env.value(key);
+ if (listEnvironmentVariableContainsValue(overriddenValue, systemValue)) {
+ env.insert(key, overriddenValue.replace(systemValue,
+ QLatin1Char('%') + key + QLatin1Char('%')));
+ }
+
+ QString installRoot = project.installOptions.installRoot();
+ if (!installRoot.isEmpty()) {
+ if (listEnvironmentVariableContainsValue(overriddenValue, installRoot)) {
+ env.insert(key, overriddenValue.replace(installRoot,
+ QStringLiteral("$(QbsInstallRoot)")));
+ }
+ } else {
+ installRoot = Internal::PathUtils::toNativeSeparators(
+ QDir(buildTask.projectData().buildDirectory()).absoluteFilePath(
+ project.installOptions.defaultInstallRoot()),
+ Internal::HostOsInfo::HostOsWindows);
+ if (listEnvironmentVariableContainsValue(overriddenValue, installRoot)) {
+ env.insert(key, overriddenValue.replace(installRoot,
+ QStringLiteral("$(SolutionDir)$(Configuration)\\install-root")));
+ }
+ }
+ }
+
+ propertyGroup1->appendProperty(QStringLiteral("LocalDebuggerEnvironment"),
+ env.toStringList().join(QStringLiteral("\n")));
+ }
+
// NMake - General
// Skip configuration name, that's handled in qbs-shared.props
const auto params = Internal::shellQuote(buildConfigurationCommandLine.mid(1),