From 6deab2a10313ea7a7cf5ebb1be56384f5bc71368 Mon Sep 17 00:00:00 2001 From: Jake Petroules Date: Mon, 6 Feb 2017 19:42:07 -0800 Subject: Set product run environment in generated Visual Studio projects Task-number: QBS-1100 Change-Id: Ic2edf882dacd17e4833074e52715dc42bb74cdac Reviewed-by: Denis Shienkov Reviewed-by: Christian Kandeler --- .../visualstudio/msbuildqbsproductproject.cpp | 53 ++++++++++++++++++++++ 1 file changed, 53 insertions(+) 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 #include #include #include @@ -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), -- cgit v1.2.3