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>
This commit is contained in:
Christian Stenger
2020-02-05 15:16:04 +01:00
parent 11abdb9ddc
commit 54cd881a40
6 changed files with 74 additions and 2 deletions

View File

@@ -47,6 +47,7 @@
#include <projectexplorer/target.h> #include <projectexplorer/target.h>
#include <qtsupport/baseqtversion.h> #include <qtsupport/baseqtversion.h>
#include <qtsupport/qtbuildaspects.h>
#include <qtsupport/qtkitinformation.h> #include <qtsupport/qtkitinformation.h>
#include <utils/algorithm.h> #include <utils/algorithm.h>
@@ -157,6 +158,12 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(Target *target, Core::Id id)
setConfigurationForCMake(config); setConfigurationForCMake(config);
}); });
const auto qmlDebuggingAspect = addAspect<QtSupport::QmlDebuggingAspect>();
qmlDebuggingAspect->setKit(target->kit());
connect(qmlDebuggingAspect, &QtSupport::QmlDebuggingAspect::changed,
this, &CMakeBuildConfiguration::configurationForCMakeChanged);
} }
CMakeBuildConfiguration::~CMakeBuildConfiguration() CMakeBuildConfiguration::~CMakeBuildConfiguration()
@@ -381,6 +388,11 @@ void CMakeBuildConfiguration::setWarning(const QString &message)
emit warningOccured(m_warning); emit warningOccured(m_warning);
} }
bool CMakeBuildConfiguration::isQmlDebuggingEnabled() const
{
return aspect<QtSupport::QmlDebuggingAspect>()->setting() == TriState::Enabled;
}
QString CMakeBuildConfiguration::error() const QString CMakeBuildConfiguration::error() const
{ {

View File

@@ -46,6 +46,11 @@ class CMakeBuildConfiguration final : public ProjectExplorer::BuildConfiguration
{ {
Q_OBJECT Q_OBJECT
// used in DebuggerRunConfigurationAspect
Q_PROPERTY(bool linkQmlDebuggingLibrary
READ isQmlDebuggingEnabled
NOTIFY configurationForCMakeChanged)
friend class ProjectExplorer::BuildConfigurationFactory; friend class ProjectExplorer::BuildConfigurationFactory;
CMakeBuildConfiguration(ProjectExplorer::Target *target, Core::Id id); CMakeBuildConfiguration(ProjectExplorer::Target *target, Core::Id id);
~CMakeBuildConfiguration() final; ~CMakeBuildConfiguration() final;
@@ -93,6 +98,8 @@ private:
void setError(const QString &message); void setError(const QString &message);
void setWarning(const QString &message); void setWarning(const QString &message);
bool isQmlDebuggingEnabled() const;
CMakeConfig m_configurationForCMake; CMakeConfig m_configurationForCMake;
CMakeConfig m_initialConfiguration; CMakeConfig m_initialConfiguration;
QString m_error; QString m_error;

View File

@@ -37,6 +37,7 @@
#include <projectexplorer/project.h> #include <projectexplorer/project.h>
#include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorer.h>
#include <projectexplorer/target.h> #include <projectexplorer/target.h>
#include <qtsupport/qtbuildaspects.h>
#include <utils/categorysortfiltermodel.h> #include <utils/categorysortfiltermodel.h>
#include <utils/detailswidget.h> #include <utils/detailswidget.h>
@@ -119,6 +120,15 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc)
mainLayout->addWidget(new QLabel(tr("Build directory:")), row, 0); mainLayout->addWidget(new QLabel(tr("Build directory:")), row, 0);
mainLayout->addWidget(buildDirChooser->lineEdit(), row, 1); mainLayout->addWidget(buildDirChooser->lineEdit(), row, 1);
mainLayout->addWidget(buildDirChooser->buttonAtIndex(0), row, 2); 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; ++row;
mainLayout->addItem(new QSpacerItem(20, 10), row, 0); mainLayout->addItem(new QSpacerItem(20, 10), row, 0);
@@ -255,6 +265,7 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc)
stretcher->stretch(); stretcher->stretch();
updateButtonState(); updateButtonState();
buildDirChooser->triggerChanged(); // refresh valid state... buildDirChooser->triggerChanged(); // refresh valid state...
handleQmlDebugCxxFlags();
m_showProgressTimer.stop(); m_showProgressTimer.stop();
m_progressIndicator->hide(); m_progressIndicator->hide();
}); });
@@ -377,6 +388,45 @@ void CMakeBuildSettingsWidget::updateFromKit()
m_configModel->setConfigurationFromKit(configHash); 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() void CMakeBuildSettingsWidget::setConfigurationForCMake()
{ {
QHash<QString, QString> config; QHash<QString, QString> config;

View File

@@ -65,6 +65,7 @@ private:
void updateButtonState(); void updateButtonState();
void updateAdvancedCheckBox(); void updateAdvancedCheckBox();
void updateFromKit(); void updateFromKit();
void handleQmlDebugCxxFlags();
void setConfigurationForCMake(); void setConfigurationForCMake();
void updateSelection(const QModelIndex &current, const QModelIndex &previous); void updateSelection(const QModelIndex &current, const QModelIndex &previous);

View File

@@ -35,6 +35,7 @@
#include <coreplugin/progressmanager/progressmanager.h> #include <coreplugin/progressmanager/progressmanager.h>
#include <cpptools/cppprojectupdater.h> #include <cpptools/cppprojectupdater.h>
#include <cpptools/generatedcodemodelsupport.h> #include <cpptools/generatedcodemodelsupport.h>
#include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/kitmanager.h> #include <projectexplorer/kitmanager.h>
#include <projectexplorer/project.h> #include <projectexplorer/project.h>
#include <projectexplorer/target.h> #include <projectexplorer/target.h>
@@ -699,6 +700,8 @@ void CMakeBuildSystem::updateQmlJSCodeModel()
foreach (const QString &cmakeImport, CMakeConfigItem::cmakeSplitValue(cmakeImports)) foreach (const QString &cmakeImport, CMakeConfigItem::cmakeSplitValue(cmakeImports))
projectInfo.importPaths.maybeInsert(FilePath::fromString(cmakeImport), QmlJS::Dialect::Qml); projectInfo.importPaths.maybeInsert(FilePath::fromString(cmakeImport), QmlJS::Dialect::Qml);
project()->setProjectLanguage(ProjectExplorer::Constants::QMLJS_LANGUAGE_ID,
!projectInfo.sourceFiles.isEmpty());
modelManager->updateProjectInfo(projectInfo, p); modelManager->updateProjectInfo(projectInfo, p);
} }

View File

@@ -38,10 +38,9 @@ public:
QmlDebuggingAspect(); QmlDebuggingAspect();
void setKit(const ProjectExplorer::Kit *kit) { m_kit = kit; } void setKit(const ProjectExplorer::Kit *kit) { m_kit = kit; }
private:
void addToLayout(ProjectExplorer::LayoutBuilder &builder) override; void addToLayout(ProjectExplorer::LayoutBuilder &builder) override;
private:
const ProjectExplorer::Kit *m_kit = nullptr; const ProjectExplorer::Kit *m_kit = nullptr;
}; };