diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2017-02-10 09:51:52 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2017-02-10 10:00:08 +0100 |
commit | 4481ddd23cc1b83bf7a1fd45cd2d5d47360a3527 (patch) | |
tree | aa16cad1e02438c02f42b489ce8e14bd7f618432 /src/lib/corelib/generators | |
parent | 1355ac20ed6bda381bb9e03df568b0a6b7976e06 (diff) | |
parent | 6deab2a10313ea7a7cf5ebb1be56384f5bc71368 (diff) |
Merge 1.7 into master
Change-Id: I4ca26628cb30ca75ceab0ca38d8bb253193b6166
Diffstat (limited to 'src/lib/corelib/generators')
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())); } } |