diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 0f12d8660fe..e23b5e2fc0f 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -47,6 +47,7 @@ #include #include +#include #include #include @@ -157,6 +158,12 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(Target *target, Core::Id id) setConfigurationForCMake(config); }); + + const auto qmlDebuggingAspect = addAspect(); + qmlDebuggingAspect->setKit(target->kit()); + connect(qmlDebuggingAspect, &QtSupport::QmlDebuggingAspect::changed, + this, &CMakeBuildConfiguration::configurationForCMakeChanged); + } CMakeBuildConfiguration::~CMakeBuildConfiguration() @@ -381,6 +388,11 @@ void CMakeBuildConfiguration::setWarning(const QString &message) emit warningOccured(m_warning); } +bool CMakeBuildConfiguration::isQmlDebuggingEnabled() const +{ + return aspect()->setting() == TriState::Enabled; +} + QString CMakeBuildConfiguration::error() const { diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h index bae9d483f4e..9d5b46c65a9 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h @@ -46,6 +46,11 @@ class CMakeBuildConfiguration final : public ProjectExplorer::BuildConfiguration { Q_OBJECT + // used in DebuggerRunConfigurationAspect + Q_PROPERTY(bool linkQmlDebuggingLibrary + READ isQmlDebuggingEnabled + NOTIFY configurationForCMakeChanged) + friend class ProjectExplorer::BuildConfigurationFactory; CMakeBuildConfiguration(ProjectExplorer::Target *target, Core::Id id); ~CMakeBuildConfiguration() final; @@ -93,6 +98,8 @@ private: void setError(const QString &message); void setWarning(const QString &message); + bool isQmlDebuggingEnabled() const; + CMakeConfig m_configurationForCMake; CMakeConfig m_initialConfiguration; QString m_error; diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp index a131216a474..9593eae3be3 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -119,6 +120,15 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) mainLayout->addWidget(new QLabel(tr("Build directory:")), row, 0); mainLayout->addWidget(buildDirChooser->lineEdit(), row, 1); mainLayout->addWidget(buildDirChooser->buttonAtIndex(0), row, 2); + ++row; + + auto qmlDebugAspect = bc->aspect(); + connect(qmlDebugAspect, &QtSupport::QmlDebuggingAspect::changed, + this, [this]() { handleQmlDebugCxxFlags(); }); + auto widget = new QWidget; + LayoutBuilder builder(widget); + qmlDebugAspect->addToLayout(builder); + mainLayout->addWidget(widget, row, 0, 1, 2); ++row; mainLayout->addItem(new QSpacerItem(20, 10), row, 0); @@ -255,6 +265,7 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) stretcher->stretch(); updateButtonState(); buildDirChooser->triggerChanged(); // refresh valid state... + handleQmlDebugCxxFlags(); m_showProgressTimer.stop(); m_progressIndicator->hide(); }); @@ -377,6 +388,45 @@ void CMakeBuildSettingsWidget::updateFromKit() m_configModel->setConfigurationFromKit(configHash); } +void CMakeBuildSettingsWidget::handleQmlDebugCxxFlags() +{ + bool changed = false; + const auto aspect = m_buildConfiguration->aspect(); + const bool enable = aspect->setting() == TriState::Enabled; + + CMakeConfig changedConfig = m_buildConfiguration->configurationForCMake(); + const CMakeConfig configList = m_buildConfiguration->configurationFromCMake(); + const QByteArrayList cxxFlags{"CMAKE_CXX_FLAGS", "CMAKE_CXX_FLAGS_DEBUG", + "CMAKE_CXX_FLAGS_RELWITHDEBINFO"}; + const QByteArray qmlDebug("-DQT_QML_DEBUG"); + + for (CMakeConfigItem item : configList) { + CMakeConfigItem it(item); + + if (cxxFlags.contains(it.key)) { + if (enable) { + if (!it.value.contains(qmlDebug)) { + it.value = it.value.append(' ').append(qmlDebug); + changed = true; + } + } else { + int index = it.value.indexOf(qmlDebug); + if (index != -1) { + it.value.remove(index, qmlDebug.length()); + changed = true; + } + } + it.value = it.value.trimmed(); + changedConfig.append(it); + } + } + + if (!changed) + return; + + m_buildConfiguration->setConfigurationForCMake(changedConfig); +} + void CMakeBuildSettingsWidget::setConfigurationForCMake() { QHash config; diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h index db68e3e125b..9b315ce7dbe 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h @@ -65,6 +65,7 @@ private: void updateButtonState(); void updateAdvancedCheckBox(); void updateFromKit(); + void handleQmlDebugCxxFlags(); void setConfigurationForCMake(); void updateSelection(const QModelIndex ¤t, const QModelIndex &previous); diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp index d33c5f48ac9..89202c8135b 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -699,6 +700,8 @@ void CMakeBuildSystem::updateQmlJSCodeModel() foreach (const QString &cmakeImport, CMakeConfigItem::cmakeSplitValue(cmakeImports)) projectInfo.importPaths.maybeInsert(FilePath::fromString(cmakeImport), QmlJS::Dialect::Qml); + project()->setProjectLanguage(ProjectExplorer::Constants::QMLJS_LANGUAGE_ID, + !projectInfo.sourceFiles.isEmpty()); modelManager->updateProjectInfo(projectInfo, p); } diff --git a/src/plugins/qtsupport/qtbuildaspects.h b/src/plugins/qtsupport/qtbuildaspects.h index 197417430f2..a1410af98af 100644 --- a/src/plugins/qtsupport/qtbuildaspects.h +++ b/src/plugins/qtsupport/qtbuildaspects.h @@ -38,10 +38,9 @@ public: QmlDebuggingAspect(); void setKit(const ProjectExplorer::Kit *kit) { m_kit = kit; } - -private: void addToLayout(ProjectExplorer::LayoutBuilder &builder) override; +private: const ProjectExplorer::Kit *m_kit = nullptr; };