aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib/generators
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2017-02-10 09:51:52 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2017-02-10 10:00:08 +0100
commit4481ddd23cc1b83bf7a1fd45cd2d5d47360a3527 (patch)
treeaa16cad1e02438c02f42b489ce8e14bd7f618432 /src/lib/corelib/generators
parent1355ac20ed6bda381bb9e03df568b0a6b7976e06 (diff)
parent6deab2a10313ea7a7cf5ebb1be56384f5bc71368 (diff)
Merge 1.7 into master
Diffstat (limited to 'src/lib/corelib/generators')
-rw-r--r--src/lib/corelib/generators/generator.cpp12
-rw-r--r--src/lib/corelib/generators/generator.h4
-rw-r--r--src/lib/corelib/generators/generatordata.h3
-rw-r--r--src/lib/corelib/generators/visualstudio/msbuildqbsproductproject.cpp53
-rw-r--r--src/lib/corelib/generators/visualstudio/msbuildsharedsolutionpropertiesproject.cpp39
-rw-r--r--src/lib/corelib/generators/visualstudio/msbuildsharedsolutionpropertiesproject.h2
-rw-r--r--src/lib/corelib/generators/visualstudio/msbuildsolutionpropertiesproject.cpp9
-rw-r--r--src/lib/corelib/generators/visualstudio/msbuildsolutionpropertiesproject.h3
-rw-r--r--src/lib/corelib/generators/visualstudio/visualstudiogenerator.cpp6
9 files changed, 110 insertions, 21 deletions
diff --git a/src/lib/corelib/generators/generator.cpp b/src/lib/corelib/generators/generator.cpp
index 6459eb1c7..b58ae1ea2 100644
--- a/src/lib/corelib/generators/generator.cpp
+++ b/src/lib/corelib/generators/generator.cpp
@@ -51,6 +51,7 @@ public:
QList<Project> projects;
QList<QVariantMap> buildConfigurations;
InstallOptions installOptions;
+ QString qbsSettingsDir;
};
ProjectGenerator::ProjectGenerator()
@@ -77,7 +78,8 @@ static QString _configurationName(const QVariantMap &buildConfiguration)
void ProjectGenerator::generate(const QList<Project> &projects,
const QList<QVariantMap> &buildConfigurations,
- const InstallOptions &installOptions)
+ const InstallOptions &installOptions,
+ const QString &qbsSettingsDir)
{
d->projects = projects;
std::sort(d->projects.begin(), d->projects.end(),
@@ -88,6 +90,7 @@ void ProjectGenerator::generate(const QList<Project> &projects,
[](const QVariantMap &a, const QVariantMap &b) {
return _configurationName(a) < _configurationName(b); });
d->installOptions = installOptions;
+ d->qbsSettingsDir = qbsSettingsDir;
generate();
}
@@ -211,7 +214,7 @@ const GeneratableProject ProjectGenerator::project() const
proj.data = p.data;
proj.products = p.products;
proj.subProjects = p.subProjects;
- proj.installRoot = d->installOptions.installRoot();
+ proj.installOptions = d->installOptions;
return proj;
}
@@ -225,4 +228,9 @@ QFileInfo ProjectGenerator::qbsExecutableFilePath() const
return file;
}
+QString ProjectGenerator::qbsSettingsDir() const
+{
+ return d->qbsSettingsDir;
+}
+
} // namespace qbs
diff --git a/src/lib/corelib/generators/generator.h b/src/lib/corelib/generators/generator.h
index 5e62f27aa..9155f2c09 100644
--- a/src/lib/corelib/generators/generator.h
+++ b/src/lib/corelib/generators/generator.h
@@ -70,10 +70,12 @@ public:
void generate(const QList<Project> &projects,
const QList<QVariantMap> &buildConfigurations,
- const InstallOptions &installOptions);
+ const InstallOptions &installOptions,
+ const QString &qbsSettingsDir);
const GeneratableProject project() const;
QFileInfo qbsExecutableFilePath() const;
+ QString qbsSettingsDir() const;
private:
QList<Project> projects() const;
diff --git a/src/lib/corelib/generators/generatordata.h b/src/lib/corelib/generators/generatordata.h
index 1a1371cb3..2c64bb370 100644
--- a/src/lib/corelib/generators/generatordata.h
+++ b/src/lib/corelib/generators/generatordata.h
@@ -44,6 +44,7 @@
#include <QtCore/qmap.h>
#include <api/project.h>
#include <api/projectdata.h>
+#include <tools/installoptions.h>
namespace qbs {
@@ -68,7 +69,7 @@ struct GeneratableProject : public GeneratableProjectData {
GeneratableProjectMap projects;
QMap<QString, QVariantMap> buildConfigurations;
QMap<QString, QStringList> commandLines;
- QString installRoot;
+ InstallOptions installOptions;
QDir baseBuildDirectory() const;
QFileInfo filePath() const;
bool hasMultipleConfigurations() const;
diff --git a/src/lib/corelib/generators/visualstudio/msbuildqbsproductproject.cpp b/src/lib/corelib/generators/visualstudio/msbuildqbsproductproject.cpp
index f65dd8994..45aafbac7 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),
diff --git a/src/lib/corelib/generators/visualstudio/msbuildsharedsolutionpropertiesproject.cpp b/src/lib/corelib/generators/visualstudio/msbuildsharedsolutionpropertiesproject.cpp
index bf7c4fcbf..d8389817f 100644
--- a/src/lib/corelib/generators/visualstudio/msbuildsharedsolutionpropertiesproject.cpp
+++ b/src/lib/corelib/generators/visualstudio/msbuildsharedsolutionpropertiesproject.cpp
@@ -39,9 +39,10 @@
namespace qbs {
-QString qbsCommandLine(const GeneratableProject &project,
- const QString &subCommand,
- const Internal::VisualStudioVersionInfo &versionInfo)
+static QString qbsCommandLine(const GeneratableProject &project,
+ const QString &subCommand,
+ const QString &qbsSettingsDir,
+ const Internal::VisualStudioVersionInfo &versionInfo)
{
auto addEnvironmentVariableArgument = [&](Internal::CommandLine &cl, const QString &var) {
cl.appendRawArgument(QStringLiteral("\"$(%1)\"").arg(var));
@@ -51,11 +52,19 @@ QString qbsCommandLine(const GeneratableProject &project,
if (subCommand == QStringLiteral("rebuild"))
realSubCommand = QStringLiteral("build");
- // "path/to/qbs.exe" {build|clean} -f "path/to/project.qbs" -d "/build/directory/"
+ // "path/to/qbs.exe" {build|clean}
+ // --settings-dir "path/to/settings/directory/"
+ // -f "path/to/project.qbs" -d "/build/directory/"
// -p product_name [[configuration key:value]...]
Internal::CommandLine commandLine;
commandLine.setProgram(QStringLiteral("\"$(QbsExecutablePath)\""), true);
commandLine.appendArgument(realSubCommand);
+
+ if (!qbsSettingsDir.isEmpty()) {
+ commandLine.appendArgument(QStringLiteral("--settings-dir"));
+ addEnvironmentVariableArgument(commandLine, QStringLiteral("QbsSettingsDir"));
+ }
+
commandLine.appendArgument(QStringLiteral("-f"));
addEnvironmentVariableArgument(commandLine, QStringLiteral("QbsProjectFile"));
commandLine.appendArgument(QStringLiteral("-d"));
@@ -72,7 +81,8 @@ QString qbsCommandLine(const GeneratableProject &project,
commandLine.appendArgument(QStringLiteral("--wait-lock"));
}
- if (realSubCommand == QStringLiteral("build") && !project.installRoot.isEmpty()) {
+ if (realSubCommand == QStringLiteral("build")
+ && !project.installOptions.installRoot().isEmpty()) {
commandLine.appendArgument(QStringLiteral("--install-root"));
addEnvironmentVariableArgument(commandLine, QStringLiteral("QbsInstallRoot"));
}
@@ -90,7 +100,8 @@ QString qbsCommandLine(const GeneratableProject &project,
MSBuildSharedSolutionPropertiesProject::MSBuildSharedSolutionPropertiesProject(
const Internal::VisualStudioVersionInfo &versionInfo,
const GeneratableProject &project,
- const QFileInfo &qbsExecutable)
+ const QFileInfo &qbsExecutable,
+ const QString &qbsSettingsDir)
{
setDefaultTargets(QStringLiteral("Build"));
setToolsVersion(versionInfo.toolsVersion());
@@ -101,10 +112,10 @@ MSBuildSharedSolutionPropertiesProject::MSBuildSharedSolutionPropertiesProject(
// Order's important here... a variable must be listed before one that uses it
group->appendProperty(QStringLiteral("QbsExecutablePath"),
QStringLiteral("$(QbsExecutableDir)") + qbsExecutable.fileName());
- if (!project.installRoot.isEmpty()) {
+ if (!project.installOptions.installRoot().isEmpty()) {
group->appendProperty(QStringLiteral("QbsInstallRoot"),
Internal::PathUtils::toNativeSeparators(
- project.installRoot,
+ project.installOptions.installRoot(),
Internal::HostOsInfo::HostOsWindows));
}
@@ -122,13 +133,17 @@ MSBuildSharedSolutionPropertiesProject::MSBuildSharedSolutionPropertiesProject(
QStringLiteral("$(SolutionDir)."));
group->appendProperty(QStringLiteral("QbsBuildCommandLine"),
- qbsCommandLine(project, QStringLiteral("build"), versionInfo));
+ qbsCommandLine(project, QStringLiteral("build"),
+ qbsSettingsDir, versionInfo));
group->appendProperty(QStringLiteral("QbsReBuildCommandLine"),
- qbsCommandLine(project, QStringLiteral("rebuild"), versionInfo));
+ qbsCommandLine(project, QStringLiteral("rebuild"),
+ qbsSettingsDir, versionInfo));
group->appendProperty(QStringLiteral("QbsCleanCommandLine"),
- qbsCommandLine(project, QStringLiteral("clean"), versionInfo));
+ qbsCommandLine(project, QStringLiteral("clean"),
+ qbsSettingsDir, versionInfo));
group->appendProperty(QStringLiteral("QbsGenerateCommandLine"),
- qbsCommandLine(project, QStringLiteral("generate"), versionInfo));
+ qbsCommandLine(project, QStringLiteral("generate"),
+ qbsSettingsDir, versionInfo));
}
} // namespace qbs
diff --git a/src/lib/corelib/generators/visualstudio/msbuildsharedsolutionpropertiesproject.h b/src/lib/corelib/generators/visualstudio/msbuildsharedsolutionpropertiesproject.h
index 5b8b62750..f3848ce24 100644
--- a/src/lib/corelib/generators/visualstudio/msbuildsharedsolutionpropertiesproject.h
+++ b/src/lib/corelib/generators/visualstudio/msbuildsharedsolutionpropertiesproject.h
@@ -45,7 +45,7 @@ class MSBuildSharedSolutionPropertiesProject : public MSBuildProject
public:
MSBuildSharedSolutionPropertiesProject(const Internal::VisualStudioVersionInfo &versionInfo,
const GeneratableProject &project,
- const QFileInfo &qbsExecutable);
+ const QFileInfo &qbsExecutable, const QString &qbsSettingsDir);
};
} // namespace qbs
diff --git a/src/lib/corelib/generators/visualstudio/msbuildsolutionpropertiesproject.cpp b/src/lib/corelib/generators/visualstudio/msbuildsolutionpropertiesproject.cpp
index 49d463ef0..b0572e2e0 100644
--- a/src/lib/corelib/generators/visualstudio/msbuildsolutionpropertiesproject.cpp
+++ b/src/lib/corelib/generators/visualstudio/msbuildsolutionpropertiesproject.cpp
@@ -41,7 +41,8 @@ namespace qbs {
MSBuildSolutionPropertiesProject::MSBuildSolutionPropertiesProject(
const Internal::VisualStudioVersionInfo &versionInfo,
const GeneratableProject &project,
- const QFileInfo &qbsExecutable)
+ const QFileInfo &qbsExecutable,
+ const QString &qbsSettingsDir)
{
setDefaultTargets(QStringLiteral("Build"));
setToolsVersion(versionInfo.toolsVersion());
@@ -57,6 +58,12 @@ MSBuildSolutionPropertiesProject::MSBuildSolutionPropertiesProject(
group->appendProperty(QStringLiteral("QbsProjectDir"),
Internal::PathUtils::toNativeSeparators(project.filePath().path(), win)
+ Internal::HostOsInfo::pathSeparator(win));
+
+ if (!qbsSettingsDir.isEmpty()) {
+ group->appendProperty(QStringLiteral("QbsSettingsDir"),
+ Internal::PathUtils::toNativeSeparators(qbsSettingsDir, win)
+ + Internal::HostOsInfo::pathSeparator(win) + QLatin1Char('.'));
+ }
}
} // namespace qbs
diff --git a/src/lib/corelib/generators/visualstudio/msbuildsolutionpropertiesproject.h b/src/lib/corelib/generators/visualstudio/msbuildsolutionpropertiesproject.h
index fcbe9f114..1c49f7901 100644
--- a/src/lib/corelib/generators/visualstudio/msbuildsolutionpropertiesproject.h
+++ b/src/lib/corelib/generators/visualstudio/msbuildsolutionpropertiesproject.h
@@ -47,7 +47,8 @@ class MSBuildSolutionPropertiesProject : public MSBuildProject
public:
MSBuildSolutionPropertiesProject(const Internal::VisualStudioVersionInfo &versionInfo,
const GeneratableProject &project,
- const QFileInfo &qbsExecutable);
+ const QFileInfo &qbsExecutable,
+ const QString &qbsSettingsDir);
};
} // namespace qbs
diff --git a/src/lib/corelib/generators/visualstudio/visualstudiogenerator.cpp b/src/lib/corelib/generators/visualstudio/visualstudiogenerator.cpp
index eb49c9c5b..3c1902c63 100644
--- a/src/lib/corelib/generators/visualstudio/visualstudiogenerator.cpp
+++ b/src/lib/corelib/generators/visualstudio/visualstudiogenerator.cpp
@@ -172,7 +172,8 @@ void VisualStudioGenerator::addPropertySheets(const GeneratableProject &project)
d->propertySheetNames.append({ fileName, true });
d->msbuildProjects.insert(project.baseBuildDirectory().absoluteFilePath(fileName),
QSharedPointer<MSBuildSolutionPropertiesProject>::create(
- d->versionInfo, project, qbsExecutableFilePath()));
+ d->versionInfo, project,
+ qbsExecutableFilePath(), qbsSettingsDir()));
}
{
@@ -180,7 +181,8 @@ void VisualStudioGenerator::addPropertySheets(const GeneratableProject &project)
d->propertySheetNames.append({ fileName, false });
d->msbuildProjects.insert(project.baseBuildDirectory().absoluteFilePath(fileName),
QSharedPointer<MSBuildSharedSolutionPropertiesProject>::create(
- d->versionInfo, project, qbsExecutableFilePath()));
+ d->versionInfo, project,
+ qbsExecutableFilePath(), qbsSettingsDir()));
}
}