From d2adc303353f8b67c476794175f004566e4eedf6 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Mon, 22 Jul 2013 15:53:57 +0200 Subject: [PATCH] BuildConfigurationFactory: Refactor code Refactor the code of the build configuration factories. The idea is to generalize the code so much that we can allow plugins to install custom build configuration factories for the platforms they support. To support this use case the following changes where done here: * BuildInfo class was introduced to describe one build configuration that can be created by a factory. * Factories report a list of BuildInfo to describe what they can produce. This fixes the need for factories to implicitly create one buildconfiguration and then create another one 'officially' to support debug and release build configurations to be set up for projects. * Do no longer work around factories to create build configurations. Change-Id: Ic372e4a9b5c582633b467d130538948472b89d91 Reviewed-by: Daniel Teske --- .../autotoolsbuildconfiguration.cpp | 84 +++++++------- .../autotoolsbuildconfiguration.h | 13 ++- .../autotoolsproject.h | 2 + .../cmakebuildconfiguration.cpp | 95 +++++++-------- .../cmakebuildconfiguration.h | 11 +- .../cmakeprojectmanager/cmakebuildinfo.h | 65 +++++++++++ .../cmakeopenprojectwizard.cpp | 17 +-- .../cmakeopenprojectwizard.h | 24 +--- .../cmakeprojectmanager/cmakeproject.cpp | 15 +-- .../cmakeprojectmanager.cpp | 5 +- .../cmakeprojectmanager.pro | 3 +- .../cmakeprojectmanager.qbs | 1 + .../genericbuildconfiguration.cpp | 78 ++++++------- .../genericbuildconfiguration.h | 14 ++- .../projectexplorer/buildconfiguration.cpp | 2 +- .../projectexplorer/buildconfiguration.h | 14 ++- src/plugins/projectexplorer/buildinfo.h | 74 ++++++++++++ .../buildsettingspropertiespage.cpp | 34 ++++-- .../buildsettingspropertiespage.h | 2 + src/plugins/projectexplorer/project.cpp | 31 +++++ src/plugins/projectexplorer/project.h | 3 + .../projectexplorer/projectexplorer.pro | 1 + .../projectexplorer/projectexplorer.qbs | 1 + src/plugins/projectexplorer/target.cpp | 11 +- .../qbsbuildconfiguration.cpp | 80 ++++++------- .../qbsprojectmanager/qbsbuildconfiguration.h | 11 +- src/plugins/qbsprojectmanager/qbsbuildinfo.h | 52 +++++++++ src/plugins/qbsprojectmanager/qbsproject.cpp | 7 +- src/plugins/qbsprojectmanager/qbsproject.h | 1 + .../qbsprojectmanager/qbsprojectmanager.pro | 1 + .../qbsprojectmanager/qbsprojectmanager.qbs | 1 + .../qt4projectmanager/qmakebuildinfo.h | 52 +++++++++ .../qt4buildconfiguration.cpp | 108 ++++++++++-------- .../qt4projectmanager/qt4buildconfiguration.h | 11 +- .../qt4projectmanager/qt4projectmanager.pro | 1 + .../qt4projectmanager/qt4projectmanager.qbs | 1 + 36 files changed, 620 insertions(+), 306 deletions(-) create mode 100644 src/plugins/cmakeprojectmanager/cmakebuildinfo.h create mode 100644 src/plugins/projectexplorer/buildinfo.h create mode 100644 src/plugins/qbsprojectmanager/qbsbuildinfo.h create mode 100644 src/plugins/qt4projectmanager/qmakebuildinfo.h diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp index 26bdc479b60..c0ba3d7ac31 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp +++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp @@ -38,6 +38,9 @@ #include "autoreconfstep.h" #include "configurestep.h" +#include +#include +#include #include #include #include @@ -46,6 +49,7 @@ #include #include +#include #include using namespace AutotoolsProjectManager; @@ -85,59 +89,38 @@ AutotoolsBuildConfigurationFactory::AutotoolsBuildConfigurationFactory(QObject * { } -QList AutotoolsBuildConfigurationFactory::availableCreationIds(const Target *parent) const +bool AutotoolsBuildConfigurationFactory::canCreate(const Target *parent) const { - if (!canHandle(parent)) - return QList(); - return QList() << Core::Id(AUTOTOOLS_BC_ID); + return canHandle(parent); } -QString AutotoolsBuildConfigurationFactory::displayNameForId(const Core::Id id) const +QList AutotoolsBuildConfigurationFactory::availableBuilds(const Target *parent) const { - if (id == AUTOTOOLS_BC_ID) - return tr("Build"); - return QString(); + QList result; + QTC_ASSERT(canCreate(parent), return result); + + result << createBuildInfo(parent->kit(), + Utils::FileName::fromString(parent->project()->projectDirectory())); + return result; } -bool AutotoolsBuildConfigurationFactory::canCreate(const Target *parent, const Core::Id id) const +BuildConfiguration *AutotoolsBuildConfigurationFactory::create(Target *parent, const BuildInfo *info) const { - if (!canHandle(parent)) - return false; - if (id == AUTOTOOLS_BC_ID) - return true; - return false; -} + QTC_ASSERT(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); -AutotoolsBuildConfiguration *AutotoolsBuildConfigurationFactory::create(Target *parent, const Core::Id id, const QString &name) -{ - if (!canCreate(parent, id)) - return 0; + AutotoolsBuildConfiguration *bc = new AutotoolsBuildConfiguration(parent); + bc->setDisplayName(info->displayName); + bc->setDefaultDisplayName(info->displayName); + bc->setBuildDirectory(info->buildDirectory); - bool ok = true; - QString buildConfigurationName = name; - if (buildConfigurationName.isNull()) - buildConfigurationName = QInputDialog::getText(0, - tr("New Configuration"), - tr("New configuration name:"), - QLineEdit::Normal, - QString(), &ok); - buildConfigurationName = buildConfigurationName.trimmed(); - if (!ok || buildConfigurationName.isEmpty()) - return 0; - - AutotoolsBuildConfiguration *bc = createDefaultConfiguration(parent); - bc->setDisplayName(buildConfigurationName); - return bc; -} - -AutotoolsBuildConfiguration *AutotoolsBuildConfigurationFactory::createDefaultConfiguration(ProjectExplorer::Target *target) -{ - AutotoolsBuildConfiguration *bc = new AutotoolsBuildConfiguration(target); BuildStepList *buildSteps = bc->stepList(Core::Id(BUILDSTEPS_BUILD)); // ### Build Steps Build ### // autogen.sh or autoreconf - QFile autogenFile(target->project()->projectDirectory() + QLatin1String("/autogen.sh")); + QFile autogenFile(parent->project()->projectDirectory() + QLatin1String("/autogen.sh")); if (autogenFile.exists()) { AutogenStep *autogenStep = new AutogenStep(buildSteps); buildSteps->insertStep(0, autogenStep); @@ -168,14 +151,29 @@ AutotoolsBuildConfiguration *AutotoolsBuildConfigurationFactory::createDefaultCo bool AutotoolsBuildConfigurationFactory::canHandle(const Target *t) const { + QTC_ASSERT(t, return false); + if (!t->project()->supportsKit(t->kit())) return false; return t->project()->id() == Constants::AUTOTOOLS_PROJECT_ID; } +BuildInfo *AutotoolsBuildConfigurationFactory::createBuildInfo(const ProjectExplorer::Kit *k, + const Utils::FileName &buildDir) const +{ + BuildInfo *info = new BuildInfo(this); + info->typeName = tr("Build"); + info->buildDirectory = buildDir; + info->kitId = k->id(); + + return info; +} + bool AutotoolsBuildConfigurationFactory::canClone(const Target *parent, BuildConfiguration *source) const { - return canCreate(parent, source->id()); + if (!canHandle(parent)) + return false; + return source->id() == AUTOTOOLS_BC_ID; } AutotoolsBuildConfiguration *AutotoolsBuildConfigurationFactory::clone(Target *parent, BuildConfiguration *source) @@ -189,7 +187,9 @@ AutotoolsBuildConfiguration *AutotoolsBuildConfigurationFactory::clone(Target *p bool AutotoolsBuildConfigurationFactory::canRestore(const Target *parent, const QVariantMap &map) const { - return canCreate(parent, idFromMap(map)); + if (!canHandle(parent)) + return false; + return idFromMap(map) == AUTOTOOLS_BC_ID; } AutotoolsBuildConfiguration *AutotoolsBuildConfigurationFactory::restore(Target *parent, const QVariantMap &map) diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h index 7fb3a04792b..15a535ff681 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h +++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h @@ -34,6 +34,8 @@ #include +namespace Utils { class FileName; } + namespace AutotoolsProjectManager { namespace Internal { @@ -67,20 +69,19 @@ class AutotoolsBuildConfigurationFactory : public ProjectExplorer::IBuildConfigu public: explicit AutotoolsBuildConfigurationFactory(QObject *parent = 0); - QList availableCreationIds(const ProjectExplorer::Target *parent) const; - QString displayNameForId(const Core::Id id) const; + bool canCreate(const ProjectExplorer::Target *parent) const; + QList availableBuilds(const ProjectExplorer::Target *parent) const; + ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, + const ProjectExplorer::BuildInfo *info) const; - bool canCreate(const ProjectExplorer::Target *parent, const Core::Id id) const; - AutotoolsBuildConfiguration *create(ProjectExplorer::Target *parent, const Core::Id id, const QString &name = QString()); bool canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const; AutotoolsBuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source); bool canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const; AutotoolsBuildConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map); - static AutotoolsBuildConfiguration *createDefaultConfiguration(ProjectExplorer::Target *target); - private: bool canHandle(const ProjectExplorer::Target *t) const; + ProjectExplorer::BuildInfo *createBuildInfo(const ProjectExplorer::Kit *k, const Utils::FileName &buildDir) const; }; } // namespace Internal diff --git a/src/plugins/autotoolsprojectmanager/autotoolsproject.h b/src/plugins/autotoolsprojectmanager/autotoolsproject.h index a39de5522bc..f5304358c57 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsproject.h +++ b/src/plugins/autotoolsprojectmanager/autotoolsproject.h @@ -34,6 +34,8 @@ #include +#include + QT_FORWARD_DECLARE_CLASS(QDir) namespace Utils { diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 3af1ccf9015..825d3e4d20a 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -29,15 +29,20 @@ #include "cmakebuildconfiguration.h" +#include "cmakebuildinfo.h" #include "cmakeopenprojectwizard.h" #include "cmakeproject.h" #include "cmakeprojectconstants.h" +#include +#include #include #include #include #include +#include + #include using namespace CMakeProjectManager; @@ -117,64 +122,45 @@ CMakeBuildConfigurationFactory::~CMakeBuildConfigurationFactory() { } -QList CMakeBuildConfigurationFactory::availableCreationIds(const ProjectExplorer::Target *parent) const +bool CMakeBuildConfigurationFactory::canCreate(const ProjectExplorer::Target *parent) const { - if (!canHandle(parent)) - return QList(); - return QList() << Core::Id(Constants::CMAKE_BC_ID); + return canHandle(parent); } -QString CMakeBuildConfigurationFactory::displayNameForId(const Core::Id id) const +QList CMakeBuildConfigurationFactory::availableBuilds(const ProjectExplorer::Target *parent) const { - if (id == Constants::CMAKE_BC_ID) - return tr("Build"); - return QString(); + QList result; + QTC_ASSERT(canCreate(parent), return result); + + CMakeBuildInfo *info = createBuildInfo(parent->kit(), parent->project()->projectDirectory()); + result << info; + return result; } -bool CMakeBuildConfigurationFactory::canCreate(const ProjectExplorer::Target *parent, const Core::Id id) const +ProjectExplorer::BuildConfiguration *CMakeBuildConfigurationFactory::create(ProjectExplorer::Target *parent, + const ProjectExplorer::BuildInfo *info) const { - if (!canHandle(parent)) - return false; - if (id == Constants::CMAKE_BC_ID) - return true; - return false; -} - -CMakeBuildConfiguration *CMakeBuildConfigurationFactory::create(ProjectExplorer::Target *parent, const Core::Id id, const QString &name) -{ - if (!canCreate(parent, id)) - return 0; + 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); + CMakeBuildInfo copy(*static_cast(info)); CMakeProject *project = static_cast(parent->project()); - bool ok = true; - QString buildConfigurationName = name; - if (buildConfigurationName.isNull()) - buildConfigurationName = QInputDialog::getText(0, - tr("New Configuration"), - tr("New configuration name:"), - QLineEdit::Normal, - QString(), &ok); - buildConfigurationName = buildConfigurationName.trimmed(); - if (!ok || buildConfigurationName.isEmpty()) - return 0; + if (copy.buildDirectory.isEmpty()) + copy.buildDirectory + = Utils::FileName::fromString(project->shadowBuildDirectory(project->projectFilePath(), + parent->kit(), + copy.displayName)); - CMakeOpenProjectWizard::BuildInfo info; - info.sourceDirectory = project->projectDirectory(); - info.environment = Utils::Environment::systemEnvironment(); - parent->kit()->addToEnvironment(info.environment); - info.buildDirectory = project->shadowBuildDirectory(project->projectFilePath(), - parent->kit(), - buildConfigurationName); - info.kit = parent->kit(); - info.useNinja = false; // This is ignored anyway - - CMakeOpenProjectWizard copw(project->projectManager(), CMakeOpenProjectWizard::ChangeDirectory, info); + CMakeOpenProjectWizard copw(project->projectManager(), CMakeOpenProjectWizard::ChangeDirectory, ©); if (copw.exec() != QDialog::Accepted) return 0; CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(parent); - bc->setDisplayName(buildConfigurationName); + bc->setDisplayName(copy.displayName); + bc->setDefaultDisplayName(copy.displayName); ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); ProjectExplorer::BuildStepList *cleanSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); @@ -199,7 +185,9 @@ CMakeBuildConfiguration *CMakeBuildConfigurationFactory::create(ProjectExplorer: bool CMakeBuildConfigurationFactory::canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const { - return canCreate(parent, source->id()); + if (!canHandle(parent)) + return false; + return source->id() == Constants::CMAKE_BC_ID; } CMakeBuildConfiguration *CMakeBuildConfigurationFactory::clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) @@ -212,7 +200,9 @@ CMakeBuildConfiguration *CMakeBuildConfigurationFactory::clone(ProjectExplorer:: bool CMakeBuildConfigurationFactory::canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const { - return canCreate(parent, ProjectExplorer::idFromMap(map)); + if (!canHandle(parent)) + return false; + return ProjectExplorer::idFromMap(map) == Constants::CMAKE_BC_ID; } CMakeBuildConfiguration *CMakeBuildConfigurationFactory::restore(ProjectExplorer::Target *parent, const QVariantMap &map) @@ -228,11 +218,26 @@ CMakeBuildConfiguration *CMakeBuildConfigurationFactory::restore(ProjectExplorer bool CMakeBuildConfigurationFactory::canHandle(const ProjectExplorer::Target *t) const { + QTC_ASSERT(t, return false); if (!t->project()->supportsKit(t->kit())) return false; return qobject_cast(t->project()); } +CMakeBuildInfo *CMakeBuildConfigurationFactory::createBuildInfo(const ProjectExplorer::Kit *k, + const QString &sourceDir) const +{ + CMakeBuildInfo *info = new CMakeBuildInfo(this); + info->typeName = tr("Build"); + info->kitId = k->id(); + info->environment = Utils::Environment::systemEnvironment(); + k->addToEnvironment(info->environment); + info->useNinja = false; + info->sourceDirectory = sourceDir; + + return info; +} + ProjectExplorer::BuildConfiguration::BuildType CMakeBuildConfiguration::buildType() const { QString cmakeBuildType; diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h index d4d7286988a..2b02f3063e2 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h @@ -38,6 +38,8 @@ class ToolChain; } namespace CMakeProjectManager { +class CMakeBuildInfo; + namespace Internal { class CMakeProject; @@ -83,11 +85,11 @@ public: CMakeBuildConfigurationFactory(QObject *parent = 0); ~CMakeBuildConfigurationFactory(); - QList availableCreationIds(const ProjectExplorer::Target *parent) const; - QString displayNameForId(const Core::Id id) const; + bool canCreate(const ProjectExplorer::Target *parent) const; + QList availableBuilds(const ProjectExplorer::Target *parent) const; + ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, + const ProjectExplorer::BuildInfo *info) const; - bool canCreate(const ProjectExplorer::Target *parent, const Core::Id id) const; - CMakeBuildConfiguration *create(ProjectExplorer::Target *parent, const Core::Id id, const QString &name = QString()); bool canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const; CMakeBuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source); bool canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const; @@ -95,6 +97,7 @@ public: private: bool canHandle(const ProjectExplorer::Target *t) const; + CMakeBuildInfo *createBuildInfo(const ProjectExplorer::Kit *k, const QString &sourceDir) const; }; } // namespace Internal diff --git a/src/plugins/cmakeprojectmanager/cmakebuildinfo.h b/src/plugins/cmakeprojectmanager/cmakebuildinfo.h new file mode 100644 index 00000000000..b352f95de9b --- /dev/null +++ b/src/plugins/cmakeprojectmanager/cmakebuildinfo.h @@ -0,0 +1,65 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#ifndef CMAKEBUILDINFO_H +#define CMAKEBUILDINFO_H + +#include "cmakebuildconfiguration.h" + +#include +#include +#include +#include + +namespace CMakeProjectManager { + +class CMakeBuildInfo : public ProjectExplorer::BuildInfo +{ +public: + CMakeBuildInfo(const ProjectExplorer::IBuildConfigurationFactory *f) : + ProjectExplorer::BuildInfo(f) { } + + CMakeBuildInfo(const Internal::CMakeBuildConfiguration *bc) : + ProjectExplorer::BuildInfo(ProjectExplorer::IBuildConfigurationFactory::find(bc->target())) + { + displayName = bc->displayName(); + buildDirectory = bc->buildDirectory(); + kitId = bc->target()->kit()->id(); + environment = bc->environment(); + useNinja = bc->useNinja(); + } + + Utils::Environment environment; + QString sourceDirectory; + bool useNinja; +}; + +} // namespace CMakeProjectManager + +#endif // CMAKEBUILDINFO_H diff --git a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp index 790ba14cb4c..477a1802240 100644 --- a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp @@ -30,6 +30,7 @@ #include "cmakeopenprojectwizard.h" #include "cmakeprojectmanager.h" #include "cmakebuildconfiguration.h" +#include "cmakebuildinfo.h" #include #include @@ -240,13 +241,15 @@ CMakeOpenProjectWizard::CMakeOpenProjectWizard(CMakeManager *cmakeManager, const } CMakeOpenProjectWizard::CMakeOpenProjectWizard(CMakeManager *cmakeManager, CMakeOpenProjectWizard::Mode mode, - const BuildInfo &info) + const CMakeBuildInfo *info) : m_cmakeManager(cmakeManager), - m_sourceDirectory(info.sourceDirectory), - m_environment(info.environment), - m_useNinja(info.useNinja), - m_kit(info.kit) + m_sourceDirectory(info->sourceDirectory), + m_environment(info->environment), + m_useNinja(info->useNinja), + m_kit(0) { + m_kit = ProjectExplorer::KitManager::find(info->kitId); + CMakeRunPage::Mode rmode; if (mode == CMakeOpenProjectWizard::NeedToCreate) rmode = CMakeRunPage::Recreate; @@ -258,13 +261,13 @@ CMakeOpenProjectWizard::CMakeOpenProjectWizard(CMakeManager *cmakeManager, CMake rmode = CMakeRunPage::ChangeDirectory; if (mode == CMakeOpenProjectWizard::ChangeDirectory) { - m_buildDirectory = info.buildDirectory; + m_buildDirectory = info->buildDirectory.toString(); addPage(new ShadowBuildPage(this, true)); } if (!m_cmakeManager->isCMakeExecutableValid()) addPage(new ChooseCMakePage(this)); - addPage(new CMakeRunPage(this, rmode, info.buildDirectory)); + addPage(new CMakeRunPage(this, rmode, info->buildDirectory.toString())); init(); } diff --git a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.h b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.h index 5b1a7f68410..793d635ab24 100644 --- a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.h +++ b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.h @@ -31,6 +31,7 @@ #define CMAKEOPENPROJECTWIZARD_H #include "cmakebuildconfiguration.h" +#include "cmakebuildinfo.h" #include #include @@ -70,34 +71,13 @@ public: ChangeDirectory }; - class BuildInfo - { - public: - BuildInfo() - {} - - BuildInfo(CMakeBuildConfiguration *bc) - : sourceDirectory(bc->target()->project()->projectDirectory()) - , buildDirectory(bc->buildDirectory().toString()) - , environment(bc->environment()) - , useNinja(bc->useNinja()) - , kit(bc->target()->kit()) - {} - - QString sourceDirectory; - QString buildDirectory; - Utils::Environment environment; - bool useNinja; - ProjectExplorer::Kit *kit; - }; - /// used at importing a project without a .user file CMakeOpenProjectWizard(CMakeManager *cmakeManager, const QString &sourceDirectory, Utils::Environment env); /// used to update if we have already a .user file /// recreates or updates the cbp file /// Also used to change the build directory of one buildconfiguration or create a new buildconfiguration - CMakeOpenProjectWizard(CMakeManager *cmakeManager, Mode mode, const BuildInfo &info); + CMakeOpenProjectWizard(CMakeManager *cmakeManager, Mode mode, const CMakeBuildInfo *info); QString buildDirectory() const; QString sourceDirectory() const; diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index ea5cf7b9ff9..18fd8422e76 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -141,8 +141,8 @@ void CMakeProject::changeActiveBuildConfiguration(ProjectExplorer::BuildConfigur } if (mode != CMakeOpenProjectWizard::Nothing) { - CMakeOpenProjectWizard copw(m_manager, mode, - CMakeOpenProjectWizard::BuildInfo(cmakebc)); + CMakeBuildInfo info(cmakebc); + CMakeOpenProjectWizard copw(m_manager, mode, &info); if (copw.exec() == QDialog::Accepted) cmakebc->setUseNinja(copw.useNinja()); // NeedToCreate can change the Ninja setting } @@ -585,8 +585,8 @@ bool CMakeProject::fromMap(const QVariantMap &map) mode = CMakeOpenProjectWizard::NeedToUpdate; if (mode != CMakeOpenProjectWizard::Nothing) { - CMakeOpenProjectWizard copw(m_manager, mode, - CMakeOpenProjectWizard::BuildInfo(activeBC)); + CMakeBuildInfo info(activeBC); + CMakeOpenProjectWizard copw(m_manager, mode, &info); if (copw.exec() != QDialog::Accepted) return false; else @@ -867,8 +867,9 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) void CMakeBuildSettingsWidget::openChangeBuildDirectoryDialog() { CMakeProject *project = static_cast(m_buildConfiguration->target()->project()); + CMakeBuildInfo info(m_buildConfiguration); CMakeOpenProjectWizard copw(project->projectManager(), CMakeOpenProjectWizard::ChangeDirectory, - CMakeOpenProjectWizard::BuildInfo(m_buildConfiguration)); + &info); if (copw.exec() == QDialog::Accepted) { project->changeBuildDirectory(m_buildConfiguration, copw.buildDirectory()); m_buildConfiguration->setUseNinja(copw.useNinja()); @@ -881,9 +882,9 @@ void CMakeBuildSettingsWidget::runCMake() if (!ProjectExplorer::ProjectExplorerPlugin::instance()->saveModifiedFiles()) return; CMakeProject *project = static_cast(m_buildConfiguration->target()->project()); + CMakeBuildInfo info(m_buildConfiguration); CMakeOpenProjectWizard copw(project->projectManager(), - CMakeOpenProjectWizard::WantToUpdate, - CMakeOpenProjectWizard::BuildInfo(m_buildConfiguration)); + CMakeOpenProjectWizard::WantToUpdate, &info); if (copw.exec() == QDialog::Accepted) project->parseCMakeLists(); } diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp index 910d027ab8f..b480c9b5db8 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp @@ -121,8 +121,9 @@ void CMakeManager::runCMake(ProjectExplorer::Project *project) CMakeBuildConfiguration *bc = static_cast(cmakeProject->activeTarget()->activeBuildConfiguration()); - CMakeOpenProjectWizard copw(this, CMakeOpenProjectWizard::WantToUpdate, - CMakeOpenProjectWizard::BuildInfo(bc)); + CMakeBuildInfo info(bc); + + CMakeOpenProjectWizard copw(this, CMakeOpenProjectWizard::WantToUpdate, &info); if (copw.exec() == QDialog::Accepted) cmakeProject->parseCMakeLists(); } diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro index 49e87adffaf..e0e8c8ce974 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro @@ -1,6 +1,7 @@ include(../../qtcreatorplugin.pri) -HEADERS = cmakeproject.h \ +HEADERS = cmakebuildinfo.h \ + cmakeproject.h \ cmakeprojectplugin.h \ cmakeprojectmanager.h \ cmakeprojectconstants.h \ diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs index 335ff10862d..1734c6cc94e 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs @@ -22,6 +22,7 @@ QtcPlugin { "CMakeProjectManager.mimetypes.xml", "cmakebuildconfiguration.cpp", "cmakebuildconfiguration.h", + "cmakebuildinfo.h", "cmakeeditor.cpp", "cmakeeditor.h", "cmakeeditorfactory.cpp", diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp index 3d451c6692b..4b1795344ca 100644 --- a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp +++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp @@ -31,7 +31,11 @@ #include "genericmakestep.h" #include "genericproject.h" +#include "genericprojectconstants.h" +#include +#include +#include #include #include #include @@ -83,53 +87,35 @@ GenericBuildConfigurationFactory::~GenericBuildConfigurationFactory() { } -QList GenericBuildConfigurationFactory::availableCreationIds(const Target *parent) const +bool GenericBuildConfigurationFactory::canCreate(const Target *parent) const { - if (!canHandle(parent)) - return QList(); - return QList() << Core::Id(GENERIC_BC_ID); + return canHandle(parent); } -QString GenericBuildConfigurationFactory::displayNameForId(const Core::Id id) const +QList GenericBuildConfigurationFactory::availableBuilds(const Target *parent) const { - if (id == GENERIC_BC_ID) - return tr("Build"); - return QString(); + 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::canCreate(const Target *parent, const Core::Id id) const +BuildConfiguration *GenericBuildConfigurationFactory::create(Target *parent, const BuildInfo *info) const { - if (!canHandle(parent)) - return false; - if (id == GENERIC_BC_ID) - return true; - return false; -} - -BuildConfiguration *GenericBuildConfigurationFactory::create(Target *parent, const Core::Id id, const QString &name) -{ - if (!canCreate(parent, id)) - return 0; - - //TODO asking for name is duplicated everywhere, but maybe more - // wizards will show up, that incorporate choosing the nam - bool ok = true; - QString buildConfigurationName = name; - if (buildConfigurationName.isNull()) - buildConfigurationName = QInputDialog::getText(0, - tr("New Configuration"), - tr("New configuration name:"), - QLineEdit::Normal, - QString(), &ok); - buildConfigurationName = buildConfigurationName.trimmed(); - if (!ok || buildConfigurationName.isEmpty()) - return 0; + 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); GenericBuildConfiguration *bc = new GenericBuildConfiguration(parent); - bc->setDisplayName(buildConfigurationName); + bc->setDisplayName(info->displayName); + bc->setDefaultDisplayName(info->displayName); + bc->setBuildDirectory(info->buildDirectory); - BuildStepList *buildSteps = bc->stepList(Constants::BUILDSTEPS_BUILD); - BuildStepList *cleanSteps = bc->stepList(Constants::BUILDSTEPS_CLEAN); + BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); + BuildStepList *cleanSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); Q_ASSERT(buildSteps); GenericMakeStep *makeStep = new GenericMakeStep(buildSteps); @@ -147,7 +133,9 @@ BuildConfiguration *GenericBuildConfigurationFactory::create(Target *parent, con bool GenericBuildConfigurationFactory::canClone(const Target *parent, BuildConfiguration *source) const { - return canCreate(parent, source->id()); + if (!canHandle(parent)) + return false; + return source->id() == GENERIC_BC_ID; } BuildConfiguration *GenericBuildConfigurationFactory::clone(Target *parent, BuildConfiguration *source) @@ -159,7 +147,9 @@ BuildConfiguration *GenericBuildConfigurationFactory::clone(Target *parent, Buil bool GenericBuildConfigurationFactory::canRestore(const Target *parent, const QVariantMap &map) const { - return canCreate(parent, ProjectExplorer::idFromMap(map)); + if (!canHandle(parent)) + return false; + return ProjectExplorer::idFromMap(map) == GENERIC_BC_ID; } BuildConfiguration *GenericBuildConfigurationFactory::restore(Target *parent, const QVariantMap &map) @@ -180,6 +170,16 @@ bool GenericBuildConfigurationFactory::canHandle(const Target *t) const return qobject_cast(t->project()); } +BuildInfo *GenericBuildConfigurationFactory::createBuildInfo(const ProjectExplorer::Kit *k, + const Utils::FileName &buildDir) const +{ + BuildInfo *info = new BuildInfo(this); + info->typeName = tr("Build"); + info->buildDirectory = buildDir; + info->kitId = k->id(); + return info; +} + BuildConfiguration::BuildType GenericBuildConfiguration::buildType() const { return Unknown; diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.h b/src/plugins/genericprojectmanager/genericbuildconfiguration.h index 38624547ab9..449b6d017a2 100644 --- a/src/plugins/genericprojectmanager/genericbuildconfiguration.h +++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.h @@ -33,7 +33,10 @@ #include #include -namespace Utils { class PathChooser; } +namespace Utils { +class FileName; +class PathChooser; +} // namespace Utils namespace GenericProjectManager { namespace Internal { @@ -69,11 +72,11 @@ public: explicit GenericBuildConfigurationFactory(QObject *parent = 0); ~GenericBuildConfigurationFactory(); - QList availableCreationIds(const ProjectExplorer::Target *parent) const; - QString displayNameForId(const Core::Id id) const; + bool canCreate(const ProjectExplorer::Target *parent) const; + QList availableBuilds(const ProjectExplorer::Target *parent) const; + ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, + const ProjectExplorer::BuildInfo *info) const; - bool canCreate(const ProjectExplorer::Target *parent, const Core::Id id) const; - ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, const Core::Id id, const QString &name = QString()); bool canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const; ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source); bool canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const; @@ -81,6 +84,7 @@ public: private: bool canHandle(const ProjectExplorer::Target *t) const; + ProjectExplorer::BuildInfo *createBuildInfo(const ProjectExplorer::Kit *k, const Utils::FileName &buildDir) const; }; class GenericBuildSettingsWidget : public ProjectExplorer::NamedWidget diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp index 72e52a69aa5..84cb07b285b 100644 --- a/src/plugins/projectexplorer/buildconfiguration.cpp +++ b/src/plugins/projectexplorer/buildconfiguration.cpp @@ -347,7 +347,7 @@ IBuildConfigurationFactory * IBuildConfigurationFactory::find(Target *parent) QList factories = ExtensionSystem::PluginManager::getObjects(); foreach (IBuildConfigurationFactory *factory, factories) { - if (!factory->availableCreationIds(parent).isEmpty()) + if (factory->canCreate(parent)) return factory; } return 0; diff --git a/src/plugins/projectexplorer/buildconfiguration.h b/src/plugins/projectexplorer/buildconfiguration.h index 3f2cf3759dd..69842fba64d 100644 --- a/src/plugins/projectexplorer/buildconfiguration.h +++ b/src/plugins/projectexplorer/buildconfiguration.h @@ -41,6 +41,7 @@ namespace Utils { class AbstractMacroExpander; } namespace ProjectExplorer { class BuildConfiguration; +class BuildInfo; class NamedWidget; class BuildStepList; class Kit; @@ -127,13 +128,13 @@ public: explicit IBuildConfigurationFactory(QObject *parent = 0); virtual ~IBuildConfigurationFactory(); - // used to show the list of possible additons to a target, returns a list of types - virtual QList availableCreationIds(const Target *parent) const = 0; - // used to translate the types to names to display to the user - virtual QString displayNameForId(const Core::Id id) const = 0; + // Used to see whether any BuildInfo is available on this factory for a given target. + virtual bool canCreate(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; + virtual BuildConfiguration *create(Target *parent, const BuildInfo *info) const = 0; - virtual bool canCreate(const Target *parent, const Core::Id id) const = 0; - virtual BuildConfiguration *create(Target *parent, const Core::Id id, const QString &name = QString()) = 0; // used to recreate the runConfigurations when restoring settings virtual bool canRestore(const Target *parent, const QVariantMap &map) const = 0; virtual BuildConfiguration *restore(Target *parent, const QVariantMap &map) = 0; @@ -141,6 +142,7 @@ public: virtual BuildConfiguration *clone(Target *parent, BuildConfiguration *product) = 0; static IBuildConfigurationFactory *find(Target *parent, const QVariantMap &map); + static IBuildConfigurationFactory *find(Kit *k, const QString &projectPath); static IBuildConfigurationFactory *find(Target *parent); static IBuildConfigurationFactory *find(Target *parent, BuildConfiguration *bc); diff --git a/src/plugins/projectexplorer/buildinfo.h b/src/plugins/projectexplorer/buildinfo.h new file mode 100644 index 00000000000..43fe6bc52b6 --- /dev/null +++ b/src/plugins/projectexplorer/buildinfo.h @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#ifndef BUILDINFO_H +#define BUILDINFO_H + +#include "projectexplorer_export.h" + +#include "task.h" + +#include +#include + +namespace ProjectExplorer { + +class IBuildConfigurationFactory; + +class PROJECTEXPLORER_EXPORT BuildInfo +{ +public: + BuildInfo(const IBuildConfigurationFactory *f) : supportsShadowBuild(false), m_factory(f) { } + virtual ~BuildInfo() { } + + const IBuildConfigurationFactory *factory() const { return m_factory; } + + QString displayName; + QString typeName; + Utils::FileName buildDirectory; + Core::Id kitId; + bool supportsShadowBuild; + + virtual QList reportIssues(const QString &projectPath, + const QString &buildDir) const + { + Q_UNUSED(projectPath); + Q_UNUSED(buildDir); + return QList(); + } + +private: + const IBuildConfigurationFactory *m_factory; + + friend class IBuildConfigurationFactory; +}; + +} // namespace ProjectExplorer + +#endif // BUILDINFO_H diff --git a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp index 67129ce94cb..15a661d8284 100644 --- a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp @@ -28,6 +28,7 @@ ****************************************************************************/ #include "buildsettingspropertiespage.h" +#include "buildinfo.h" #include "buildstepspage.h" #include "project.h" #include "target.h" @@ -35,6 +36,7 @@ #include "buildconfigurationmodel.h" #include +#include #include #include @@ -97,6 +99,7 @@ PropertiesPanel *BuildSettingsPanelFactory::createPanel(Target *target) BuildSettingsWidget::~BuildSettingsWidget() { clear(); + qDeleteAll(m_buildInfoList); } BuildSettingsWidget::BuildSettingsWidget(Target *target) : @@ -208,17 +211,21 @@ QList BuildSettingsWidget::subWidgets() const void BuildSettingsWidget::updateAddButtonMenu() { m_addButtonMenu->clear(); + qDeleteAll(m_buildInfoList); + m_buildInfoList.clear(); + if (m_target) { if (m_target->activeBuildConfiguration()) { m_addButtonMenu->addAction(tr("&Clone Selected"), this, SLOT(cloneConfiguration())); } - IBuildConfigurationFactory * factory = IBuildConfigurationFactory::find(m_target); + IBuildConfigurationFactory *factory = IBuildConfigurationFactory::find(m_target); if (!factory) return; - foreach (Core::Id id, factory->availableCreationIds(m_target)) { - QAction *action = m_addButtonMenu->addAction(factory->displayNameForId(id), this, SLOT(createConfiguration())); - action->setData(QVariant::fromValue(id)); + m_buildInfoList = factory->availableBuilds(m_target); + foreach (BuildInfo *info, m_buildInfoList) { + QAction *action = m_addButtonMenu->addAction(info->typeName, this, SLOT(createConfiguration())); + action->setData(QVariant::fromValue(static_cast(info))); } } } @@ -269,19 +276,24 @@ void BuildSettingsWidget::updateActiveConfiguration() void BuildSettingsWidget::createConfiguration() { QAction *action = qobject_cast(sender()); - Core::Id id = action->data().value(); + BuildInfo *info = static_cast(action->data().value()); - IBuildConfigurationFactory *factory = IBuildConfigurationFactory::find(m_target); - if (!factory) - return; + if (info->displayName.isEmpty()) { + bool ok = false; + info->displayName = QInputDialog::getText(Core::ICore::mainWindow(), + tr("New Configuration"), + tr("New configuration name:"), + QLineEdit::Normal, + QString(), &ok).trimmed(); + if (!ok || info->displayName.isEmpty()) + return; + } - BuildConfiguration *bc = factory->create(m_target, id); + BuildConfiguration *bc = info->factory()->create(m_target, info); if (!bc) return; m_target->addBuildConfiguration(bc); - - QTC_CHECK(bc->id() == id); m_target->setActiveBuildConfiguration(bc); } diff --git a/src/plugins/projectexplorer/buildsettingspropertiespage.h b/src/plugins/projectexplorer/buildsettingspropertiespage.h index 42fd178bc3f..d75b701d945 100644 --- a/src/plugins/projectexplorer/buildsettingspropertiespage.h +++ b/src/plugins/projectexplorer/buildsettingspropertiespage.h @@ -44,6 +44,7 @@ QT_END_NAMESPACE namespace ProjectExplorer { class BuildConfiguration; +class BuildInfo; class IBuildStepFactory; class NamedWidget; @@ -104,6 +105,7 @@ private: QList m_subWidgets; QList m_labels; + QList m_buildInfoList; }; } // namespace Internal diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 04b4867898c..de4aabf4c1e 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -29,6 +29,7 @@ #include "project.h" +#include "buildinfo.h" #include "buildconfiguration.h" #include "editorconfiguration.h" #include "projectexplorer.h" @@ -476,6 +477,36 @@ bool Project::needsSpecialDeployment() const return false; } +void Project::setup(QList infoList) +{ + QList toRegister; + foreach (const BuildInfo *info, infoList) { + Kit *k = KitManager::find(info->kitId); + if (!k) + continue; + Target *t = target(k); + if (!t) { + foreach (Target *i, toRegister) { + if (i->kit() == k) { + t = i; + break; + } + } + } + if (!t) { + t = new Target(this, k); + toRegister << t; + } + + BuildConfiguration *bc = info->factory()->create(t, info); + if (!bc) + continue; + t->addBuildConfiguration(bc); + } + foreach (Target *t, toRegister) + addTarget(t); +} + void Project::onBuildDirectoryChanged() { Target *target = qobject_cast(sender()); diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index baa9e7f3445..84be549966b 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -44,6 +44,7 @@ class Context; namespace ProjectExplorer { +class BuildInfo; class IProjectManager; class EditorConfiguration; class ProjectNode; @@ -127,6 +128,8 @@ public: virtual bool needsSpecialDeployment() const; + void setup(QList infoList); + signals: void displayNameChanged(); void fileListChanged(); diff --git a/src/plugins/projectexplorer/projectexplorer.pro b/src/plugins/projectexplorer/projectexplorer.pro index 0c0eae361d3..ea124bcf4c7 100644 --- a/src/plugins/projectexplorer/projectexplorer.pro +++ b/src/plugins/projectexplorer/projectexplorer.pro @@ -6,6 +6,7 @@ HEADERS += projectexplorer.h \ abi.h \ abiwidget.h \ ansifilterparser.h \ + buildinfo.h \ clangparser.h \ environmentaspect.h \ environmentaspectwidget.h \ diff --git a/src/plugins/projectexplorer/projectexplorer.qbs b/src/plugins/projectexplorer/projectexplorer.qbs index 410a0f10859..a1504711d0c 100644 --- a/src/plugins/projectexplorer/projectexplorer.qbs +++ b/src/plugins/projectexplorer/projectexplorer.qbs @@ -33,6 +33,7 @@ QtcPlugin { "buildconfiguration.cpp", "buildconfiguration.h", "buildconfigurationmodel.cpp", "buildconfigurationmodel.h", "buildenvironmentwidget.cpp", "buildenvironmentwidget.h", + "buildinfo.h", "buildmanager.cpp", "buildmanager.h", "buildprogress.cpp", "buildprogress.h", "buildsettingspropertiespage.cpp", "buildsettingspropertiespage.h", diff --git a/src/plugins/projectexplorer/target.cpp b/src/plugins/projectexplorer/target.cpp index c6fd834cdef..58149141fe1 100644 --- a/src/plugins/projectexplorer/target.cpp +++ b/src/plugins/projectexplorer/target.cpp @@ -29,6 +29,7 @@ #include "target.h" +#include "buildinfo.h" #include "buildtargetinfo.h" #include "deploymentdata.h" #include "kit.h" @@ -527,16 +528,14 @@ void Target::updateDefaultBuildConfigurations() qWarning("No build configuration factory found for target id '%s'.", qPrintable(id().toString())); return; } - QList bcIds = bcFactory->availableCreationIds(this); - foreach (Core::Id id, bcIds) { - if (!bcFactory->canCreate(this, id)) - continue; - BuildConfiguration *bc = bcFactory->create(this, id, tr("Default build")); + QList infoList = bcFactory->availableBuilds(this); + foreach (BuildInfo *info, infoList) { + BuildConfiguration *bc = bcFactory->create(this, info); if (!bc) continue; - QTC_CHECK(bc->id() == id); addBuildConfiguration(bc); } + qDeleteAll(infoList); } void Target::updateDefaultDeployConfigurations() diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp index e08a616bd85..3350bb6a7b1 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp @@ -30,11 +30,14 @@ #include "qbsbuildconfiguration.h" #include "qbsbuildconfigurationwidget.h" +#include "qbsbuildinfo.h" #include "qbsbuildstep.h" #include "qbscleanstep.h" #include "qbsproject.h" #include "qbsprojectmanagerconstants.h" +#include +#include #include #include #include @@ -238,66 +241,57 @@ bool QbsBuildConfigurationFactory::canHandle(const ProjectExplorer::Target *t) c return qobject_cast(t->project()); } -QList QbsBuildConfigurationFactory::availableCreationIds(const ProjectExplorer::Target *parent) const +ProjectExplorer::BuildInfo *QbsBuildConfigurationFactory::createBuildInfo(const ProjectExplorer::Kit *k, + const Utils::FileName &buildDirectory, + ProjectExplorer::BuildConfiguration::BuildType type) const { - if (!canHandle(parent)) - return QList(); - return QList() << Core::Id(QBS_BC_ID); + QbsBuildInfo *info = new QbsBuildInfo(this); + info->typeName = tr("Build"); + info->buildDirectory = buildDirectory; + info->kitId = k->id(); + info->type = type; + return info; } -QString QbsBuildConfigurationFactory::displayNameForId(const Core::Id id) const +bool QbsBuildConfigurationFactory::canCreate(const ProjectExplorer::Target *parent) const { - if (id == QBS_BC_ID) - return tr("Qbs based build"); - return QString(); + return canHandle(parent); } -bool QbsBuildConfigurationFactory::canCreate(const ProjectExplorer::Target *parent, const Core::Id id) const +QList QbsBuildConfigurationFactory::availableBuilds(const ProjectExplorer::Target *parent) const { - if (!canHandle(parent)) - return false; - return id == QBS_BC_ID; + QList result; + QTC_ASSERT(canCreate(parent), return result); + + const Utils::FileName buildDirectory = QbsProject::defaultBuildDirectory(parent->project()->projectFilePath()); + + ProjectExplorer::BuildInfo *info = createBuildInfo(parent->kit(), buildDirectory, + ProjectExplorer::BuildConfiguration::Debug); + result << info; + + return result; } ProjectExplorer::BuildConfiguration *QbsBuildConfigurationFactory::create(ProjectExplorer::Target *parent, - const Core::Id id, - const QString &name) + const ProjectExplorer::BuildInfo *info) const { - if (!canCreate(parent, id)) - return 0; + 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); - Internal::QbsProject *project = static_cast(parent->project()); - - bool ok = true; - QString buildConfigurationName = name; - if (buildConfigurationName.isNull()) - buildConfigurationName = QInputDialog::getText(0, - tr("New Configuration"), - tr("New configuration name:"), - QLineEdit::Normal, - QString(), &ok); - buildConfigurationName = buildConfigurationName.trimmed(); - if (!ok || buildConfigurationName.isEmpty()) - return 0; - - //: Debug build configuration. We recommend not translating it. - QString firstName = tr("%1 Debug").arg(buildConfigurationName).trimmed(); - - //: Release build configuration. We recommend not translating it. - QString secondName = tr("%1 Release").arg(buildConfigurationName).trimmed(); + const QbsBuildInfo *qbsInfo = static_cast(info); QVariantMap configData; configData.insert(QLatin1String(Constants::QBS_CONFIG_VARIANT_KEY), - QLatin1String(Constants::QBS_VARIANT_DEBUG)); + (qbsInfo->type == ProjectExplorer::BuildConfiguration::Release) + ? QLatin1String(Constants::QBS_VARIANT_RELEASE) + : QLatin1String(Constants::QBS_VARIANT_DEBUG)); ProjectExplorer::BuildConfiguration *bc - = QbsBuildConfiguration::setup(parent, firstName, firstName, - configData, project->defaultBuildDirectory()); - configData.insert(QLatin1String(Constants::QBS_CONFIG_VARIANT_KEY), - QLatin1String(Constants::QBS_VARIANT_RELEASE)); - parent->addBuildConfiguration( - QbsBuildConfiguration::setup(parent, secondName, secondName, - configData, project->defaultBuildDirectory())); + = QbsBuildConfiguration::setup(parent, info->displayName, info->displayName, + configData, info->buildDirectory); + return bc; } diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h index 7959137f8f6..9c50c35f416 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h +++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h @@ -112,11 +112,11 @@ public: explicit QbsBuildConfigurationFactory(QObject *parent = 0); ~QbsBuildConfigurationFactory(); - QList availableCreationIds(const ProjectExplorer::Target *parent) const; - QString displayNameForId(const Core::Id id) const; + bool canCreate(const ProjectExplorer::Target *parent) const; + QList availableBuilds(const ProjectExplorer::Target *parent) const; + ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, + const ProjectExplorer::BuildInfo *info) const; - bool canCreate(const ProjectExplorer::Target *parent, const Core::Id id) const; - ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, const Core::Id id, const QString &name = QString()); bool canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const; ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source); bool canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const; @@ -124,6 +124,9 @@ public: private: bool canHandle(const ProjectExplorer::Target *t) const; + ProjectExplorer::BuildInfo *createBuildInfo(const ProjectExplorer::Kit *k, + const Utils::FileName &buildDirectory, + ProjectExplorer::BuildConfiguration::BuildType type) const; }; } // namespace Internal diff --git a/src/plugins/qbsprojectmanager/qbsbuildinfo.h b/src/plugins/qbsprojectmanager/qbsbuildinfo.h new file mode 100644 index 00000000000..913c24bfb1b --- /dev/null +++ b/src/plugins/qbsprojectmanager/qbsbuildinfo.h @@ -0,0 +1,52 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#ifndef QBSBUILDINFO_H +#define QBSBUILDINFO_H + +#include "qbsbuildconfiguration.h" + +#include +#include + +namespace QbsProjectManager { +namespace Internal { + +class QbsBuildInfo : public ProjectExplorer::BuildInfo +{ +public: + QbsBuildInfo(const QbsBuildConfigurationFactory *f) : ProjectExplorer::BuildInfo(f) { } + + ProjectExplorer::BuildConfiguration::BuildType type; +}; + +} // namespace Internal +} // namespace QbsProjectManager + +#endif // QBSBUILDINFO_H diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 035e9e3c6a4..6e0342eeb8b 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -235,7 +235,12 @@ bool QbsProject::hasParseResult() const FileName QbsProject::defaultBuildDirectory() const { - QFileInfo fi(m_fileName); + return defaultBuildDirectory(m_fileName); +} + +Utils::FileName QbsProject::defaultBuildDirectory(const QString &path) +{ + QFileInfo fi(path); const QString buildDir = QDir(fi.canonicalPath()).absoluteFilePath(QString::fromLatin1("../%1-build").arg(fi.baseName())); return FileName::fromString(buildDir); } diff --git a/src/plugins/qbsprojectmanager/qbsproject.h b/src/plugins/qbsprojectmanager/qbsproject.h index dc894c50728..1a8d9232d84 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.h +++ b/src/plugins/qbsprojectmanager/qbsproject.h @@ -93,6 +93,7 @@ public: bool hasParseResult() const; Utils::FileName defaultBuildDirectory() const; + static Utils::FileName defaultBuildDirectory(const QString &path); qbs::Project qbsProject() const; const qbs::ProjectData qbsProjectData() const; diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanager.pro b/src/plugins/qbsprojectmanager/qbsprojectmanager.pro index e1d9c9c5266..8f8319e037a 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanager.pro +++ b/src/plugins/qbsprojectmanager/qbsprojectmanager.pro @@ -20,6 +20,7 @@ HEADERS = \ propertyprovider.h \ qbsbuildconfiguration.h \ qbsbuildconfigurationwidget.h \ + qbsbuildinfo.h \ qbsbuildstep.h \ qbscleanstep.h \ qbsdeployconfigurationfactory.h \ diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs b/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs index 4292d6cdd6c..ded8f4b6874 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs +++ b/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs @@ -61,6 +61,7 @@ QtcPlugin { "qbsbuildconfiguration.h", "qbsbuildconfigurationwidget.cpp", "qbsbuildconfigurationwidget.h", + "qbsbuildinfo.h", "qbsbuildstep.cpp", "qbsbuildstep.h", "qbsbuildstepconfigwidget.ui", diff --git a/src/plugins/qt4projectmanager/qmakebuildinfo.h b/src/plugins/qt4projectmanager/qmakebuildinfo.h new file mode 100644 index 00000000000..8ceb78f7d45 --- /dev/null +++ b/src/plugins/qt4projectmanager/qmakebuildinfo.h @@ -0,0 +1,52 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#ifndef QMAKEBUILDINFO_H +#define QMAKEBUILDINFO_H + +#include "qt4buildconfiguration.h" + +#include +#include + +namespace Qt4ProjectManager { + +class QmakeBuildInfo : public ProjectExplorer::BuildInfo +{ +public: + QmakeBuildInfo(const Qt4BuildConfigurationFactory *f) : ProjectExplorer::BuildInfo(f) { } + + ProjectExplorer::BuildConfiguration::BuildType type; + QString additionalArguments; + QString makefile; +}; + +} // namespace Qt4ProjectManager + +#endif // QMAKEBUILDINFO_H diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp index f84d8e5b4dd..4e18dbb75be 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp @@ -29,17 +29,20 @@ #include "qt4buildconfiguration.h" +#include "buildconfigurationinfo.h" +#include "qmakebuildinfo.h" #include "qt4project.h" #include "qt4projectconfigwidget.h" #include "qt4projectmanagerconstants.h" #include "qt4nodes.h" #include "qmakestep.h" #include "makestep.h" -#include "buildconfigurationinfo.h" #include #include #include +#include +#include #include #include #include @@ -48,6 +51,7 @@ #include #include #include +#include #include #include @@ -532,69 +536,71 @@ bool Qt4BuildConfigurationFactory::canHandle(const Target *t) const return qobject_cast(t->project()); } -QList Qt4BuildConfigurationFactory::availableCreationIds(const Target *parent) const +QmakeBuildInfo *Qt4BuildConfigurationFactory::createBuildInfo(const Kit *k, + const QString &projectPath, + BuildConfiguration::BuildType type) const { - if (!canHandle(parent)) - return QList(); - return QList() << Core::Id(QT4_BC_ID); + QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(k); + QmakeBuildInfo *info = new QmakeBuildInfo(this); + if (type == BuildConfiguration::Release) + //: The name of the release build configuration created by default for a qmake project. + info->displayName = tr("Release"); + else + //: The name of the debug build configuration created by default for a qmake project. + info->displayName = tr("Debug"); + info->typeName = tr("Build"); + // Leave info->buildDirectory unset; + info->kitId = k->id(); + info->supportsShadowBuild = (version && version->supportsShadowBuilds()); + if (info->supportsShadowBuild) + info->buildDirectory = Utils::FileName::fromString(Qt4Project::shadowBuildDirectory(projectPath, k, info->displayName)); + else + info->buildDirectory = Utils::FileName::fromString(ProjectExplorer::Project::projectDirectory(projectPath)); + info->type = type; + return info; } -QString Qt4BuildConfigurationFactory::displayNameForId(const Core::Id id) const +bool Qt4BuildConfigurationFactory::canCreate(const Target *parent) const { - if (id == QT4_BC_ID) - return tr("Qmake based build"); - return QString(); + return canHandle(parent); } -bool Qt4BuildConfigurationFactory::canCreate(const Target *parent, const Core::Id id) const +QList Qt4BuildConfigurationFactory::availableBuilds(const Target *parent) const { - if (!canHandle(parent)) - return false; - return id == QT4_BC_ID; + 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 + result << info; + + return result; } -BuildConfiguration *Qt4BuildConfigurationFactory::create(Target *parent, const Core::Id id, const QString &name) +BuildConfiguration *Qt4BuildConfigurationFactory::create(Target *parent, const BuildInfo *info) const { - if (!canCreate(parent, id)) - return 0; + 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); - BaseQtVersion *version = QtKitInformation::qtVersion(parent->kit()); - Q_ASSERT(version); + const QmakeBuildInfo *qmakeInfo = static_cast(info); - bool ok = true; - QString buildConfigurationName = name; - if (buildConfigurationName.isNull()) - buildConfigurationName = QInputDialog::getText(0, - tr("New Configuration"), - tr("New configuration name:"), - QLineEdit::Normal, - version->displayName(), &ok); - buildConfigurationName = buildConfigurationName.trimmed(); - if (!ok || buildConfigurationName.isEmpty()) - return 0; + BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(parent->kit()); + QTC_ASSERT(version, return 0); - //: Debug build configuration. We recommend not translating it. - QString defaultFirstName = tr("%1 Debug").arg(version->displayName()).trimmed(); - QString customFirstName; - if (buildConfigurationName != version->displayName()) - customFirstName = tr("%1 Debug").arg(buildConfigurationName).trimmed(); + BaseQtVersion::QmakeBuildConfigs config = version->defaultBuildConfig(); + if (qmakeInfo->type == BuildConfiguration::Release) + config &= ~QtSupport::BaseQtVersion::DebugBuild; + else + config |= QtSupport::BaseQtVersion::DebugBuild; - //: Release build configuration. We recommend not translating it. - QString defaultSecondName = tr("%1 Release").arg(version->displayName()).trimmed(); - QString customSecondName; - if (buildConfigurationName != version->displayName()) - customSecondName = tr("%1 Release").arg(buildConfigurationName).trimmed(); - - BaseQtVersion::QmakeBuildConfigs config = version->defaultBuildConfig() | QtSupport::BaseQtVersion::DebugBuild; BuildConfiguration *bc - = Qt4BuildConfiguration::setup(parent, defaultFirstName, customFirstName, - config, QString(), QString(), false); + = Qt4BuildConfiguration::setup(parent, info->displayName, info->displayName, + config, qmakeInfo->additionalArguments, + info->buildDirectory.toString(), false); - config = config ^ BaseQtVersion::DebugBuild; - parent->addBuildConfiguration( - Qt4BuildConfiguration::setup(parent, defaultSecondName, customSecondName, - config, - QString(), QString(), false)); return bc; } @@ -672,6 +678,8 @@ Qt4BuildConfiguration *Qt4BuildConfiguration::setup(Target *t, QString defaultDi QString additionalArguments, QString directory, bool importing) { + Q_UNUSED(importing); + // Add the build configuration. Qt4BuildConfiguration *bc = new Qt4BuildConfiguration(t); bc->setDefaultDisplayName(defaultDisplayName); @@ -695,10 +703,10 @@ Qt4BuildConfiguration *Qt4BuildConfiguration::setup(Target *t, QString defaultDi bool enableQmlDebugger = Qt4BuildConfiguration::removeQMLInspectorFromArguments(&additionalArguments); + if (!additionalArguments.isEmpty()) qmakeStep->setUserArguments(additionalArguments); - if (importing) - qmakeStep->setLinkQmlDebuggingLibrary(enableQmlDebugger); + qmakeStep->setLinkQmlDebuggingLibrary(enableQmlDebugger); bc->setQMakeBuildConfiguration(qmakeBuildConfiguration); diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.h b/src/plugins/qt4projectmanager/qt4buildconfiguration.h index b6256df57bf..d789fe3b524 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfiguration.h +++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.h @@ -39,6 +39,7 @@ namespace ProjectExplorer { class FileNode; } namespace Qt4ProjectManager { +class QmakeBuildInfo; class QMakeStep; class MakeStep; class Qt4BuildConfigurationFactory; @@ -171,11 +172,11 @@ public: explicit Qt4BuildConfigurationFactory(QObject *parent = 0); ~Qt4BuildConfigurationFactory(); - QList availableCreationIds(const ProjectExplorer::Target *parent) const; - QString displayNameForId(const Core::Id id) const; + bool canCreate(const ProjectExplorer::Target *parent) const; + QList availableBuilds(const ProjectExplorer::Target *parent) const; + ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, + const ProjectExplorer::BuildInfo *info) const; - bool canCreate(const ProjectExplorer::Target *parent, const Core::Id id) const; - ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, const Core::Id id, const QString &name = QString()); bool canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const; ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source); bool canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const; @@ -189,6 +190,8 @@ private slots: private: bool canHandle(const ProjectExplorer::Target *t) const; + QmakeBuildInfo *createBuildInfo(const ProjectExplorer::Kit *k, const QString &projectPath, + ProjectExplorer::BuildConfiguration::BuildType type) const; }; } // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.pro b/src/plugins/qt4projectmanager/qt4projectmanager.pro index ad19843ece9..9a0bb33d45a 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.pro +++ b/src/plugins/qt4projectmanager/qt4projectmanager.pro @@ -5,6 +5,7 @@ DEFINES += \ QT4PROJECTMANAGER_LIBRARY HEADERS += \ + qmakebuildinfo.h \ qmakekitinformation.h \ qmakekitconfigwidget.h \ qmakerunconfigurationfactory.h \ diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.qbs b/src/plugins/qt4projectmanager/qt4projectmanager.qbs index ecbdeb3a54f..7ab01103072 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.qbs +++ b/src/plugins/qt4projectmanager/qt4projectmanager.qbs @@ -36,6 +36,7 @@ QtcPlugin { "profilehighlighter.cpp", "profilehighlighter.h", "profilehighlighterfactory.cpp", "profilehighlighterfactory.h", "profilehoverhandler.cpp", "profilehoverhandler.h", + "qmakebuildinfo.h", "qmakeparser.cpp", "qmakeparser.h", "qmakekitconfigwidget.cpp", "qmakekitconfigwidget.h", "qmakekitinformation.cpp", "qmakekitinformation.h",