aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib/generators
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2017-06-09 13:50:15 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2017-06-09 13:51:34 +0200
commit7343f24c774af89e7ddf9cf24c3932c703b5937c (patch)
tree5d29be927aa90fbb25d95007a475a6110d5e855a /src/lib/corelib/generators
parent525165a38302cf43a908a93f57a3a88cd6abc0e0 (diff)
parent7ccc08f33153cd3093081567ac653e371759d69a (diff)
Merge 1.8 into master
Diffstat (limited to 'src/lib/corelib/generators')
-rw-r--r--src/lib/corelib/generators/generatordata.cpp39
-rw-r--r--src/lib/corelib/generators/generatordata.h13
-rw-r--r--src/lib/corelib/generators/visualstudio/msbuildqbsproductproject.cpp16
-rw-r--r--src/lib/corelib/generators/visualstudio/msbuildqbsproductproject.h3
-rw-r--r--src/lib/corelib/generators/visualstudio/visualstudiogenerator.cpp12
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,