diff options
Diffstat (limited to 'src/plugins/cmakeprojectmanager/cmakekitinformation.cpp')
-rw-r--r-- | src/plugins/cmakeprojectmanager/cmakekitinformation.cpp | 148 |
1 files changed, 84 insertions, 64 deletions
diff --git a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp index 0e0d47cb5f..eeae05f921 100644 --- a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp +++ b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp @@ -24,16 +24,15 @@ ****************************************************************************/ #include "cmakekitinformation.h" + #include "cmakeprojectconstants.h" #include "cmakeprojectplugin.h" #include "cmakespecificsettings.h" #include "cmaketool.h" #include "cmaketoolmanager.h" -#include <app/app_version.h> #include <coreplugin/icore.h> #include <coreplugin/variablechooser.h> -#include <projectexplorer/kit.h> #include <projectexplorer/kitinformation.h> #include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorersettings.h> @@ -42,22 +41,23 @@ #include <qtsupport/baseqtversion.h> #include <qtsupport/qtkitinformation.h> #include <projectexplorer/projectexplorerconstants.h> + +#include <app/app_version.h> + #include <utils/algorithm.h> #include <utils/elidinglabel.h> #include <utils/environment.h> +#include <utils/macroexpander.h> #include <utils/qtcassert.h> #include <QComboBox> #include <QDialog> #include <QDialogButtonBox> -#include <QFileInfo> #include <QGridLayout> -#include <QLabel> #include <QLineEdit> #include <QPlainTextEdit> #include <QPointer> #include <QPushButton> -#include <QVariant> using namespace ProjectExplorer; @@ -66,10 +66,10 @@ namespace CMakeProjectManager { // CMakeKitAspect: // -------------------------------------------------------------------- -static Core::Id defaultCMakeToolId() +static Utils::Id defaultCMakeToolId() { CMakeTool *defaultTool = CMakeToolManager::defaultCMakeTool(); - return defaultTool ? defaultTool->id() : Core::Id(); + return defaultTool ? defaultTool->id() : Utils::Id(); } static const char TOOL_ID[] = "CMakeProjectManager.CMakeKitInformation"; @@ -125,10 +125,10 @@ private: m_comboBox->setCurrentIndex(tool ? indexOf(tool->id()) : -1); } - int indexOf(const Core::Id &id) + int indexOf(const Utils::Id &id) { for (int i = 0; i < m_comboBox->count(); ++i) { - if (id == Core::Id::fromSetting(m_comboBox->itemData(i))) + if (id == Utils::Id::fromSetting(m_comboBox->itemData(i))) return i; } return -1; @@ -137,20 +137,20 @@ private: void updateComboBox() { // remove unavailable cmake tool: - int pos = indexOf(Core::Id()); + int pos = indexOf(Utils::Id()); if (pos >= 0) m_comboBox->removeItem(pos); if (m_comboBox->count() == 0) { m_comboBox->addItem(tr("<No CMake Tool available>"), - Core::Id().toSetting()); + Utils::Id().toSetting()); m_comboBox->setEnabled(false); } else { m_comboBox->setEnabled(true); } } - void cmakeToolAdded(const Core::Id &id) + void cmakeToolAdded(const Utils::Id &id) { const CMakeTool *tool = CMakeToolManager::findById(id); QTC_ASSERT(tool, return); @@ -160,7 +160,7 @@ private: refresh(); } - void cmakeToolUpdated(const Core::Id &id) + void cmakeToolUpdated(const Utils::Id &id) { const int pos = indexOf(id); QTC_ASSERT(pos >= 0, return); @@ -171,7 +171,7 @@ private: m_comboBox->setItemText(pos, tool->displayName()); } - void cmakeToolRemoved(const Core::Id &id) + void cmakeToolRemoved(const Utils::Id &id) { const int pos = indexOf(id); QTC_ASSERT(pos >= 0, return); @@ -191,14 +191,13 @@ private: if (m_removingItem) return; - const Core::Id id = Core::Id::fromSetting(m_comboBox->itemData(index)); + const Utils::Id id = Utils::Id::fromSetting(m_comboBox->itemData(index)); CMakeKitAspect::setCMakeTool(m_kit, id); } void manageCMakeTools() { - Core::ICore::showOptionsDialog(Constants::CMAKE_SETTINGSPAGE_ID, - buttonWidget()); + Core::ICore::showOptionsDialog(Constants::CMAKE_SETTINGS_PAGE_ID, buttonWidget()); } bool m_removingItem = false; @@ -224,16 +223,16 @@ CMakeKitAspect::CMakeKitAspect() [this]() { foreach (Kit *k, KitManager::kits()) fix(k); }); } -Core::Id CMakeKitAspect::id() +Utils::Id CMakeKitAspect::id() { return TOOL_ID; } -Core::Id CMakeKitAspect::cmakeToolId(const Kit *k) +Utils::Id CMakeKitAspect::cmakeToolId(const Kit *k) { if (!k) return {}; - return Core::Id::fromSetting(k->value(TOOL_ID)); + return Utils::Id::fromSetting(k->value(TOOL_ID)); } CMakeTool *CMakeKitAspect::cmakeTool(const Kit *k) @@ -241,9 +240,9 @@ CMakeTool *CMakeKitAspect::cmakeTool(const Kit *k) return CMakeToolManager::findById(cmakeToolId(k)); } -void CMakeKitAspect::setCMakeTool(Kit *k, const Core::Id id) +void CMakeKitAspect::setCMakeTool(Kit *k, const Utils::Id id) { - const Core::Id toSet = id.isValid() ? id : defaultCMakeToolId(); + const Utils::Id toSet = id.isValid() ? id : defaultCMakeToolId(); QTC_ASSERT(!id.isValid() || CMakeToolManager::findById(toSet), return); if (k) k->setValue(TOOL_ID, toSet.toSetting()); @@ -255,9 +254,11 @@ Tasks CMakeKitAspect::validate(const Kit *k) const CMakeTool *tool = CMakeKitAspect::cmakeTool(k); if (tool) { CMakeTool::Version version = tool->version(); - if (version.major < 3) { - result << BuildSystemTask(Task::Warning, tr("CMake version %1 is unsupported. Please update to " - "version 3.0 or later.").arg(QString::fromUtf8(version.fullVersion))); + if (version.major < 3 || (version.major == 3 && version.minor < 14)) { + result << BuildSystemTask(Task::Warning, + tr("CMake version %1 is unsupported. Please update to " + "version 3.14 (with file-api) or later.") + .arg(QString::fromUtf8(version.fullVersion))); } } return result; @@ -297,7 +298,7 @@ void CMakeKitAspect::addToMacroExpander(Kit *k, Utils::MacroExpander *expander) }); } -QSet<Core::Id> CMakeKitAspect::availableFeatures(const Kit *k) const +QSet<Utils::Id> CMakeKitAspect::availableFeatures(const Kit *k) const { if (cmakeTool(k)) return { CMakeProjectManager::Constants::CMAKE_FEATURE_ID }; @@ -468,7 +469,20 @@ private: namespace { -struct GeneratorInfo { +class GeneratorInfo +{ +public: + GeneratorInfo() = default; + GeneratorInfo(const QString &generator_, + const QString &extraGenerator_ = QString(), + const QString &platform_ = QString(), + const QString &toolset_ = QString()) + : generator(generator_) + , extraGenerator(extraGenerator_) + , platform(platform_) + , toolset(toolset_) + {} + QVariant toVariant() const { QVariantMap result; result.insert(GENERATOR_KEY, generator); @@ -570,10 +584,12 @@ void CMakeGeneratorKitAspect::setToolset(Kit *k, const QString &toolset) } void CMakeGeneratorKitAspect::set(Kit *k, - const QString &generator, const QString &extraGenerator, - const QString &platform, const QString &toolset) + const QString &generator, + const QString &extraGenerator, + const QString &platform, + const QString &toolset) { - GeneratorInfo info = {generator, extraGenerator, platform, toolset}; + GeneratorInfo info(generator, extraGenerator, platform, toolset); setGeneratorInfo(k, info); } @@ -607,12 +623,9 @@ QVariant CMakeGeneratorKitAspect::defaultValue(const Kit *k) const if (!tool) return QVariant(); - const QString extraGenerator = "CodeBlocks"; - - QList<CMakeTool::Generator> known = tool->supportedGenerators(); - auto it = std::find_if(known.constBegin(), known.constEnd(), - [extraGenerator](const CMakeTool::Generator &g) { - return g.matches("Ninja", extraGenerator); + const QList<CMakeTool::Generator> known = tool->supportedGenerators(); + auto it = std::find_if(known.constBegin(), known.constEnd(), [](const CMakeTool::Generator &g) { + return g.matches("Ninja"); }); if (it != known.constEnd()) { const bool hasNinja = [k]() { @@ -628,44 +641,45 @@ QVariant CMakeGeneratorKitAspect::defaultValue(const Kit *k) const }(); if (hasNinja) - return GeneratorInfo({QString("Ninja"), extraGenerator, QString(), QString()}).toVariant(); + return GeneratorInfo("Ninja").toVariant(); } if (Utils::HostOsInfo::isWindowsHost()) { // *sigh* Windows with its zoo of incompatible stuff again... - ToolChain *tc = ToolChainKitAspect::toolChain(k, ProjectExplorer::Constants::CXX_LANGUAGE_ID); + ToolChain *tc = ToolChainKitAspect::cxxToolChain(k); if (tc && tc->typeId() == ProjectExplorer::Constants::MINGW_TOOLCHAIN_TYPEID) { - it = std::find_if(known.constBegin(), known.constEnd(), - [extraGenerator](const CMakeTool::Generator &g) { - return g.matches("MinGW Makefiles", extraGenerator); - }); + it = std::find_if(known.constBegin(), + known.constEnd(), + [](const CMakeTool::Generator &g) { + return g.matches("MinGW Makefiles"); + }); } else { - it = std::find_if(known.constBegin(), known.constEnd(), - [extraGenerator](const CMakeTool::Generator &g) { - return g.matches("NMake Makefiles", extraGenerator) - || g.matches("NMake Makefiles JOM", extraGenerator); - }); + it = std::find_if(known.constBegin(), + known.constEnd(), + [](const CMakeTool::Generator &g) { + return g.matches("NMake Makefiles") + || g.matches("NMake Makefiles JOM"); + }); if (ProjectExplorerPlugin::projectExplorerSettings().useJom) { it = std::find_if(known.constBegin(), known.constEnd(), - [extraGenerator](const CMakeTool::Generator &g) { - return g.matches("NMake Makefiles JOM", extraGenerator); + [](const CMakeTool::Generator &g) { + return g.matches("NMake Makefiles JOM"); }); } if (it == known.constEnd()) { it = std::find_if(known.constBegin(), known.constEnd(), - [extraGenerator](const CMakeTool::Generator &g) { - return g.matches("NMake Makefiles", extraGenerator); + [](const CMakeTool::Generator &g) { + return g.matches("NMake Makefiles"); }); } } } else { // Unix-oid OSes: - it = std::find_if(known.constBegin(), known.constEnd(), - [extraGenerator](const CMakeTool::Generator &g) { - return g.matches("Unix Makefiles", extraGenerator); + it = std::find_if(known.constBegin(), known.constEnd(), [](const CMakeTool::Generator &g) { + return g.matches("Unix Makefiles"); }); } if (it == known.constEnd()) @@ -673,7 +687,7 @@ QVariant CMakeGeneratorKitAspect::defaultValue(const Kit *k) const if (it == known.constEnd()) return QVariant(); - return GeneratorInfo({it->name, extraGenerator, QString(), QString()}).toVariant(); + return GeneratorInfo(it->name).toVariant(); } Tasks CMakeGeneratorKitAspect::validate(const Kit *k) const @@ -703,11 +717,10 @@ Tasks CMakeGeneratorKitAspect::validate(const Kit *k) const if (!it->supportsToolset && !info.toolset.isEmpty()) addWarning(tr("Toolset is not supported by the selected CMake generator.")); } - if (!tool->hasServerMode() && !tool->hasFileApi() && info.extraGenerator != "CodeBlocks") { - addWarning(tr("The selected CMake binary has no server-mode and the CMake " - "generator does not generate a CodeBlocks file. " + if (!tool->hasFileApi()) { + addWarning(tr("The selected CMake binary does not support file-api. " "%1 will not be able to parse CMake projects.") - .arg(Core::Constants::IDE_DISPLAY_NAME)); + .arg(Core::Constants::IDE_DISPLAY_NAME)); } } @@ -740,9 +753,10 @@ void CMakeGeneratorKitAspect::fix(Kit *k) dv.fromVariant(defaultValue(k)); setGeneratorInfo(k, dv); } else { - const GeneratorInfo dv = {info.generator, info.extraGenerator, - it->supportsPlatform ? info.platform : QString(), - it->supportsToolset ? info.toolset : QString()}; + const GeneratorInfo dv(info.generator, + info.extraGenerator, + it->supportsPlatform ? info.platform : QString(), + it->supportsToolset ? info.toolset : QString()); setGeneratorInfo(k, dv); } } @@ -960,6 +974,12 @@ void CMakeConfigurationKitAspect::fromStringList(Kit *k, const QStringList &in) setConfiguration(k, result); } +QStringList CMakeConfigurationKitAspect::toArgumentsList(const Kit *k) +{ + return Utils::transform(CMakeConfigurationKitAspect::configuration(k), + [](const CMakeConfigItem &i) { return i.toArgument(nullptr); }); +} + CMakeConfig CMakeConfigurationKitAspect::defaultConfiguration(const Kit *k) { Q_UNUSED(k) @@ -991,8 +1011,8 @@ Tasks CMakeConfigurationKitAspect::validate(const Kit *k) const QTC_ASSERT(k, return Tasks()); const QtSupport::BaseQtVersion *const version = QtSupport::QtKitAspect::qtVersion(k); - const ToolChain *const tcC = ToolChainKitAspect::toolChain(k, ProjectExplorer::Constants::C_LANGUAGE_ID); - const ToolChain *const tcCxx = ToolChainKitAspect::toolChain(k, ProjectExplorer::Constants::CXX_LANGUAGE_ID); + const ToolChain *const tcC = ToolChainKitAspect::cToolChain(k); + const ToolChain *const tcCxx = ToolChainKitAspect::cxxToolChain(k); const CMakeConfig config = configuration(k); const bool isQt4 = version && version->qtVersion() < QtSupport::QtVersionNumber(5, 0, 0); |