From ac6a3fd5c70d7f999a739d229bdea18eb45eb240 Mon Sep 17 00:00:00 2001 From: Tobias Hunger <tobias.hunger@digia.com> Date: Wed, 24 Jul 2013 12:42:24 +0200 Subject: [PATCH] BuildConfigurationFactory: Introduce priorities Introduce priorities for build configuration factories. This way plugins can register specialized build configuration factories, that e.g. can provide additional build steps. A negative priority signifies that a factory is not prepared to handle a request, the default build configuration factory shipped by the build system plugin will report a priority of 0. Add 100 to that for each specialization you add (e.g. a remote linux buildconfiguration factory would report 100, a specialization of that for mer will should report 200, etc.). Change-Id: I141a7a5a79166afdb7657d46eb7e86bd18d3abf6 Reviewed-by: Daniel Teske <daniel.teske@digia.com> Reviewed-by: Michal Klocek <michal.klocek@digia.com> --- .../autotoolsbuildconfiguration.cpp | 13 ++++------ .../autotoolsbuildconfiguration.h | 4 +-- .../cmakebuildconfiguration.cpp | 14 ++++------ .../cmakebuildconfiguration.h | 4 +-- .../genericbuildconfiguration.cpp | 14 ++++------ .../genericbuildconfiguration.h | 4 +-- .../projectexplorer/buildconfiguration.cpp | 26 +++++++++++++------ .../projectexplorer/buildconfiguration.h | 10 +++---- .../qbsbuildconfiguration.cpp | 13 ++++------ .../qbsprojectmanager/qbsbuildconfiguration.h | 4 +-- .../qt4buildconfiguration.cpp | 16 ++++-------- .../qt4projectmanager/qt4buildconfiguration.h | 4 +-- 12 files changed, 58 insertions(+), 68 deletions(-) diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp index b09a1b156f8..11fe8afdcf5 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp +++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp @@ -89,31 +89,28 @@ AutotoolsBuildConfigurationFactory::AutotoolsBuildConfigurationFactory(QObject * { } -bool AutotoolsBuildConfigurationFactory::canCreate(const Target *parent) const +int AutotoolsBuildConfigurationFactory::priority(const Target *parent) const { - return canHandle(parent); + return canHandle(parent) ? 0 : -1; } QList<BuildInfo *> AutotoolsBuildConfigurationFactory::availableBuilds(const Target *parent) const { QList<BuildInfo *> result; - QTC_ASSERT(canCreate(parent), return result); - result << createBuildInfo(parent->kit(), Utils::FileName::fromString(parent->project()->projectDirectory())); return result; } -bool AutotoolsBuildConfigurationFactory::canSetup(const Kit *k, const QString &projectPath) const +int AutotoolsBuildConfigurationFactory::priority(const Kit *k, const QString &projectPath) const { - return k && Core::MimeDatabase::findByFile(QFileInfo(projectPath)) - .matchesType(QLatin1String(Constants::MAKEFILE_MIMETYPE)); + return (k && Core::MimeDatabase::findByFile(QFileInfo(projectPath)) + .matchesType(QLatin1String(Constants::MAKEFILE_MIMETYPE))) ? 0 : -1; } QList<BuildInfo *> AutotoolsBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const { QList<BuildInfo *> result; - QTC_ASSERT(canSetup(k, projectPath), return result); BuildInfo *info = createBuildInfo(k, Utils::FileName::fromString(AutotoolsProject::defaultBuildDirectory(projectPath))); //: The name of the build configuration created by default for a autotools project. diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h index 3375cd3428d..2aedd932460 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h +++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h @@ -69,9 +69,9 @@ class AutotoolsBuildConfigurationFactory : public ProjectExplorer::IBuildConfigu public: explicit AutotoolsBuildConfigurationFactory(QObject *parent = 0); - bool canCreate(const ProjectExplorer::Target *parent) const; + int priority(const ProjectExplorer::Target *parent) const; QList<ProjectExplorer::BuildInfo *> availableBuilds(const ProjectExplorer::Target *parent) const; - bool canSetup(const ProjectExplorer::Kit *k, const QString &projectPath) const; + int priority(const ProjectExplorer::Kit *k, const QString &projectPath) const; QList<ProjectExplorer::BuildInfo *> availableSetups(const ProjectExplorer::Kit *k, const QString &projectPath) const; ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 9d7179dc6c7..9a63ccb8287 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -122,15 +122,14 @@ CMakeBuildConfigurationFactory::~CMakeBuildConfigurationFactory() { } -bool CMakeBuildConfigurationFactory::canCreate(const ProjectExplorer::Target *parent) const +int CMakeBuildConfigurationFactory::priority(const ProjectExplorer::Target *parent) const { - return canHandle(parent); + return canHandle(parent) ? 0 : -1; } QList<ProjectExplorer::BuildInfo *> CMakeBuildConfigurationFactory::availableBuilds(const ProjectExplorer::Target *parent) const { QList<ProjectExplorer::BuildInfo *> result; - QTC_ASSERT(canCreate(parent), return result); CMakeBuildInfo *info = createBuildInfo(parent->kit(), parent->project()->projectDirectory()); @@ -138,18 +137,16 @@ QList<ProjectExplorer::BuildInfo *> CMakeBuildConfigurationFactory::availableBui return result; } -bool CMakeBuildConfigurationFactory::canSetup(const ProjectExplorer::Kit *k, const QString &projectPath) const +int CMakeBuildConfigurationFactory::priority(const ProjectExplorer::Kit *k, const QString &projectPath) const { - return k && Core::MimeDatabase::findByFile(QFileInfo(projectPath)) - .matchesType(QLatin1String(Constants::CMAKEMIMETYPE)); + return (k && Core::MimeDatabase::findByFile(QFileInfo(projectPath)) + .matchesType(QLatin1String(Constants::CMAKEMIMETYPE))) ? 0 : -1; } QList<ProjectExplorer::BuildInfo *> CMakeBuildConfigurationFactory::availableSetups(const ProjectExplorer::Kit *k, const QString &projectPath) const { QList<ProjectExplorer::BuildInfo *> result; - QTC_ASSERT(canSetup(k, projectPath), return result); - CMakeBuildInfo *info = createBuildInfo(k, ProjectExplorer::Project::projectDirectory(projectPath)); //: The name of the build configuration created by default for a cmake project. info->displayName = tr("Default"); @@ -163,7 +160,6 @@ QList<ProjectExplorer::BuildInfo *> CMakeBuildConfigurationFactory::availableSet ProjectExplorer::BuildConfiguration *CMakeBuildConfigurationFactory::create(ProjectExplorer::Target *parent, const ProjectExplorer::BuildInfo *info) const { - QTC_ASSERT(canCreate(parent), return 0); QTC_ASSERT(info->factory() == this, return 0); QTC_ASSERT(info->kitId == parent->kit()->id(), return 0); QTC_ASSERT(!info->displayName.isEmpty(), return 0); diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h index de7ab612d33..41de9c0bee3 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h @@ -85,9 +85,9 @@ public: CMakeBuildConfigurationFactory(QObject *parent = 0); ~CMakeBuildConfigurationFactory(); - bool canCreate(const ProjectExplorer::Target *parent) const; + int priority(const ProjectExplorer::Target *parent) const; QList<ProjectExplorer::BuildInfo *> availableBuilds(const ProjectExplorer::Target *parent) const; - bool canSetup(const ProjectExplorer::Kit *k, const QString &projectPath) const; + int priority(const ProjectExplorer::Kit *k, const QString &projectPath) const; QList<ProjectExplorer::BuildInfo *> availableSetups(const ProjectExplorer::Kit *k, const QString &projectPath) const; ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp index f130f327b42..b43b6505d99 100644 --- a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp +++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp @@ -87,31 +87,28 @@ GenericBuildConfigurationFactory::~GenericBuildConfigurationFactory() { } -bool GenericBuildConfigurationFactory::canCreate(const Target *parent) const +int GenericBuildConfigurationFactory::priority(const Target *parent) const { - return canHandle(parent); + return canHandle(parent) ? 0 : -1; } QList<BuildInfo *> GenericBuildConfigurationFactory::availableBuilds(const Target *parent) const { QList<ProjectExplorer::BuildInfo *> result; - QTC_ASSERT(canCreate(parent), return result); - BuildInfo *info = createBuildInfo(parent->kit(), Utils::FileName::fromString(parent->project()->projectDirectory())); result << info; return result; } -bool GenericBuildConfigurationFactory::canSetup(const Kit *k, const QString &projectPath) const +int GenericBuildConfigurationFactory::priority(const Kit *k, const QString &projectPath) const { - return k && Core::MimeDatabase::findByFile(QFileInfo(projectPath)) - .matchesType(QLatin1String(Constants::GENERICMIMETYPE)); + return (k && Core::MimeDatabase::findByFile(QFileInfo(projectPath)) + .matchesType(QLatin1String(Constants::GENERICMIMETYPE))) ? 0 : -1; } QList<BuildInfo *> GenericBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const { QList<BuildInfo *> result; - QTC_ASSERT(canSetup(k, projectPath), return result); BuildInfo *info = createBuildInfo(k, Utils::FileName::fromString(ProjectExplorer::Project::projectDirectory(projectPath))); //: The name of the build configuration created by default for a generic project. info->displayName = tr("Default"); @@ -121,7 +118,6 @@ QList<BuildInfo *> GenericBuildConfigurationFactory::availableSetups(const Kit * BuildConfiguration *GenericBuildConfigurationFactory::create(Target *parent, const BuildInfo *info) const { - QTC_ASSERT(canCreate(parent), return 0); QTC_ASSERT(info->factory() == this, return 0); QTC_ASSERT(info->kitId == parent->kit()->id(), return 0); QTC_ASSERT(!info->displayName.isEmpty(), return 0); diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.h b/src/plugins/genericprojectmanager/genericbuildconfiguration.h index aca2452d658..d2f1880f48b 100644 --- a/src/plugins/genericprojectmanager/genericbuildconfiguration.h +++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.h @@ -72,9 +72,9 @@ public: explicit GenericBuildConfigurationFactory(QObject *parent = 0); ~GenericBuildConfigurationFactory(); - bool canCreate(const ProjectExplorer::Target *parent) const; + int priority(const ProjectExplorer::Target *parent) const; QList<ProjectExplorer::BuildInfo *> availableBuilds(const ProjectExplorer::Target *parent) const; - bool canSetup(const ProjectExplorer::Kit *k, const QString &projectPath) const; + int priority(const ProjectExplorer::Kit *k, const QString &projectPath) const; QList<ProjectExplorer::BuildInfo *> availableSetups(const ProjectExplorer::Kit *k, const QString &projectPath) const; ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp index 8366ff00f0f..fb1f5a32c62 100644 --- a/src/plugins/projectexplorer/buildconfiguration.cpp +++ b/src/plugins/projectexplorer/buildconfiguration.cpp @@ -346,11 +346,16 @@ IBuildConfigurationFactory *IBuildConfigurationFactory::find(Kit *k, const QStri { QList<IBuildConfigurationFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<IBuildConfigurationFactory>(); - foreach (IBuildConfigurationFactory *factory, factories) { - if (factory->canSetup(k, projectPath)) - return factory; + IBuildConfigurationFactory *factory = 0; + int priority = -1; + foreach (IBuildConfigurationFactory *i, factories) { + int iPriority = i->priority(k, projectPath); + if (iPriority > priority) { + factory = i; + priority = iPriority; + } } - return 0; + return factory; } // create @@ -358,11 +363,16 @@ IBuildConfigurationFactory * IBuildConfigurationFactory::find(Target *parent) { QList<IBuildConfigurationFactory *> factories = ExtensionSystem::PluginManager::getObjects<IBuildConfigurationFactory>(); - foreach (IBuildConfigurationFactory *factory, factories) { - if (factory->canCreate(parent)) - return factory; + IBuildConfigurationFactory *factory = 0; + int priority = -1; + foreach (IBuildConfigurationFactory *i, factories) { + int iPriority = i->priority(parent); + if (iPriority > priority) { + factory = i; + priority = iPriority; + } } - return 0; + return factory; } // clone diff --git a/src/plugins/projectexplorer/buildconfiguration.h b/src/plugins/projectexplorer/buildconfiguration.h index 52bca21090a..452a73f4857 100644 --- a/src/plugins/projectexplorer/buildconfiguration.h +++ b/src/plugins/projectexplorer/buildconfiguration.h @@ -128,15 +128,15 @@ public: explicit IBuildConfigurationFactory(QObject *parent = 0); virtual ~IBuildConfigurationFactory(); - // Used to see whether any BuildInfo is available on this factory for a given target. - virtual bool canCreate(const Target *parent) const = 0; + // The priority is negative if this factory can not create anything for the target. + // It is 0 for the "default" factory that wants to handle the target. + // Add 100 for each specialization. + virtual int priority(const Target *parent) const = 0; // List of build information that can be used to create a new build configuration via // "Add Build Configuration" button. virtual QList<BuildInfo *> availableBuilds(const Target *parent) const = 0; - // Used to see whether this factory can produce any BuildConfigurations for a kit when - // setting up the given project. - virtual bool canSetup(const Kit *k, const QString &projectPath) const = 0; + virtual int priority(const Kit *k, const QString &projectPath) const = 0; // List of build information that can be used to initially set up a new build configuration. virtual QList<BuildInfo *> availableSetups(const Kit *k, const QString &projectPath) const = 0; diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp index fd54f2d3e8c..bbde8ddbee3 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp @@ -254,15 +254,14 @@ ProjectExplorer::BuildInfo *QbsBuildConfigurationFactory::createBuildInfo(const return info; } -bool QbsBuildConfigurationFactory::canCreate(const ProjectExplorer::Target *parent) const +int QbsBuildConfigurationFactory::priority(const ProjectExplorer::Target *parent) const { - return canHandle(parent); + return canHandle(parent) ? 0 : -1; } QList<ProjectExplorer::BuildInfo *> QbsBuildConfigurationFactory::availableBuilds(const ProjectExplorer::Target *parent) const { QList<ProjectExplorer::BuildInfo *> result; - QTC_ASSERT(canCreate(parent), return result); const Utils::FileName buildDirectory = QbsProject::defaultBuildDirectory(parent->project()->projectFilePath()); @@ -273,16 +272,15 @@ QList<ProjectExplorer::BuildInfo *> QbsBuildConfigurationFactory::availableBuild return result; } -bool QbsBuildConfigurationFactory::canSetup(const ProjectExplorer::Kit *k, const QString &projectPath) const +int QbsBuildConfigurationFactory::priority(const ProjectExplorer::Kit *k, const QString &projectPath) const { - return k && Core::MimeDatabase::findByFile(QFileInfo(projectPath)) - .matchesType(QLatin1String(Constants::MIME_TYPE)); + return (k && Core::ICore::findByFile(QFileInfo(projectPath)) + .matchesType(QLatin1String(Constants::MIME_TYPE))) ? 0 : -1; } QList<ProjectExplorer::BuildInfo *> QbsBuildConfigurationFactory::availableSetups(const ProjectExplorer::Kit *k, const QString &projectPath) const { QList<ProjectExplorer::BuildInfo *> result; - QTC_ASSERT(canSetup(k, projectPath), return result); const Utils::FileName buildDirectory = QbsProject::defaultBuildDirectory(projectPath); @@ -302,7 +300,6 @@ QList<ProjectExplorer::BuildInfo *> QbsBuildConfigurationFactory::availableSetup ProjectExplorer::BuildConfiguration *QbsBuildConfigurationFactory::create(ProjectExplorer::Target *parent, const ProjectExplorer::BuildInfo *info) const { - QTC_ASSERT(canCreate(parent), return 0); QTC_ASSERT(info->factory() == this, return 0); QTC_ASSERT(info->kitId == parent->kit()->id(), return 0); QTC_ASSERT(!info->displayName.isEmpty(), return 0); diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h index 61bde2f9c33..14c1efbbe15 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h +++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h @@ -112,9 +112,9 @@ public: explicit QbsBuildConfigurationFactory(QObject *parent = 0); ~QbsBuildConfigurationFactory(); - bool canCreate(const ProjectExplorer::Target *parent) const; + int priority(const ProjectExplorer::Target *parent) const; QList<ProjectExplorer::BuildInfo *> availableBuilds(const ProjectExplorer::Target *parent) const; - bool canSetup(const ProjectExplorer::Kit *k, const QString &projectPath) const; + int priority(const ProjectExplorer::Kit *k, const QString &projectPath) const; QList<ProjectExplorer::BuildInfo *> availableSetups(const ProjectExplorer::Kit *k, const QString &projectPath) const; ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp index 4b683b25176..6e8b302dffb 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp @@ -569,16 +569,14 @@ QmakeBuildInfo *Qt4BuildConfigurationFactory::createBuildInfo(const Kit *k, return info; } -bool Qt4BuildConfigurationFactory::canCreate(const Target *parent) const +int Qt4BuildConfigurationFactory::priority(const Target *parent) const { - return canHandle(parent); + return canHandle(parent) ? 0 : -1; } QList<BuildInfo *> Qt4BuildConfigurationFactory::availableBuilds(const Target *parent) const { QList<ProjectExplorer::BuildInfo *> result; - QTC_ASSERT(canCreate(parent), return result); - QmakeBuildInfo *info = createBuildInfo(parent->kit(), parent->project()->projectFilePath(), BuildConfiguration::Debug); info->displayName.clear(); // ask for a name @@ -588,18 +586,15 @@ QList<BuildInfo *> Qt4BuildConfigurationFactory::availableBuilds(const Target *p return result; } -bool Qt4BuildConfigurationFactory::canSetup(const Kit *k, const QString &projectPath) const +int Qt4BuildConfigurationFactory::priority(const Kit *k, const QString &projectPath) const { - return k && QtSupport::QtKitInformation::qtVersion(k) - && Core::MimeDatabase::findByFile(QFileInfo(projectPath)) - .matchesType(QLatin1String(Constants::PROFILE_MIMETYPE)); + return (k && Core::MimeDatabase::findByFile(QFileInfo(projectPath)) + .matchesType(QLatin1String(Constants::PROFILE_MIMETYPE))) ? 0 : -1; } QList<BuildInfo *> Qt4BuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const { QList<ProjectExplorer::BuildInfo *> result; - QTC_ASSERT(canSetup(k, projectPath), return result); - result << createBuildInfo(k, projectPath, ProjectExplorer::BuildConfiguration::Debug); result << createBuildInfo(k, projectPath, ProjectExplorer::BuildConfiguration::Release); @@ -608,7 +603,6 @@ QList<BuildInfo *> Qt4BuildConfigurationFactory::availableSetups(const Kit *k, c BuildConfiguration *Qt4BuildConfigurationFactory::create(Target *parent, const BuildInfo *info) const { - QTC_ASSERT(canCreate(parent), return 0); QTC_ASSERT(info->factory() == this, return 0); QTC_ASSERT(info->kitId == parent->kit()->id(), return 0); QTC_ASSERT(!info->displayName.isEmpty(), return 0); diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.h b/src/plugins/qt4projectmanager/qt4buildconfiguration.h index a78d47d15d9..17e519b530c 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfiguration.h +++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.h @@ -163,9 +163,9 @@ public: explicit Qt4BuildConfigurationFactory(QObject *parent = 0); ~Qt4BuildConfigurationFactory(); - bool canCreate(const ProjectExplorer::Target *parent) const; + int priority(const ProjectExplorer::Target *parent) const; QList<ProjectExplorer::BuildInfo *> availableBuilds(const ProjectExplorer::Target *parent) const; - bool canSetup(const ProjectExplorer::Kit *k, const QString &projectPath) const; + int priority(const ProjectExplorer::Kit *k, const QString &projectPath) const; QList<ProjectExplorer::BuildInfo *> availableSetups(const ProjectExplorer::Kit *k, const QString &projectPath) const; ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, -- GitLab