diff options
Diffstat (limited to 'src/plugins/cmakeprojectmanager')
17 files changed, 232 insertions, 627 deletions
diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 38ba67a582a..5597225e4a2 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -34,12 +34,11 @@ #include "cmakeopenprojectwizard.h" #include "cmakeproject.h" -#include "cmaketarget.h" -#include <projectexplorer/projectexplorerconstants.h> -#include <projectexplorer/toolchainmanager.h> -#include <projectexplorer/toolchain.h> #include <projectexplorer/buildsteplist.h> +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/target.h> #include <utils/qtcassert.h> #include <QInputDialog> @@ -49,17 +48,19 @@ using namespace Internal; namespace { const char CMAKE_BC_ID[] = "CMakeProjectManager.CMakeBuildConfiguration"; -const char TOOLCHAIN_KEY[] = "CMakeProjectManager.CMakeBuildConfiguration.ToolChain"; const char BUILD_DIRECTORY_KEY[] = "CMakeProjectManager.CMakeBuildConfiguration.BuildDirectory"; } // namespace -CMakeBuildConfiguration::CMakeBuildConfiguration(CMakeTarget *parent) : +CMakeBuildConfiguration::CMakeBuildConfiguration(ProjectExplorer::Target *parent) : BuildConfiguration(parent, Core::Id(CMAKE_BC_ID)) { - m_buildDirectory = cmakeTarget()->defaultBuildDirectory(); + CMakeProject *project = qobject_cast<CMakeProject *>(parent->project()); + if (project) + m_buildDirectory = project->defaultBuildDirectory(); } -CMakeBuildConfiguration::CMakeBuildConfiguration(CMakeTarget *parent, CMakeBuildConfiguration *source) : +CMakeBuildConfiguration::CMakeBuildConfiguration(ProjectExplorer::Target *parent, + CMakeBuildConfiguration *source) : BuildConfiguration(parent, source), m_buildDirectory(source->m_buildDirectory), m_msvcVersion(source->m_msvcVersion) @@ -71,7 +72,6 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(CMakeTarget *parent, CMakeBuild QVariantMap CMakeBuildConfiguration::toMap() const { QVariantMap map(ProjectExplorer::BuildConfiguration::toMap()); - map.insert(QLatin1String(TOOLCHAIN_KEY), toolChain() ? toolChain()->id() : QString()); map.insert(QLatin1String(BUILD_DIRECTORY_KEY), m_buildDirectory); return map; } @@ -81,46 +81,17 @@ bool CMakeBuildConfiguration::fromMap(const QVariantMap &map) if (!BuildConfiguration::fromMap(map)) return false; - setToolChain(ProjectExplorer::ToolChainManager::instance()-> - findToolChain(map.value(QLatin1String(TOOLCHAIN_KEY)).toString())); - - if (!toolChain()) { - // restoring from older versions? - QList<ProjectExplorer::ToolChain *> list = ProjectExplorer::ToolChainManager::instance()->toolChains(); - if (!map.value("CMakeProjectManager.CMakeBuildConfiguration.MsvcVersion").toString().isEmpty()) { - foreach (ProjectExplorer::ToolChain *tc, list) { - if (tc->id().startsWith(ProjectExplorer::Constants::MSVC_TOOLCHAIN_ID)) { - setToolChain(tc); - break; - } - } - } else { -#ifdef Q_OS_WIN - QString toolChainId = ProjectExplorer::Constants::MINGW_TOOLCHAIN_ID; -#else - QString toolChainId = ProjectExplorer::Constants::GCC_TOOLCHAIN_ID; -#endif - foreach (ProjectExplorer::ToolChain *tc, list) { - if (tc->id().startsWith(toolChainId)) { - setToolChain(tc); - break; - } - } - } - } - - m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY), cmakeTarget()->defaultBuildDirectory()).toString(); + m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY)).toString(); return true; } CMakeBuildConfiguration::~CMakeBuildConfiguration() -{ -} +{ } -CMakeTarget *CMakeBuildConfiguration::cmakeTarget() const +ProjectExplorer::BuildConfigWidget *CMakeBuildConfiguration::createConfigWidget() { - return static_cast<CMakeTarget *>(target()); + return new CMakeBuildSettingsWidget; } QString CMakeBuildConfiguration::buildDirectory() const @@ -139,16 +110,16 @@ void CMakeBuildConfiguration::setBuildDirectory(const QString &buildDirectory) ProjectExplorer::IOutputParser *CMakeBuildConfiguration::createOutputParser() const { - if (toolChain()) - return toolChain()->outputParser(); + ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(target()->profile()); + if (tc) + return tc->outputParser(); return 0; } Utils::Environment CMakeBuildConfiguration::baseEnvironment() const { Utils::Environment env = BuildConfiguration::baseEnvironment(); - if (toolChain()) - toolChain()->addToEnvironment(env); + target()->profile()->addToEnvironment(env); return env; } @@ -165,9 +136,9 @@ CMakeBuildConfigurationFactory::~CMakeBuildConfigurationFactory() { } -QList<Core::Id> CMakeBuildConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const +QList<Core::Id> CMakeBuildConfigurationFactory::availableCreationIds(const ProjectExplorer::Target *parent) const { - if (!qobject_cast<CMakeTarget *>(parent)) + if (!canHandle(parent)) return QList<Core::Id>(); return QList<Core::Id>() << Core::Id(CMAKE_BC_ID); } @@ -179,34 +150,37 @@ QString CMakeBuildConfigurationFactory::displayNameForId(const Core::Id id) cons return QString(); } -bool CMakeBuildConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const Core::Id id) const +bool CMakeBuildConfigurationFactory::canCreate(const ProjectExplorer::Target *parent, const Core::Id id) const { - if (!qobject_cast<CMakeTarget *>(parent)) + if (!canHandle(parent)) return false; if (id == Core::Id(CMAKE_BC_ID)) return true; return false; } -CMakeBuildConfiguration *CMakeBuildConfigurationFactory::create(ProjectExplorer::Target *parent, const Core::Id id) +CMakeBuildConfiguration *CMakeBuildConfigurationFactory::create(ProjectExplorer::Target *parent, const Core::Id id, const QString &name) { if (!canCreate(parent, id)) return 0; - CMakeTarget *cmtarget = static_cast<CMakeTarget *>(parent); - Q_ASSERT(cmtarget); - - //TODO configuration name should be part of the cmakeopenprojectwizard - bool ok; - QString buildConfigurationName = QInputDialog::getText(0, - tr("New Configuration"), - tr("New configuration name:"), - QLineEdit::Normal, - QString(), - &ok); + CMakeProject *project = qobject_cast<CMakeProject *>(parent->project()); + if (!project) + return 0; + + bool ok = true; + QString buildConfigurationName = name; + if (buildConfigurationName.isEmpty()) + buildConfigurationName = QInputDialog::getText(0, + tr("New Configuration"), + tr("New configuration name:"), + QLineEdit::Normal, + QString(), &ok); + buildConfigurationName = buildConfigurationName.trimmed(); if (!ok || buildConfigurationName.isEmpty()) return 0; - CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(cmtarget); + + CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(parent); bc->setDisplayName(buildConfigurationName); ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); @@ -220,28 +194,25 @@ CMakeBuildConfiguration *CMakeBuildConfigurationFactory::create(ProjectExplorer: cleanMakeStep->setAdditionalArguments("clean"); cleanMakeStep->setClean(true); - CMakeOpenProjectWizard copw(cmtarget->cmakeProject()->projectManager(), - cmtarget->project()->projectDirectory(), + CMakeOpenProjectWizard copw(project->projectManager(), + project->projectDirectory(), bc->buildDirectory(), bc->environment()); if (copw.exec() != QDialog::Accepted) { delete bc; return 0; } - bc->setToolChain(copw.toolChain()); - cmtarget->addBuildConfiguration(bc); // this also makes the name unique bc->setBuildDirectory(copw.buildDirectory()); - cmtarget->cmakeProject()->parseCMakeLists(); // Default to all - if (cmtarget->cmakeProject()->hasBuildTarget("all")) + if (project->hasBuildTarget("all")) makeStep->setBuildTarget("all", true); return bc; } -bool CMakeBuildConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const +bool CMakeBuildConfigurationFactory::canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const { return canCreate(parent, source->id()); } @@ -251,11 +222,10 @@ CMakeBuildConfiguration *CMakeBuildConfigurationFactory::clone(ProjectExplorer:: if (!canClone(parent, source)) return 0; CMakeBuildConfiguration *old = static_cast<CMakeBuildConfiguration *>(source); - CMakeTarget *cmtarget(static_cast<CMakeTarget *>(parent)); - return new CMakeBuildConfiguration(cmtarget, old); + return new CMakeBuildConfiguration(parent, old); } -bool CMakeBuildConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const +bool CMakeBuildConfigurationFactory::canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const { return canCreate(parent, ProjectExplorer::idFromMap(map)); } @@ -264,14 +234,20 @@ CMakeBuildConfiguration *CMakeBuildConfigurationFactory::restore(ProjectExplorer { if (!canRestore(parent, map)) return 0; - CMakeTarget *cmtarget(static_cast<CMakeTarget *>(parent)); - CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(cmtarget); + CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(parent); if (bc->fromMap(map)) return bc; delete bc; return 0; } +bool CMakeBuildConfigurationFactory::canHandle(const ProjectExplorer::Target *t) const +{ + if (!t->project()->supportsProfile(t->profile())) + return false; + return qobject_cast<CMakeProject *>(t->project()); +} + ProjectExplorer::BuildConfiguration::BuildType CMakeBuildConfiguration::buildType() const { QString cmakeBuildType; @@ -303,4 +279,3 @@ ProjectExplorer::BuildConfiguration::BuildType CMakeBuildConfiguration::buildTyp return Unknown; } - diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h index b0f7bb33dda..01be5dab510 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h @@ -43,7 +43,6 @@ class ToolChain; namespace CMakeProjectManager { namespace Internal { -class CMakeTarget; class CMakeBuildConfigurationFactory; class CMakeBuildConfiguration : public ProjectExplorer::BuildConfiguration @@ -52,12 +51,11 @@ class CMakeBuildConfiguration : public ProjectExplorer::BuildConfiguration friend class CMakeBuildConfigurationFactory; public: - CMakeBuildConfiguration(CMakeTarget *parent); + CMakeBuildConfiguration(ProjectExplorer::Target *parent); ~CMakeBuildConfiguration(); - CMakeTarget *cmakeTarget() const; - - virtual QString buildDirectory() const; + ProjectExplorer::BuildConfigWidget *createConfigWidget(); + QString buildDirectory() const; void setBuildDirectory(const QString &buildDirectory); @@ -70,7 +68,7 @@ public: BuildType buildType() const; protected: - CMakeBuildConfiguration(CMakeTarget *parent, CMakeBuildConfiguration *source); + CMakeBuildConfiguration(ProjectExplorer::Target *parent, CMakeBuildConfiguration *source); virtual bool fromMap(const QVariantMap &map); private: @@ -86,15 +84,18 @@ public: CMakeBuildConfigurationFactory(QObject *parent = 0); ~CMakeBuildConfigurationFactory(); - QList<Core::Id> availableCreationIds(ProjectExplorer::Target *parent) const; + QList<Core::Id> availableCreationIds(const ProjectExplorer::Target *parent) const; QString displayNameForId(const Core::Id id) const; - bool canCreate(ProjectExplorer::Target *parent, const Core::Id id) const; - CMakeBuildConfiguration *create(ProjectExplorer::Target *parent, const Core::Id id); - bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) 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(ProjectExplorer::Target *parent, const QVariantMap &map) const; + bool canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const; CMakeBuildConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map); + +private: + bool canHandle(const ProjectExplorer::Target *t) const; }; } // namespace Internal diff --git a/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp b/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp index 50cdf33bf3e..03f2a90cc2f 100644 --- a/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp +++ b/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp @@ -31,12 +31,12 @@ **************************************************************************/ #include "cmakelocatorfilter.h" -#include "cmaketarget.h" #include "cmakeproject.h" #include "makestep.h" #include <projectexplorer/projectexplorer.h> #include <projectexplorer/session.h> +#include <projectexplorer/target.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/buildsteplist.h> diff --git a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp index c21b5a45593..d4461b54e50 100644 --- a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp @@ -34,7 +34,8 @@ #include "cmakeprojectmanager.h" #include <utils/pathchooser.h> -#include <projectexplorer/toolchainmanager.h> +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/profilemanager.h> #include <projectexplorer/toolchain.h> #include <projectexplorer/abi.h> #include <texteditor/fontsettings.h> @@ -65,8 +66,7 @@ CMakeOpenProjectWizard::CMakeOpenProjectWizard(CMakeManager *cmakeManager, const : m_cmakeManager(cmakeManager), m_sourceDirectory(sourceDirectory), m_creatingCbpFiles(false), - m_environment(env), - m_toolChain(0) + m_environment(env) { int startid; if (hasInSourceBuild()) { @@ -98,8 +98,7 @@ CMakeOpenProjectWizard::CMakeOpenProjectWizard(CMakeManager *cmakeManager, const : m_cmakeManager(cmakeManager), m_sourceDirectory(sourceDirectory), m_creatingCbpFiles(true), - m_environment(env), - m_toolChain(0) + m_environment(env) { CMakeRunPage::Mode rmode; @@ -119,8 +118,7 @@ CMakeOpenProjectWizard::CMakeOpenProjectWizard(CMakeManager *cmakeManager, const : m_cmakeManager(cmakeManager), m_sourceDirectory(sourceDirectory), m_creatingCbpFiles(true), - m_environment(env), - m_toolChain(0) + m_environment(env) { m_buildDirectory = oldBuildDirectory; addPage(new ShadowBuildPage(this, true)); @@ -200,17 +198,6 @@ void CMakeOpenProjectWizard::setArguments(const QString &args) m_arguments = args; } -ProjectExplorer::ToolChain *CMakeOpenProjectWizard::toolChain() const -{ - return m_toolChain; -} - -void CMakeOpenProjectWizard::setToolChain(ProjectExplorer::ToolChain *tc) -{ - m_toolChain = tc; -} - - Utils::Environment CMakeOpenProjectWizard::environment() const { return m_environment; @@ -414,51 +401,50 @@ void CMakeRunPage::initializePage() Q_UNUSED(cmakeCxxCompiler); m_generatorComboBox->clear(); bool hasCodeBlocksGenerator = m_cmakeWizard->cmakeManager()->hasCodeBlocksMsvcGenerator(); - ProjectExplorer::Abi abi = ProjectExplorer::Abi::hostAbi(); - abi = ProjectExplorer::Abi(abi.architecture(), abi.os(), ProjectExplorer::Abi::UnknownFlavor, - abi.binaryFormat(), 0); - QList<ProjectExplorer::ToolChain *> tcs = - ProjectExplorer::ToolChainManager::instance()->findToolChains(abi); - foreach (ProjectExplorer::ToolChain *tc, tcs) { + QList<ProjectExplorer::Profile *> profileList = + ProjectExplorer::ProfileManager::instance()->profiles(); + + foreach (ProjectExplorer::Profile *p, profileList) { + QVariant profileVariant = qVariantFromValue(static_cast<void *>(p)); + + ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(p); ProjectExplorer::Abi targetAbi = tc->targetAbi(); - QVariant tcVariant = qVariantFromValue(static_cast<void *>(tc)); if (targetAbi.os() == ProjectExplorer::Abi::WindowsOS) { if (targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2005Flavor || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2008Flavor || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2010Flavor) { if (hasCodeBlocksGenerator && (cachedGenerator.isEmpty() || cachedGenerator == "NMake Makefiles")) - m_generatorComboBox->addItem(tr("NMake Generator (%1)").arg(tc->displayName()), tcVariant); + m_generatorComboBox->addItem(tr("NMake Generator (%1)").arg(p->displayName()), profileVariant); } else if (targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMSysFlavor) { if (cachedGenerator.isEmpty() || cachedGenerator == "MinGW Makefiles") - m_generatorComboBox->addItem(tr("MinGW Generator (%1)").arg(tc->displayName()), tcVariant); + m_generatorComboBox->addItem(tr("MinGW Generator (%1)").arg(p->displayName()), profileVariant); } } else { // Non windows if (cachedGenerator.isEmpty() || cachedGenerator == "Unix Makefiles") - m_generatorComboBox->addItem(tr("Unix Generator (%1)").arg(tc->displayName()), tcVariant); + m_generatorComboBox->addItem(tr("Unix Generator (%1)").arg(p->displayName()), profileVariant); } } } void CMakeRunPage::runCMake() { - if (m_cmakeExecutable) { + if (m_cmakeExecutable) // We asked the user for the cmake executable m_cmakeWizard->cmakeManager()->setCMakeExecutable(m_cmakeExecutable->path()); - } int index = m_generatorComboBox->currentIndex(); - ProjectExplorer::ToolChain *tc = 0; + ProjectExplorer::Profile *p = 0; if (index >= 0) - tc = static_cast<ProjectExplorer::ToolChain *>(m_generatorComboBox->itemData(index).value<void *>()); - if (!tc) { + p = static_cast<ProjectExplorer::Profile *>(m_generatorComboBox->itemData(index).value<void *>()); + if (!p) { m_output->appendPlainText(tr("No generator selected.")); return; } - m_cmakeWizard->setToolChain(tc); + ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(p); m_runCMake->setEnabled(false); m_argumentsLineEdit->setEnabled(false); @@ -473,12 +459,9 @@ void CMakeRunPage::runCMake() generator = QLatin1String("-GCodeBlocks - NMake Makefiles"); } - Utils::Environment env = m_cmakeWizard->environment(); tc->addToEnvironment(env); - - m_output->clear(); if (m_cmakeWizard->cmakeManager()->isCMakeExecutableValid()) { diff --git a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.h b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.h index 5a0984de77d..2118649e151 100644 --- a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.h +++ b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.h @@ -90,8 +90,6 @@ public: CMakeManager *cmakeManager() const; QString arguments() const; void setArguments(const QString &args); - ProjectExplorer::ToolChain *toolChain() const; - void setToolChain(ProjectExplorer::ToolChain *); Utils::Environment environment() const; bool existsUpToDateXmlFile() const; @@ -104,7 +102,6 @@ private: QString m_arguments; bool m_creatingCbpFiles; Utils::Environment m_environment; - ProjectExplorer::ToolChain *m_toolChain; }; class InSourceBuildPage : public QWizardPage diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 1e2b642a400..8423f85d335 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -31,10 +31,11 @@ **************************************************************************/ #include "cmakeproject.h" + +#include "cmakebuildconfiguration.h" #include "cmakeprojectconstants.h" #include "cmakeprojectnodes.h" #include "cmakerunconfiguration.h" -#include "cmaketarget.h" #include "makestep.h" #include "cmakeopenprojectwizard.h" #include "cmakebuildconfiguration.h" @@ -46,7 +47,11 @@ #include <projectexplorer/buildenvironmentwidget.h> #include <projectexplorer/buildsteplist.h> #include <projectexplorer/buildmanager.h> +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/profilemanager.h> #include <projectexplorer/toolchain.h> +#include <projectexplorer/target.h> +#include <qtsupport/customexecutablerunconfiguration.h> #include <cpptools/ModelManagerInterface.h> #include <extensionsystem/pluginmanager.h> #include <utils/qtcassert.h> @@ -107,6 +112,8 @@ CMakeProject::CMakeProject(CMakeManager *manager, const QString &fileName) connect(this, SIGNAL(addedTarget(ProjectExplorer::Target*)), SLOT(targetAdded(ProjectExplorer::Target*))); + connect(this, SIGNAL(buildDirectoryChanged()), + this, SLOT(triggerBuildSystemEvaluation())); } CMakeProject::~CMakeProject() @@ -130,7 +137,7 @@ void CMakeProject::fileChanged(const QString &fileName) { Q_UNUSED(fileName) - parseCMakeLists(); + evaluateBuildSystem(); } void CMakeProject::changeActiveBuildConfiguration(ProjectExplorer::BuildConfiguration *bc) @@ -168,7 +175,7 @@ void CMakeProject::changeActiveBuildConfiguration(ProjectExplorer::BuildConfigur copw.exec(); } // reparse - parseCMakeLists(); + evaluateBuildSystem(); } void CMakeProject::targetAdded(ProjectExplorer::Target *t) @@ -183,7 +190,7 @@ void CMakeProject::targetAdded(ProjectExplorer::Target *t) void CMakeProject::changeBuildDirectory(CMakeBuildConfiguration *bc, const QString &newBuildDirectory) { bc->setBuildDirectory(newBuildDirectory); - parseCMakeLists(); + evaluateBuildSystem(); } QString CMakeProject::defaultBuildDirectory() const @@ -191,23 +198,31 @@ QString CMakeProject::defaultBuildDirectory() const return projectDirectory() + QLatin1String("/qtcreator-build"); } -bool CMakeProject::parseCMakeLists() +void CMakeProject::evaluateBuildSystem() { if (!activeTarget() || - !activeTarget()->activeBuildConfiguration()) - return false; + !activeTarget()->activeBuildConfiguration()) { + buildSystemEvaluationFinished(false); + return; + } + + CMakeBuildConfiguration *activeBC = qobject_cast<CMakeBuildConfiguration *>(activeTarget()->activeBuildConfiguration()); + if (!activeBC) { + buildSystemEvaluationFinished(false); + return; + } foreach (Core::IEditor *editor, Core::EditorManager::instance()->openedEditors()) if (isProjectFile(editor->document()->fileName())) editor->document()->infoBar()->removeInfo(QLatin1String("CMakeEditor.RunCMake")); // Find cbp file - CMakeBuildConfiguration *activeBC = activeTarget()->activeBuildConfiguration(); QString cbpFile = CMakeManager::findCbpFile(activeBC->buildDirectory()); if (cbpFile.isEmpty()) { emit buildTargetsChanged(); - return false; + buildSystemEvaluationFinished(true); + return; } // setFolderName @@ -218,7 +233,8 @@ bool CMakeProject::parseCMakeLists() if (!cbpparser.parseCbpFile(cbpFile)) { // TODO report error emit buildTargetsChanged(); - return false; + buildSystemEvaluationFinished(true); + return; } foreach (const QString &file, m_watcher->files()) @@ -228,8 +244,6 @@ bool CMakeProject::parseCMakeLists() // how can we ensure that it is completely written? m_watcher->addPath(cbpFile); - // ToolChain - // activeBC->updateToolChain(cbpparser.compilerName()); m_projectName = cbpparser.projectName(); m_rootNode->setDisplayName(cbpparser.projectName()); @@ -285,22 +299,24 @@ bool CMakeProject::parseCMakeLists() createUiCodeModelSupport(); - if (!activeBC->toolChain()) - return true; + ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(activeTarget()->profile()); + if (!tc) { + buildSystemEvaluationFinished(true); + return; + } QStringList allIncludePaths; // This explicitly adds -I. to the include paths allIncludePaths.append(projectDirectory()); allIncludePaths.append(cbpparser.includeFiles()); - QByteArray allDefines; - allDefines.append(activeBC->toolChain()->predefinedMacros(QStringList())); - allDefines.append(cbpparser.defines()); + QByteArray allDefines; + allDefines.append(tc->predefinedMacros(QStringList())); + allDefines.append(cbpparser.defines()); QStringList allFrameworkPaths; QList<ProjectExplorer::HeaderPath> allHeaderPaths; - if (activeBC->toolChain()) - allHeaderPaths = activeBC->toolChain()->systemHeaderPaths(); + allHeaderPaths = tc->systemHeaderPaths(); foreach (const ProjectExplorer::HeaderPath &headerPath, allHeaderPaths) { if (headerPath.kind() == ProjectExplorer::HeaderPath::FrameworkHeaderPath) allFrameworkPaths.append(headerPath.path()); @@ -333,7 +349,8 @@ bool CMakeProject::parseCMakeLists() } emit buildTargetsChanged(); emit fileListChanged(); - return true; + + buildSystemEvaluationFinished(true); } bool CMakeProject::isProjectFile(const QString &fileName) @@ -501,11 +518,6 @@ CMakeManager *CMakeProject::projectManager() const return m_manager; } -CMakeTarget *CMakeProject::activeTarget() const -{ - return static_cast<CMakeTarget *>(Project::activeTarget()); -} - QList<ProjectExplorer::BuildConfigWidget*> CMakeProject::subConfigWidgets() { QList<ProjectExplorer::BuildConfigWidget*> list; @@ -530,74 +542,49 @@ bool CMakeProject::fromMap(const QVariantMap &map) if (!Project::fromMap(map)) return false; - bool hasUserFile = activeTarget(); - if (!hasUserFile) { - CMakeTargetFactory *factory = - ExtensionSystem::PluginManager::getObject<CMakeTargetFactory>(); - CMakeTarget *t = factory->create(this, Core::Id(DEFAULT_CMAKE_TARGET_ID)); + if (!activeTarget()) + addTarget(createTarget(ProfileManager::instance()->defaultProfile())); - Q_ASSERT(t); - Q_ASSERT(t->activeBuildConfiguration()); + // We have a user file, but we could still be missing the cbp file + // or simply run createXml with the saved settings + QFileInfo sourceFileInfo(m_fileName); + CMakeBuildConfiguration *activeBC = qobject_cast<CMakeBuildConfiguration *>(activeTarget()->activeBuildConfiguration()); + if (!activeBC) + return false; + QString cbpFile = CMakeManager::findCbpFile(QDir(activeBC->buildDirectory())); + QFileInfo cbpFileFi(cbpFile); - // Ask the user for where he wants to build it - // and the cmake command line + CMakeOpenProjectWizard::Mode mode = CMakeOpenProjectWizard::Nothing; + if (!cbpFileFi.exists()) + mode = CMakeOpenProjectWizard::NeedToCreate; + else if (cbpFileFi.lastModified() < sourceFileInfo.lastModified()) + mode = CMakeOpenProjectWizard::NeedToUpdate; - CMakeOpenProjectWizard copw(m_manager, projectDirectory(), Utils::Environment::systemEnvironment()); + if (mode != CMakeOpenProjectWizard::Nothing) { + CMakeOpenProjectWizard copw(m_manager, + sourceFileInfo.absolutePath(), + activeBC->buildDirectory(), + mode, + activeBC->environment()); if (copw.exec() != QDialog::Accepted) return false; - - CMakeBuildConfiguration *bc = - static_cast<CMakeBuildConfiguration *>(t->buildConfigurations().at(0)); - if (!copw.buildDirectory().isEmpty()) - bc->setBuildDirectory(copw.buildDirectory()); - bc->setToolChain(copw.toolChain()); - - addTarget(t); - } else { - // We have a user file, but we could still be missing the cbp file - // or simply run createXml with the saved settings - QFileInfo sourceFileInfo(m_fileName); - CMakeBuildConfiguration *activeBC = activeTarget()->activeBuildConfiguration(); - QString cbpFile = CMakeManager::findCbpFile(QDir(activeBC->buildDirectory())); - QFileInfo cbpFileFi(cbpFile); - - CMakeOpenProjectWizard::Mode mode = CMakeOpenProjectWizard::Nothing; - if (!cbpFileFi.exists()) - mode = CMakeOpenProjectWizard::NeedToCreate; - else if (cbpFileFi.lastModified() < sourceFileInfo.lastModified()) - mode = CMakeOpenProjectWizard::NeedToUpdate; - - if (mode != CMakeOpenProjectWizard::Nothing) { - CMakeOpenProjectWizard copw(m_manager, - sourceFileInfo.absolutePath(), - activeBC->buildDirectory(), - mode, - activeBC->environment()); - if (copw.exec() != QDialog::Accepted) - return false; - activeBC->setToolChain(copw.toolChain()); - } } m_watcher = new QFileSystemWatcher(this); connect(m_watcher, SIGNAL(fileChanged(QString)), this, SLOT(fileChanged(QString))); - if (!parseCMakeLists()) // Gets the directory from the active buildconfiguration - return false; + triggerBuildSystemEvaluation(); - if (!hasUserFile && hasBuildTarget("all")) { + if (hasBuildTarget("all")) { MakeStep *makeStep = qobject_cast<MakeStep *>( activeTarget()->activeBuildConfiguration()->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD)->at(0)); Q_ASSERT(makeStep); makeStep->setBuildTarget("all", true); } - foreach (Target *t, targets()) { + foreach (Target *t, targets()) connect(t, SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), this, SLOT(changeActiveBuildConfiguration(ProjectExplorer::BuildConfiguration*))); - connect(t, SIGNAL(environmentChanged()), - this, SLOT(changeEnvironment())); - } connect(Core::EditorManager::instance(), SIGNAL(editorAboutToClose(Core::IEditor*)), this, SLOT(editorAboutToClose(Core::IEditor*))); @@ -817,8 +804,7 @@ bool CMakeFile::reload(QString *errorString, ReloadFlag flag, ChangeType type) return true; } -CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeTarget *target) - : m_target(target), m_buildConfiguration(0) +CMakeBuildSettingsWidget::CMakeBuildSettingsWidget() : m_buildConfiguration(0) { QFormLayout *fl = new QFormLayout(this); fl->setContentsMargins(20, -1, 0, -1); @@ -853,7 +839,7 @@ void CMakeBuildSettingsWidget::init(BuildConfiguration *bc) { m_buildConfiguration = static_cast<CMakeBuildConfiguration *>(bc); m_pathLineEdit->setText(m_buildConfiguration->buildDirectory()); - if (m_buildConfiguration->buildDirectory() == m_target->cmakeProject()->projectDirectory()) + if (m_buildConfiguration->buildDirectory() == bc->target()->project()->projectDirectory()) m_changeButton->setEnabled(false); else m_changeButton->setEnabled(true); @@ -861,7 +847,9 @@ void CMakeBuildSettingsWidget::init(BuildConfiguration *bc) void CMakeBuildSettingsWidget::openChangeBuildDirectoryDialog() { - CMakeProject *project = m_target->cmakeProject(); + CMakeProject *project = qobject_cast<CMakeProject *>(m_buildConfiguration->target()->project()); + if (!project) + return; CMakeOpenProjectWizard copw(project->projectManager(), project->projectDirectory(), m_buildConfiguration->buildDirectory(), @@ -875,15 +863,16 @@ void CMakeBuildSettingsWidget::openChangeBuildDirectoryDialog() void CMakeBuildSettingsWidget::runCMake() { // TODO skip build directory - CMakeProject *project = m_target->cmakeProject(); + CMakeProject *project = qobject_cast<CMakeProject *>(m_buildConfiguration->target()->project()); + if (!project) + return; CMakeOpenProjectWizard copw(project->projectManager(), project->projectDirectory(), m_buildConfiguration->buildDirectory(), CMakeOpenProjectWizard::WantToUpdate, m_buildConfiguration->environment()); - if (copw.exec() == QDialog::Accepted) { - project->parseCMakeLists(); - } + if (copw.exec() == QDialog::Accepted) + project->evaluateBuildSystem(); } ///// diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h index 6166a348b24..88f8933fd83 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.h +++ b/src/plugins/cmakeprojectmanager/cmakeproject.h @@ -36,7 +36,6 @@ #include "cmakeprojectmanager.h" #include "cmakeprojectnodes.h" #include "cmakebuildconfiguration.h" -#include "cmaketarget.h" #include "makestep.h" #include <projectexplorer/project.h> @@ -87,8 +86,6 @@ public: Core::IDocument *document() const; CMakeManager *projectManager() const; - CMakeTarget *activeTarget() const; - QList<ProjectExplorer::BuildConfigWidget*> subConfigWidgets(); ProjectExplorer::ProjectNode *rootProjectNode() const; @@ -102,12 +99,12 @@ public: QString defaultBuildDirectory() const; - bool parseCMakeLists(); QString uicCommand() const; bool isProjectFile(const QString &fileName); + signals: /// emitted after parsing void buildTargetsChanged(); @@ -128,12 +125,15 @@ private slots: void uiEditorContentsChanged(); void buildStateChanged(ProjectExplorer::Project *project); private: + void evaluateBuildSystem(); + void buildTree(CMakeProjectNode *rootNode, QList<ProjectExplorer::FileNode *> list); void gatherFileNodes(ProjectExplorer::FolderNode *parent, QList<ProjectExplorer::FileNode *> &list); ProjectExplorer::FolderNode *findOrCreateFolder(CMakeProjectNode *rootNode, QString directory); void updateCodeModelSupportFromEditor(const QString &uiFileName, const QString &contents); void createUiCodeModelSupport(); QString uiHeaderFile(const QString &uiFile); + void updateRunConfigurations(ProjectExplorer::Target *t); CMakeManager *m_manager; QString m_fileName; @@ -228,16 +228,16 @@ class CMakeBuildSettingsWidget : public ProjectExplorer::BuildConfigWidget { Q_OBJECT public: - explicit CMakeBuildSettingsWidget(CMakeTarget *target); + CMakeBuildSettingsWidget(); QString displayName() const; // This is called to set up the config widget before showing it - virtual void init(ProjectExplorer::BuildConfiguration *bc); + void init(ProjectExplorer::BuildConfiguration *bc); + private slots: void openChangeBuildDirectoryDialog(); void runCMake(); private: - CMakeTarget *m_target; QLineEdit *m_pathLineEdit; QPushButton *m_changeButton; CMakeBuildConfiguration *m_buildConfiguration; diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp index e6b81c209b4..7384153647f 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp @@ -45,6 +45,7 @@ #include <coreplugin/actionmanager/actioncontainer.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorer.h> +#include <projectexplorer/target.h> #include <utils/QtConcurrentTools> #include <QtConcurrentRun> #include <QCoreApplication> @@ -114,22 +115,21 @@ void CMakeManager::runCMake(ProjectExplorer::Project *project) if (!project) return; CMakeProject *cmakeProject = qobject_cast<CMakeProject *>(project); - if (!cmakeProject) + if (!cmakeProject || !cmakeProject->activeTarget() || !cmakeProject->activeTarget()->activeBuildConfiguration()) return; - if (!cmakeProject->activeTarget()) + CMakeBuildConfiguration *bc + = qobject_cast<CMakeBuildConfiguration *>(cmakeProject->activeTarget()->activeBuildConfiguration()); + if (!bc) return; - if (!cmakeProject->activeTarget()->activeBuildConfiguration()) - return; - CMakeBuildConfiguration *bc = cmakeProject->activeTarget()->activeBuildConfiguration(); + CMakeOpenProjectWizard copw(this, cmakeProject->projectDirectory(), bc->buildDirectory(), CMakeOpenProjectWizard::WantToUpdate, bc->environment()); - if (copw.exec() == QDialog::Accepted) { - cmakeProject->parseCMakeLists(); - } + if (copw.exec() == QDialog::Accepted) + cmakeProject->triggerBuildSystemEvaluation(); } ProjectExplorer::Project *CMakeManager::openProject(const QString &fileName, QString *errorString) diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro index d1c2914899a..b0b516944d7 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro @@ -9,7 +9,6 @@ HEADERS = cmakeproject.h \ cmakeprojectmanager.h \ cmakeprojectconstants.h \ cmakeprojectnodes.h \ - cmaketarget.h \ makestep.h \ cmakerunconfiguration.h \ cmakeopenprojectwizard.h \ @@ -24,7 +23,6 @@ SOURCES = cmakeproject.cpp \ cmakeprojectplugin.cpp \ cmakeprojectmanager.cpp \ cmakeprojectnodes.cpp \ - cmaketarget.cpp \ makestep.cpp \ cmakerunconfiguration.cpp \ cmakeopenprojectwizard.cpp \ diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs index e0e8b6c0e76..541176d66a3 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs @@ -48,8 +48,6 @@ QtcPlugin { "cmakeprojectplugin.h", "cmakerunconfiguration.cpp", "cmakerunconfiguration.h", - "cmaketarget.cpp", - "cmaketarget.h", "cmakeuicodemodelsupport.cpp", "cmakeuicodemodelsupport.h", "makestep.cpp", diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp index 46b1db69d93..1d9614a9a80 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp @@ -32,11 +32,11 @@ #include "cmakeprojectplugin.h" #include "cmakeprojectmanager.h" +#include "cmakebuildconfiguration.h" #include "cmakerunconfiguration.h" #include "cmakeeditorfactory.h" #include "makestep.h" #include "cmakeprojectconstants.h" -#include "cmaketarget.h" #include "cmakelocatorfilter.h" #include <coreplugin/icore.h> @@ -67,9 +67,9 @@ bool CMakeProjectPlugin::initialize(const QStringList & /*arguments*/, QString * addAutoReleasedObject(manager); addAutoReleasedObject(new MakeStepFactory); addAutoReleasedObject(new CMakeRunConfigurationFactory); + addAutoReleasedObject(new CMakeBuildConfigurationFactory); addAutoReleasedObject(new CMakeEditorFactory(manager)); - addAutoReleasedObject(new CMakeTargetFactory); addAutoReleasedObject(new CMakeLocatorFilter); return true; diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp index 1f3f2f1c8df..6fdd343cb06 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp @@ -35,12 +35,12 @@ #include "cmakebuildconfiguration.h" #include "cmakeproject.h" #include "cmakeprojectconstants.h" -#include "cmaketarget.h" #include <coreplugin/coreconstants.h> #include <coreplugin/helpmanager.h> #include <qtsupport/debugginghelper.h> #include <projectexplorer/environmentwidget.h> +#include <projectexplorer/target.h> #include <utils/pathchooser.h> #include <utils/detailswidget.h> @@ -60,7 +60,6 @@ using namespace CMakeProjectManager; using namespace CMakeProjectManager::Internal; namespace { -const char CMAKE_RC_ID[] = "CMakeProjectManager.CMakeRunConfiguration"; const char CMAKE_RC_PREFIX[] = "CMakeProjectManager.CMakeRunConfiguration."; const char USER_WORKING_DIRECTORY_KEY[] = "CMakeProjectManager.CMakeRunConfiguration.UserWorkingDirectory"; @@ -86,8 +85,9 @@ Core::Id idFromBuildTarget(const QString &target) } // namespace -CMakeRunConfiguration::CMakeRunConfiguration(CMakeTarget *parent, const QString &target, const QString &workingDirectory, const QString &title) : - ProjectExplorer::LocalApplicationRunConfiguration(parent, Core::Id(CMAKE_RC_PREFIX)), +CMakeRunConfiguration::CMakeRunConfiguration(ProjectExplorer::Target *parent, Core::Id id, const QString &target, + const QString &workingDirectory, const QString &title) : + ProjectExplorer::LocalApplicationRunConfiguration(parent, id), m_runMode(Gui), m_buildTarget(target), m_workingDirectory(workingDirectory), @@ -98,7 +98,7 @@ CMakeRunConfiguration::CMakeRunConfiguration(CMakeTarget *parent, const QString ctor(); } -CMakeRunConfiguration::CMakeRunConfiguration(CMakeTarget *parent, CMakeRunConfiguration *source) : +CMakeRunConfiguration::CMakeRunConfiguration(ProjectExplorer::Target *parent, CMakeRunConfiguration *source) : ProjectExplorer::LocalApplicationRunConfiguration(parent, source), m_runMode(source->m_runMode), m_buildTarget(source->m_buildTarget), @@ -122,14 +122,9 @@ void CMakeRunConfiguration::ctor() setDefaultDisplayName(defaultDisplayName()); } -CMakeTarget *CMakeRunConfiguration::cmakeTarget() const +ProjectExplorer::BuildConfiguration *CMakeRunConfiguration::activeBuildConfiguration() const { - return static_cast<CMakeTarget *>(target()); -} - -CMakeBuildConfiguration *CMakeRunConfiguration::activeBuildConfiguration() const -{ - return cmakeTarget()->activeBuildConfiguration(); + return target()->activeBuildConfiguration(); } QString CMakeRunConfiguration::executable() const @@ -496,8 +491,7 @@ void CMakeRunConfigurationWidget::setArguments(const QString &args) // Factory CMakeRunConfigurationFactory::CMakeRunConfigurationFactory(QObject *parent) : ProjectExplorer::IRunConfigurationFactory(parent) -{ -} +{ setObjectName(QLatin1String("CMakeRunConfigurationFactory")); } CMakeRunConfigurationFactory::~CMakeRunConfigurationFactory() { @@ -506,11 +500,11 @@ CMakeRunConfigurationFactory::~CMakeRunConfigurationFactory() // used to show the list of possible additons to a project, returns a list of ids QList<Core::Id> CMakeRunConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const { - CMakeTarget *t(qobject_cast<CMakeTarget *>(parent)); - if (!t) + CMakeProject *project = qobject_cast<CMakeProject *>(parent->project()); + if (!canHandle(parent)) return QList<Core::Id>(); QList<Core::Id> allIds; - foreach (const QString &buildTarget, t->cmakeProject()->buildTargetTitles()) + foreach (const QString &buildTarget, project->buildTargetTitles()) allIds << idFromBuildTarget(buildTarget); return allIds; } @@ -521,12 +515,19 @@ QString CMakeRunConfigurationFactory::displayNameForId(const Core::Id id) const return buildTargetFromId(id); } +bool CMakeRunConfigurationFactory::canHandle(ProjectExplorer::Target *parent) const +{ + if (!parent->project()->supportsProfile(parent->profile())) + return false; + return qobject_cast<CMakeProject *>(parent->project()); +} + bool CMakeRunConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const Core::Id id) const { - CMakeTarget *t(qobject_cast<CMakeTarget *>(parent)); - if (!t) + if (!canHandle(parent)) return false; - return t->cmakeProject()->hasBuildTarget(buildTargetFromId(id)); + CMakeProject *project = static_cast<CMakeProject *>(parent->project()); + return project->hasBuildTarget(buildTargetFromId(id)); } ProjectExplorer::RunConfiguration *CMakeRunConfigurationFactory::create(ProjectExplorer::Target *parent, @@ -534,43 +535,41 @@ ProjectExplorer::RunConfiguration *CMakeRunConfigurationFactory::create(ProjectE { if (!canCreate(parent, id)) return 0; - CMakeTarget *t(static_cast<CMakeTarget *>(parent)); - + CMakeProject *project = static_cast<CMakeProject *>(parent->project()); const QString title(buildTargetFromId(id)); - const CMakeBuildTarget &ct = t->cmakeProject()->buildTargetForTitle(title); - return new CMakeRunConfiguration(t, ct.executable, ct.workingDirectory, ct.title); + const CMakeBuildTarget &ct = project->buildTargetForTitle(title); + return new CMakeRunConfiguration(parent, id, ct.executable, ct.workingDirectory, ct.title); } bool CMakeRunConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source) const { - if (!qobject_cast<CMakeTarget *>(parent)) + if (!canHandle(parent)) return false; - return source->id() == Core::Id(CMAKE_RC_ID); + return source->id().toString().startsWith(QLatin1String(CMAKE_RC_PREFIX)); } ProjectExplorer::RunConfiguration *CMakeRunConfigurationFactory::clone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration * source) { if (!canClone(parent, source)) return 0; - CMakeTarget *t(static_cast<CMakeTarget *>(parent)); CMakeRunConfiguration *crc(static_cast<CMakeRunConfiguration *>(source)); - return new CMakeRunConfiguration(t, crc); + return new CMakeRunConfiguration(parent, crc); } bool CMakeRunConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const { - if (!qobject_cast<CMakeTarget *>(parent)) + if (!qobject_cast<CMakeProject *>(parent->project())) return false; QString id = QString::fromUtf8(ProjectExplorer::idFromMap(map).name()); - return id.startsWith(QLatin1String(CMAKE_RC_ID)); + return id.startsWith(QLatin1String(CMAKE_RC_PREFIX)); } ProjectExplorer::RunConfiguration *CMakeRunConfigurationFactory::restore(ProjectExplorer::Target *parent, const QVariantMap &map) { if (!canRestore(parent, map)) return 0; - CMakeTarget *t(static_cast<CMakeTarget *>(parent)); - CMakeRunConfiguration *rc(new CMakeRunConfiguration(t, QString(), QString(), QString())); + CMakeRunConfiguration *rc(new CMakeRunConfiguration(parent, ProjectExplorer::idFromMap(map), + QString(), QString(), QString())); if (rc->fromMap(map)) return rc; delete rc; diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h index bf64aa36919..5d5d81816f3 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h @@ -62,12 +62,11 @@ class CMakeRunConfiguration : public ProjectExplorer::LocalApplicationRunConfigu friend class CMakeRunConfigurationFactory; public: - CMakeRunConfiguration(CMakeTarget *parent, const QString &target, + CMakeRunConfiguration(ProjectExplorer::Target *parent, Core::Id id, const QString &target, const QString &workingDirectory, const QString &title); ~CMakeRunConfiguration(); - CMakeTarget *cmakeTarget() const; - CMakeBuildConfiguration *activeBuildConfiguration() const; + ProjectExplorer::BuildConfiguration *activeBuildConfiguration() const; QString executable() const; RunMode runMode() const; @@ -101,7 +100,7 @@ private slots: void setCommandLineArguments(const QString &newText); protected: - CMakeRunConfiguration(CMakeTarget *parent, CMakeRunConfiguration *source); + CMakeRunConfiguration(ProjectExplorer::Target *parent, CMakeRunConfiguration *source); virtual bool fromMap(const QVariantMap &map); QString defaultDisplayName() const; @@ -177,6 +176,8 @@ public: QList<Core::Id> availableCreationIds(ProjectExplorer::Target *parent) const; QString displayNameForId(const Core::Id id) const; + + bool canHandle(ProjectExplorer::Target *parent) const; }; } diff --git a/src/plugins/cmakeprojectmanager/cmaketarget.cpp b/src/plugins/cmakeprojectmanager/cmaketarget.cpp deleted file mode 100644 index 97aee20fb4a..00000000000 --- a/src/plugins/cmakeprojectmanager/cmaketarget.cpp +++ /dev/null @@ -1,242 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation ([email protected]) -** -** -** GNU Lesser General Public License Usage -** -** 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, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** Other Usage -** -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** If you have questions regarding the use of this file, please contact -** Nokia at [email protected]. -** -**************************************************************************/ - -#include "cmaketarget.h" - -#include "cmakeproject.h" -#include "cmakerunconfiguration.h" -#include "cmakebuildconfiguration.h" - -#include <projectexplorer/buildsteplist.h> -#include <projectexplorer/deployconfiguration.h> -#include <projectexplorer/projectexplorerconstants.h> -#include <qtsupport/customexecutablerunconfiguration.h> - -#include <QApplication> -#include <QStyle> - -using namespace CMakeProjectManager; -using namespace CMakeProjectManager::Internal; - -namespace { - -QString displayNameForId(const Core::Id id) { - if (id == Core::Id(DEFAULT_CMAKE_TARGET_ID)) - return QApplication::translate("CMakeProjectManager::Internal::CMakeTarget", "Desktop", "CMake Default target display name"); - return QString(); -} - -} // namespace - -// ------------------------------------------------------------------------- -// CMakeTarget -// ------------------------------------------------------------------------- - -CMakeTarget::CMakeTarget(CMakeProject *parent) : - ProjectExplorer::Target(parent, Core::Id(DEFAULT_CMAKE_TARGET_ID)), - m_buildConfigurationFactory(new CMakeBuildConfigurationFactory(this)) -{ - setDefaultDisplayName(displayNameForId(id())); - setIcon(qApp->style()->standardIcon(QStyle::SP_ComputerIcon)); - connect(parent, SIGNAL(buildTargetsChanged()), SLOT(updateRunConfigurations())); -} - -CMakeTarget::~CMakeTarget() -{ -} - -CMakeProject *CMakeTarget::cmakeProject() const -{ - return static_cast<CMakeProject *>(project()); -} - -ProjectExplorer::BuildConfigWidget *CMakeTarget::createConfigWidget() -{ - return new CMakeBuildSettingsWidget(this); -} - -bool CMakeTargetFactory::supportsTargetId(const Core::Id id) const -{ - return id == Core::Id(DEFAULT_CMAKE_TARGET_ID); -} - -CMakeBuildConfiguration *CMakeTarget::activeBuildConfiguration() const -{ - return static_cast<CMakeBuildConfiguration *>(Target::activeBuildConfiguration()); -} - -CMakeBuildConfigurationFactory *CMakeTarget::buildConfigurationFactory() const -{ - return m_buildConfigurationFactory; -} - -QString CMakeTarget::defaultBuildDirectory() const -{ - return cmakeProject()->defaultBuildDirectory(); -} - -bool CMakeTarget::fromMap(const QVariantMap &map) -{ - return Target::fromMap(map); -} - -void CMakeTarget::updateRunConfigurations() -{ - // *Update* runconfigurations: - QMultiMap<QString, CMakeRunConfiguration*> existingRunConfigurations; - QList<ProjectExplorer::RunConfiguration *> toRemove; - foreach (ProjectExplorer::RunConfiguration* rc, runConfigurations()) { - if (CMakeRunConfiguration* cmakeRC = qobject_cast<CMakeRunConfiguration *>(rc)) - existingRunConfigurations.insert(cmakeRC->title(), cmakeRC); - QtSupport::CustomExecutableRunConfiguration *ceRC = - qobject_cast<QtSupport::CustomExecutableRunConfiguration *>(rc); - if (ceRC && !ceRC->isConfigured()) - toRemove << rc; - } - - foreach (const CMakeBuildTarget &ct, cmakeProject()->buildTargets()) { - if (ct.library) - continue; - if (ct.executable.isEmpty()) - continue; - if (ct.title.endsWith("/fast")) - continue; - QList<CMakeRunConfiguration *> list = existingRunConfigurations.values(ct.title); - if (!list.isEmpty()) { - // Already exists, so override the settings... - foreach (CMakeRunConfiguration *rc, list) { - rc->setExecutable(ct.executable); - rc->setBaseWorkingDirectory(ct.workingDirectory); - rc->setEnabled(true); - } - existingRunConfigurations.remove(ct.title); - } else { - // Does not exist yet - addRunConfiguration(new CMakeRunConfiguration(this, ct.executable, ct.workingDirectory, ct.title)); - } - } - QMultiMap<QString, CMakeRunConfiguration *>::const_iterator it = - existingRunConfigurations.constBegin(); - for ( ; it != existingRunConfigurations.constEnd(); ++it) { - CMakeRunConfiguration *rc = it.value(); - // The executables for those runconfigurations aren't build by the current buildconfiguration - // We just set a disable flag and show that in the display name - rc->setEnabled(false); - // removeRunConfiguration(rc); - } - - foreach (ProjectExplorer::RunConfiguration *rc, toRemove) - removeRunConfiguration(rc); - - if (runConfigurations().isEmpty()) { - // Oh no, no run configuration, - // create a custom executable run configuration - addRunConfiguration(new QtSupport::CustomExecutableRunConfiguration(this)); - } -} - -// ------------------------------------------------------------------------- -// CMakeTargetFactory -// ------------------------------------------------------------------------- - -CMakeTargetFactory::CMakeTargetFactory(QObject *parent) : - ITargetFactory(parent) -{ -} - -CMakeTargetFactory::~CMakeTargetFactory() -{ -} - -QList<Core::Id> CMakeTargetFactory::supportedTargetIds() const -{ - return QList<Core::Id>() << Core::Id(DEFAULT_CMAKE_TARGET_ID); -} -QString CMakeTargetFactory::displayNameForId(const Core::Id id) const -{ - return ::displayNameForId(id); -} - -bool CMakeTargetFactory::canCreate(ProjectExplorer::Project *parent, const Core::Id id) const -{ - if (!qobject_cast<CMakeProject *>(parent)) - return false; - return id == Core::Id(DEFAULT_CMAKE_TARGET_ID); -} - -CMakeTarget *CMakeTargetFactory::create(ProjectExplorer::Project *parent, const Core::Id id) -{ - if (!canCreate(parent, id)) - return 0; - CMakeProject *cmakeparent(static_cast<CMakeProject *>(parent)); - CMakeTarget *t(new CMakeTarget(cmakeparent)); - - // Add default build configuration: - CMakeBuildConfiguration *bc(new CMakeBuildConfiguration(t)); - bc->setDefaultDisplayName("all"); - - ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); - ProjectExplorer::BuildStepList *cleanSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); - - // Now create a standard build configuration - buildSteps->insertStep(0, new MakeStep(buildSteps)); - - MakeStep *cleanMakeStep = new MakeStep(cleanSteps); - cleanSteps->insertStep(0, cleanMakeStep); - cleanMakeStep->setAdditionalArguments("clean"); - cleanMakeStep->setClean(true); - - t->addBuildConfiguration(bc); - - t->addDeployConfiguration(t->createDeployConfiguration(ProjectExplorer::Constants::DEFAULT_DEPLOYCONFIGURATION_ID)); - - t->updateRunConfigurations(); - - return t; -} - -bool CMakeTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const -{ - return canCreate(parent, ProjectExplorer::idFromMap(map)); -} - -CMakeTarget *CMakeTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map) -{ - if (!canRestore(parent, map)) - return 0; - CMakeProject *cmakeparent(static_cast<CMakeProject *>(parent)); - CMakeTarget *t(new CMakeTarget(cmakeparent)); - if (t->fromMap(map)) - return t; - delete t; - return 0; -} diff --git a/src/plugins/cmakeprojectmanager/cmaketarget.h b/src/plugins/cmakeprojectmanager/cmaketarget.h deleted file mode 100644 index d9e44487d9a..00000000000 --- a/src/plugins/cmakeprojectmanager/cmaketarget.h +++ /dev/null @@ -1,100 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation ([email protected]) -** -** -** GNU Lesser General Public License Usage -** -** 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, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** Other Usage -** -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** If you have questions regarding the use of this file, please contact -** Nokia at [email protected]. -** -**************************************************************************/ - -#ifndef CMAKETARGET_H -#define CMAKETARGET_H - -#include "cmakebuildconfiguration.h" - -#include <projectexplorer/target.h> - -namespace CMakeProjectManager { -namespace Internal { - -const char DEFAULT_CMAKE_TARGET_ID[] = "CMakeProjectManager.DefaultCMakeTarget"; - -class CMakeBuildConfiguration; -class CMakeBuildConfigurationFactory; -class CMakeProject; -class CMakeTargetFactory; - -class CMakeTarget : public ProjectExplorer::Target -{ - Q_OBJECT - friend class CMakeTargetFactory; - -public: - CMakeTarget(CMakeProject *parent); - ~CMakeTarget(); - - ProjectExplorer::BuildConfigWidget *createConfigWidget(); - - CMakeProject *cmakeProject() const; - CMakeBuildConfiguration *activeBuildConfiguration() const; - - CMakeBuildConfigurationFactory *buildConfigurationFactory() const; - - QString defaultBuildDirectory() const; - -protected: - bool fromMap(const QVariantMap &map); - -private slots: - void updateRunConfigurations(); - -private: - CMakeBuildConfigurationFactory *m_buildConfigurationFactory; -}; - -class CMakeTargetFactory : public ProjectExplorer::ITargetFactory -{ - Q_OBJECT - -public: - CMakeTargetFactory(QObject *parent = 0); - ~CMakeTargetFactory(); - - bool supportsTargetId(const Core::Id id) const; - - QList<Core::Id> supportedTargetIds() const; - QString displayNameForId(const Core::Id id) const; - - bool canCreate(ProjectExplorer::Project *parent, const Core::Id id) const; - CMakeTarget *create(ProjectExplorer::Project *parent, const Core::Id id); - bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; - CMakeTarget *restore(ProjectExplorer::Project *parent, const QVariantMap &map); -}; - -} // namespace Internal -} // namespace CMakeProjectManager - -#endif // CMAKETARGET_H diff --git a/src/plugins/cmakeprojectmanager/cmakeuicodemodelsupport.cpp b/src/plugins/cmakeprojectmanager/cmakeuicodemodelsupport.cpp index 1a4e427cf94..b41ab0254d8 100644 --- a/src/plugins/cmakeprojectmanager/cmakeuicodemodelsupport.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeuicodemodelsupport.cpp @@ -32,10 +32,10 @@ #include "cmakeuicodemodelsupport.h" #include "cmakeproject.h" -#include "cmaketarget.h" #include "cmakebuildconfiguration.h" #include <cpptools/ModelManagerInterface.h> +#include <projectexplorer/target.h> #include <QProcess> @@ -48,14 +48,10 @@ CMakeUiCodeModelSupport::CMakeUiCodeModelSupport(CPlusPlus::CppModelManagerInter const QString &uiHeaderFile) : CppTools::UiCodeModelSupport(modelmanager, source, uiHeaderFile), m_project(project) -{ - -} +{ } CMakeUiCodeModelSupport::~CMakeUiCodeModelSupport() -{ - -} +{ } QString CMakeUiCodeModelSupport::uicCommand() const { @@ -64,6 +60,7 @@ QString CMakeUiCodeModelSupport::uicCommand() const QStringList CMakeUiCodeModelSupport::environment() const { - CMakeBuildConfiguration *bc = m_project->activeTarget()->activeBuildConfiguration(); - return bc->environment().toStringList(); + if (!m_project || !m_project->activeTarget() || !m_project->activeTarget()->activeBuildConfiguration()) + return QStringList(); + return m_project->activeTarget()->activeBuildConfiguration()->environment().toStringList(); } diff --git a/src/plugins/cmakeprojectmanager/makestep.cpp b/src/plugins/cmakeprojectmanager/makestep.cpp index a28afbd02e6..fc8f885b542 100644 --- a/src/plugins/cmakeprojectmanager/makestep.cpp +++ b/src/plugins/cmakeprojectmanager/makestep.cpp @@ -34,14 +34,16 @@ #include "cmakeprojectconstants.h" #include "cmakeproject.h" -#include "cmaketarget.h" #include "cmakebuildconfiguration.h" #include <projectexplorer/buildsteplist.h> -#include <projectexplorer/toolchain.h> -#include <projectexplorer/projectexplorer.h> +#include <projectexplorer/deployconfiguration.h> #include <projectexplorer/gnumakeparser.h> +#include <projectexplorer/profileinformation.h> +#include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/target.h> +#include <projectexplorer/toolchain.h> #include <utils/qtcprocess.h> @@ -138,19 +140,20 @@ bool MakeStep::init() setIgnoreReturnValue(m_clean); + ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(target()->profile()); ProcessParameters *pp = processParameters(); pp->setMacroExpander(bc->macroExpander()); pp->setEnvironment(bc->environment()); pp->setWorkingDirectory(bc->buildDirectory()); - if (bc->toolChain()) - pp->setCommand(bc->toolChain()->makeCommand()); + if (tc) + pp->setCommand(tc->makeCommand()); else pp->setCommand(QLatin1String("make")); pp->setArguments(arguments); setOutputParser(new ProjectExplorer::GnuMakeParser()); - if (bc->toolChain()) - appendOutputParser(bc->toolChain()->outputParser()); + if (tc) + appendOutputParser(tc->outputParser()); outputParser()->setWorkingDirectory(pp->effectiveWorkingDirectory()); return AbstractProcessStep::init(); @@ -302,7 +305,13 @@ void MakeStepConfigWidget::updateDetails() CMakeBuildConfiguration *bc = m_makeStep->cmakeBuildConfiguration(); if (!bc) bc = static_cast<CMakeBuildConfiguration *>(m_makeStep->target()->activeBuildConfiguration()); - ProjectExplorer::ToolChain *tc = bc->toolChain(); + if (!bc) { + m_summaryText = tr("<b>No build configuration found on this target.</b>"); + updateSummary(); + return; + } + + ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(m_makeStep->target()->profile()); if (tc) { QString arguments = Utils::QtcProcess::joinArgs(m_makeStep->buildTargets()); Utils::QtcProcess::addArgs(&arguments, m_makeStep->additionalArguments()); @@ -315,7 +324,7 @@ void MakeStepConfigWidget::updateDetails() param.setArguments(arguments); m_summaryText = param.summary(displayName()); } else { - m_summaryText = tr("<b>Unknown tool chain</b>"); + m_summaryText = tr("<b>No tool chain set for this target</b>"); } emit updateSummary(); } |