diff options
author | Jake Petroules <jake.petroules@qt.io> | 2017-02-06 19:42:07 -0800 |
---|---|---|
committer | Jake Petroules <jake.petroules@qt.io> | 2017-02-08 11:14:17 +0000 |
commit | 6deab2a10313ea7a7cf5ebb1be56384f5bc71368 (patch) | |
tree | 7cd9625ba5e7c4c3b8c065366633058ebee7c479 | |
parent | f9555c3103b5da16b84a315b97826e3f2e2d1a38 (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.cpp | 53 |
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), |