diff options
author | Christian Kandeler <christian.kandeler@digia.com> | 2013-06-06 10:06:30 +0200 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-06-17 14:23:19 +0200 |
commit | ab60f6e4c489ace089785c002d75018ac6a31e30 (patch) | |
tree | 91053ec752d9aa56df8061ba5e62c13431804a6b /src/lib/api/project.cpp | |
parent | d3877c67d060d454ac66fde7b6ad41a2bb50d808 (diff) |
Allow projects to be nested.
This is nice to have for grouping products and
a requirement for aggregating existing projects
into a bigger one.
Change-Id: I3394642e95ea57dbc6bf1603cfed6902a5906e4c
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
Diffstat (limited to 'src/lib/api/project.cpp')
-rw-r--r-- | src/lib/api/project.cpp | 63 |
1 files changed, 46 insertions, 17 deletions
diff --git a/src/lib/api/project.cpp b/src/lib/api/project.cpp index f9744d648..dca2104d8 100644 --- a/src/lib/api/project.cpp +++ b/src/lib/api/project.cpp @@ -91,7 +91,7 @@ static void loadPlugins(const QStringList &_pluginPaths, const Logger &logger) class ProjectPrivate : public QSharedData { public: - ProjectPrivate(const ResolvedProjectPtr &internalProject, const Logger &logger) + ProjectPrivate(const TopLevelProjectPtr &internalProject, const Logger &logger) : internalProject(internalProject), logger(logger), m_projectDataRetrieved(false) { } @@ -109,11 +109,12 @@ public: QList<ResolvedProductPtr> allEnabledInternalProducts() const; ResolvedProductPtr internalProduct(const ProductData &product) const; - const ResolvedProjectPtr internalProject; + const TopLevelProjectPtr internalProject; Logger logger; private: - void retrieveProjectData(); + void retrieveProjectData(ProjectData &projectData, + const ResolvedProjectConstPtr &internalProject); ProjectData m_projectData; bool m_projectDataRetrieved; @@ -121,8 +122,11 @@ private: ProjectData ProjectPrivate::projectData() { - if (!m_projectDataRetrieved) - retrieveProjectData(); + if (!m_projectDataRetrieved) { + retrieveProjectData(m_projectData, internalProject); + m_projectData.d->buildDir = internalProject->buildDirectory; + m_projectDataRetrieved = true; + } return m_projectData; } @@ -165,7 +169,7 @@ InstallJob *ProjectPrivate::installProducts(const QList<ResolvedProductPtr> &pro if (needsDepencencyResolving) addDependencies(productsToInstall); InstallJob * const job = new InstallJob(logger, jobOwner); - job->install(productsToInstall, options); + job->install(internalProject, productsToInstall, options); return job; } @@ -179,30 +183,49 @@ QList<ResolvedProductPtr> ProjectPrivate::internalProducts(const QList<ProductDa return internalProducts; } -QList<ResolvedProductPtr> ProjectPrivate::allEnabledInternalProducts() const +static QList<ResolvedProductPtr> enabledInternalProducts(const ResolvedProjectConstPtr &project) { QList<ResolvedProductPtr> products; - foreach (const ResolvedProductPtr &p, internalProject->products) { + foreach (const ResolvedProductPtr &p, project->products) { if (p->enabled) products << p; } + foreach (const ResolvedProjectConstPtr &subProject, project->subProjects) + products << enabledInternalProducts(subProject); return products; } -ResolvedProductPtr ProjectPrivate::internalProduct(const ProductData &product) const +QList<ResolvedProductPtr> ProjectPrivate::allEnabledInternalProducts() const +{ + return enabledInternalProducts(internalProject); +} + +static ResolvedProductPtr internalProductForProject(const ResolvedProjectConstPtr &project, + const ProductData &product) { - foreach (const ResolvedProductPtr &resolvedProduct, internalProject->products) { + foreach (const ResolvedProductPtr &resolvedProduct, project->products) { if (product.name() == resolvedProduct->name) return resolvedProduct; } - qFatal("No build product '%s'", qPrintable(product.name())); + foreach (const ResolvedProjectConstPtr &subProject, project->subProjects) { + const ResolvedProductPtr &p = internalProductForProject(subProject, product); + if (p) + return p; + } return ResolvedProductPtr(); } -void ProjectPrivate::retrieveProjectData() +ResolvedProductPtr ProjectPrivate::internalProduct(const ProductData &product) const +{ + return internalProductForProject(internalProject, product); +} + +void ProjectPrivate::retrieveProjectData(ProjectData &projectData, + const ResolvedProjectConstPtr &internalProject) { - m_projectData.d->location = internalProject->location; - m_projectData.d->buildDir = internalProject->buildDirectory; + projectData.d->name = internalProject->name; + projectData.d->location = internalProject->location; + projectData.d->enabled = internalProject->enabled; foreach (const ResolvedProductConstPtr &resolvedProduct, internalProject->products) { ProductData product; product.d->name = resolvedProduct->name; @@ -227,9 +250,15 @@ void ProjectPrivate::retrieveProjectData() product.d->groups << group; } qSort(product.d->groups); - m_projectData.d->products << product; + projectData.d->products << product; + } + foreach (const ResolvedProjectConstPtr &internalSubProject, internalProject->subProjects) { + ProjectData subProject; + retrieveProjectData(subProject, internalSubProject); + projectData.d->subProjects << subProject; } - qSort(m_projectData.d->products); + qSort(projectData.d->products); + qSort(projectData.d->subProjects); m_projectDataRetrieved = true; } @@ -242,7 +271,7 @@ using namespace Internal; * \brief The \c Project class provides services related to a qbs project. */ -Project::Project(const ResolvedProjectPtr &internalProject, const Logger &logger) +Project::Project(const TopLevelProjectPtr &internalProject, const Logger &logger) : d(new ProjectPrivate(internalProject, logger)) { } |