diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2017-06-09 13:50:15 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2017-06-09 13:51:34 +0200 |
commit | 7343f24c774af89e7ddf9cf24c3932c703b5937c (patch) | |
tree | 5d29be927aa90fbb25d95007a475a6110d5e855a /src/lib/corelib/generators | |
parent | 525165a38302cf43a908a93f57a3a88cd6abc0e0 (diff) | |
parent | 7ccc08f33153cd3093081567ac653e371759d69a (diff) |
Merge 1.8 into master
Change-Id: I2fcb2113a24c8807467aa03aa3e7590d53761706
Diffstat (limited to 'src/lib/corelib/generators')
5 files changed, 78 insertions, 5 deletions
diff --git a/src/lib/corelib/generators/generatordata.cpp b/src/lib/corelib/generators/generatordata.cpp index eb0cb2d09..1ff186580 100644 --- a/src/lib/corelib/generators/generatordata.cpp +++ b/src/lib/corelib/generators/generatordata.cpp @@ -61,6 +61,22 @@ QString GeneratableProductData::name() const return name; } +CodeLocation GeneratableProductData::location() const +{ + CodeLocation location; + QMapIterator<QString, ProductData> it(data); + while (it.hasNext()) { + it.next(); + CodeLocation oldLocation = location; + location = it.value().location(); + if (oldLocation.isValid() && oldLocation != location) + throw ErrorInfo(QLatin1String("Products with different code locations " + "per-configuration are not compatible with this " + "generator.")); + } + return location; +} + QStringList GeneratableProductData::dependencies() const { QStringList list; @@ -92,6 +108,29 @@ QString GeneratableProjectData::name() const return name; } +CodeLocation GeneratableProjectData::location() const +{ + CodeLocation location; + QMapIterator<QString, ProjectData> it(data); + while (it.hasNext()) { + it.next(); + CodeLocation oldLocation = location; + location = it.value().location(); + if (oldLocation.isValid() && oldLocation != location) + throw ErrorInfo(QLatin1String("Projects with different code locations " + "per-configuration are not compatible with this " + "generator.")); + } + return location; +} + +GeneratableProjectData::Id GeneratableProjectData::uniqueName() const +{ + GeneratableProjectData::Id id; + id.value = name() + QLatin1Char('-') + location().toString(); + return id; +} + QDir GeneratableProject::baseBuildDirectory() const { Internal::Set<QString> baseBuildDirectory; diff --git a/src/lib/corelib/generators/generatordata.h b/src/lib/corelib/generators/generatordata.h index 2c64bb370..1d4685433 100644 --- a/src/lib/corelib/generators/generatordata.h +++ b/src/lib/corelib/generators/generatordata.h @@ -55,14 +55,27 @@ typedef QMap<QString, ProductData> GeneratableProductDataMap; struct GeneratableProductData { GeneratableProductDataMap data; QString name() const; + CodeLocation location() const; QStringList dependencies() const; }; struct GeneratableProjectData { + struct Id { + private: + friend struct GeneratableProjectData; + Id() { } + QString value; + + public: + bool operator<(const Id &id) const { return value < id.value; } + }; + GeneratableProjectDataMap data; QList<GeneratableProjectData> subProjects; QList<GeneratableProductData> products; QString name() const; + CodeLocation location() const; + Id uniqueName() const; }; struct GeneratableProject : public GeneratableProjectData { diff --git a/src/lib/corelib/generators/visualstudio/msbuildqbsproductproject.cpp b/src/lib/corelib/generators/visualstudio/msbuildqbsproductproject.cpp index 6aa9857fb..fc9187ae2 100644 --- a/src/lib/corelib/generators/visualstudio/msbuildqbsproductproject.cpp +++ b/src/lib/corelib/generators/visualstudio/msbuildqbsproductproject.cpp @@ -354,6 +354,8 @@ void MSBuildQbsProductProject::addFiles(const GeneratableProject &project, { auto itemGroup = new MSBuildItemGroup(this); + addQbsFile(project, product, itemGroup); + std::map<QString, MSBuildFileItem *> sourceFileNodes; std::map<QString, QStringList> sourceFileEnabledConfigurations; @@ -406,4 +408,18 @@ void MSBuildQbsProductProject::addFiles(const GeneratableProject &project, import->setProject(QStringLiteral("$(VCTargetsPath)\\Microsoft.Cpp.targets")); } +void MSBuildQbsProductProject::addQbsFile(const GeneratableProject &project, + const GeneratableProductData &product, + MSBuildItemGroup *itemGroup) +{ + auto fileItem = new MSBuildNone(itemGroup); + QString path = project.baseBuildDirectory().relativeFilePath(product.location().filePath()); + // The path still might not be relative (for example if the file item is + // located on a different drive) + if (QFileInfo(path).isRelative()) + path = QStringLiteral("$(ProjectDir)") + path; + fileItem->setFilePath(path); +} + + } // namespace qbs diff --git a/src/lib/corelib/generators/visualstudio/msbuildqbsproductproject.h b/src/lib/corelib/generators/visualstudio/msbuildqbsproductproject.h index 131de7eb5..7fb9e2a39 100644 --- a/src/lib/corelib/generators/visualstudio/msbuildqbsproductproject.h +++ b/src/lib/corelib/generators/visualstudio/msbuildqbsproductproject.h @@ -40,6 +40,7 @@ namespace qbs { class MSBuildImportGroup; +class MSBuildItemGroup; class MSBuildProperty; class VisualStudioGenerator; @@ -63,6 +64,8 @@ private: void addItemDefGroup(const Project &project, const ProductData &productData); void addFiles(const GeneratableProject &project, const GeneratableProductData &product); + void addQbsFile(const GeneratableProject &project, const GeneratableProductData &product, + MSBuildItemGroup *itemGroup); }; } // namespace qbs diff --git a/src/lib/corelib/generators/visualstudio/visualstudiogenerator.cpp b/src/lib/corelib/generators/visualstudio/visualstudiogenerator.cpp index 7eaaaf2f0..e2f2c2ddc 100644 --- a/src/lib/corelib/generators/visualstudio/visualstudiogenerator.cpp +++ b/src/lib/corelib/generators/visualstudio/visualstudiogenerator.cpp @@ -79,7 +79,7 @@ public: QString solutionFilePath; QMap<QString, std::shared_ptr<MSBuildProject>> msbuildProjects; QMap<QString, VisualStudioSolutionFileProject *> solutionProjects; - QMap<QString, VisualStudioSolutionFolderProject *> solutionFolders; + QMap<GeneratableProjectData::Id, VisualStudioSolutionFolderProject *> solutionFolders; QList<std::pair<QString, bool>> propertySheetNames; void reset(); @@ -118,9 +118,9 @@ public: // as its parent object (so skip giving it a parent folder) if (!parentProjectData.name().isEmpty()) { nestedProjects->appendProperty( - generator->d->solutionFolders.value(projectData.name())->guid() + generator->d->solutionFolders.value(projectData.uniqueName())->guid() .toString(), - generator->d->solutionFolders.value(parentProjectData.name())->guid() + generator->d->solutionFolders.value(parentProjectData.uniqueName())->guid() .toString()); } } @@ -138,7 +138,8 @@ public: nestedProjects->appendProperty( generator->d->solutionProjects.value(productData.name())->guid().toString(), - generator->d->solutionFolders.value(projectData.name())->guid().toString()); + generator->d->solutionFolders.value(projectData.uniqueName())->guid() + .toString()); } private: @@ -340,7 +341,8 @@ void VisualStudioGenerator::visitProjectData(const GeneratableProject &project, auto solutionFolder = new VisualStudioSolutionFolderProject(d->solution.get()); solutionFolder->setName(projectData.name()); d->solution->appendProject(solutionFolder); - d->solutionFolders.insert(projectData.name(), solutionFolder); + QBS_CHECK(!d->solutionFolders.contains(projectData.uniqueName())); + d->solutionFolders.insert(projectData.uniqueName(), solutionFolder); } void VisualStudioGenerator::visitProduct(const GeneratableProject &project, |