aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/lib/corelib/generators/generatordata.cpp23
-rw-r--r--src/lib/corelib/generators/generatordata.h12
-rw-r--r--src/lib/corelib/generators/visualstudio/visualstudiogenerator.cpp12
3 files changed, 42 insertions, 5 deletions
diff --git a/src/lib/corelib/generators/generatordata.cpp b/src/lib/corelib/generators/generatordata.cpp
index eb0cb2d09..e8d554d20 100644
--- a/src/lib/corelib/generators/generatordata.cpp
+++ b/src/lib/corelib/generators/generatordata.cpp
@@ -92,6 +92,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..d57f2f510 100644
--- a/src/lib/corelib/generators/generatordata.h
+++ b/src/lib/corelib/generators/generatordata.h
@@ -59,10 +59,22 @@ struct GeneratableProductData {
};
struct GeneratableProjectData {
+ struct Id {
+ private:
+ friend class 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/visualstudiogenerator.cpp b/src/lib/corelib/generators/visualstudio/visualstudiogenerator.cpp
index ea621b271..179232114 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, QSharedPointer<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.data());
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,