aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChristian Stenger <christian.stenger@qt.io>2020-02-05 15:16:04 +0100
committerChristian Stenger <christian.stenger@qt.io>2020-02-07 11:55:37 +0000
commit54cd881a400b66bc7abfb57a732ef35633819e83 (patch)
treebe2f783ddc4cc2fd082f03cc588505d9f26582c7 /src
parent11abdb9ddc7b278711e1780dab91cbe92dff9915 (diff)
CMakePM: Fix handling of qml debugging
Add a respective aspect to the build configuration for handling qml debugging from the build side similar to what we do with qmake and qbs. Qml debugging needs to get enabled on the build side before the settings on the run configuration page has an effect. Fixes: QTCREATORBUG-23541 Change-Id: I86267747601015760737d8b21978712896892a37 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp12
-rw-r--r--src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h7
-rw-r--r--src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp50
-rw-r--r--src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h1
-rw-r--r--src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp3
-rw-r--r--src/plugins/qtsupport/qtbuildaspects.h3
6 files changed, 74 insertions, 2 deletions
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 <projectexplorer/target.h>
#include <qtsupport/baseqtversion.h>
+#include <qtsupport/qtbuildaspects.h>
#include <qtsupport/qtkitinformation.h>
#include <utils/algorithm.h>
@@ -157,6 +158,12 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(Target *target, Core::Id id)
setConfigurationForCMake(config);
});
+
+ const auto qmlDebuggingAspect = addAspect<QtSupport::QmlDebuggingAspect>();
+ 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<QtSupport::QmlDebuggingAspect>()->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 <projectexplorer/project.h>
#include <projectexplorer/projectexplorer.h>
#include <projectexplorer/target.h>
+#include <qtsupport/qtbuildaspects.h>
#include <utils/categorysortfiltermodel.h>
#include <utils/detailswidget.h>
@@ -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<QtSupport::QmlDebuggingAspect>();
+ 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<QtSupport::QmlDebuggingAspect>();
+ 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<QString, QString> 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 &current, 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 <coreplugin/progressmanager/progressmanager.h>
#include <cpptools/cppprojectupdater.h>
#include <cpptools/generatedcodemodelsupport.h>
+#include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/kitmanager.h>
#include <projectexplorer/project.h>
#include <projectexplorer/target.h>
@@ -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;
};