From ac6a3fd5c70d7f999a739d229bdea18eb45eb240 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 24 Jul 2013 12:42:24 +0200 Subject: 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 Reviewed-by: Michal Klocek --- .../autotoolsbuildconfiguration.cpp | 13 +++++------ .../autotoolsbuildconfiguration.h | 4 ++-- .../cmakebuildconfiguration.cpp | 14 +++++------- .../cmakeprojectmanager/cmakebuildconfiguration.h | 4 ++-- .../genericbuildconfiguration.cpp | 14 +++++------- .../genericbuildconfiguration.h | 4 ++-- src/plugins/projectexplorer/buildconfiguration.cpp | 26 +++++++++++++++------- src/plugins/projectexplorer/buildconfiguration.h | 10 ++++----- .../qbsprojectmanager/qbsbuildconfiguration.cpp | 13 +++++------ .../qbsprojectmanager/qbsbuildconfiguration.h | 4 ++-- .../qt4projectmanager/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 b09a1b156f..11fe8afdcf 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 AutotoolsBuildConfigurationFactory::availableBuilds(const Target *parent) const { QList 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 AutotoolsBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const { QList 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 3375cd3428..2aedd93246 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 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 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 9d7179dc6c..9a63ccb828 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 CMakeBuildConfigurationFactory::availableBuilds(const ProjectExplorer::Target *parent) const { QList result; - QTC_ASSERT(canCreate(parent), return result); CMakeBuildInfo *info = createBuildInfo(parent->kit(), parent->project()->projectDirectory()); @@ -138,18 +137,16 @@ QList 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 CMakeBuildConfigurationFactory::availableSetups(const ProjectExplorer::Kit *k, const QString &projectPath) const { QList 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 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 de7ab612d3..41de9c0bee 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 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 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 f130f327b4..b43b6505d9 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 GenericBuildConfigurationFactory::availableBuilds(const Target *parent) const { QList 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 GenericBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const { QList 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 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 aca2452d65..d2f1880f48 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 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 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 8366ff00f0..fb1f5a32c6 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 factories = ExtensionSystem::PluginManager::instance()->getObjects(); - 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 factories = ExtensionSystem::PluginManager::getObjects(); - 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 52bca21090..452a73f485 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 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 availableSetups(const Kit *k, const QString &projectPath) const = 0; diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp index fd54f2d3e8..bbde8ddbee 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 QbsBuildConfigurationFactory::availableBuilds(const ProjectExplorer::Target *parent) const { QList result; - QTC_ASSERT(canCreate(parent), return result); const Utils::FileName buildDirectory = QbsProject::defaultBuildDirectory(parent->project()->projectFilePath()); @@ -273,16 +272,15 @@ QList 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 QbsBuildConfigurationFactory::availableSetups(const ProjectExplorer::Kit *k, const QString &projectPath) const { QList result; - QTC_ASSERT(canSetup(k, projectPath), return result); const Utils::FileName buildDirectory = QbsProject::defaultBuildDirectory(projectPath); @@ -302,7 +300,6 @@ QList 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 61bde2f9c3..14c1efbbe1 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 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 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 4b683b2517..6e8b302dff 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 Qt4BuildConfigurationFactory::availableBuilds(const Target *parent) const { QList 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 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 Qt4BuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const { QList 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 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 a78d47d15d..17e519b530 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 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 availableSetups(const ProjectExplorer::Kit *k, const QString &projectPath) const; ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, -- cgit v1.2.1