diff --git a/src/common/project/projectinfo.h b/src/common/project/projectinfo.h index e2d801618..d2d0775cb 100644 --- a/src/common/project/projectinfo.h +++ b/src/common/project/projectinfo.h @@ -28,6 +28,8 @@ class COMMON_EXPORT ProjectInfo inline QString language() const {return data["Language"].toString();} inline void setKitName(const QString &kitName) {data["KitName"] = kitName;} inline QString kitName() const {return data["KitName"].toString();} + inline void setKitId(const QString &id) {data["KitId"] = id;} + inline QString kitId() const {return data["KitId"].toString();} inline void setBuildFolder(const QString &buildPath) {data["BuildFolder"] = buildPath;} inline QString buildFolder() const {return data["BuildFolder"].toString();} inline void setWorkspaceFolder(const QString &workspaceFolder) {data["WorkspaceFolder"] = workspaceFolder;} @@ -36,6 +38,8 @@ class COMMON_EXPORT ProjectInfo inline QString buildType() const {return data["BuildType"].toString();} inline void setBuildProgram(const QString &program) {data["BuildProgram"] = program;} inline QString buildProgram() const {return data["BuildProgram"].toString();} + inline void setDebugProgram(const QString &program) {data["DebugProgram"] = program;} + inline QString debugProgram() const {return data["DebugProgram"].toString();} inline void setConfigCustomArgs(const QStringList &args) {data["ConfigCustomArgs"] = args;} inline QStringList configCustomArgs() const {return data["ConfigCustomArgs"].toStringList();} inline void setSourceFiles(const QSet &files) {data["SourceFiles"] = QVariant::fromValue(files);} diff --git a/src/plugins/cxx/cmake/cmakedebug.cpp b/src/plugins/cxx/cmake/cmakedebug.cpp index 30d2f0cb5..4a11dac6d 100644 --- a/src/plugins/cxx/cmake/cmakedebug.cpp +++ b/src/plugins/cxx/cmake/cmakedebug.cpp @@ -3,8 +3,6 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "cmakedebug.h" - -#include "services/option/optionmanager.h" #include "services/project/projectservice.h" #include @@ -32,7 +30,8 @@ CMakeDebug::~CMakeDebug() bool CMakeDebug::prepareDebug(QString &retMsg) { - QString debuggerTool = OptionManager::getInstance()->getCxxDebuggerToolPath(); + auto prjInfo = dpfGetService(ProjectService)->getActiveProjectInfo(); + QString debuggerTool = prjInfo.debugProgram(); if (!debuggerTool.contains("gdb")) { retMsg = tr("The gdb is required, please install it in console with \"sudo apt install gdb\", " "and then restart the tool, reselect the CMake Debugger in Options Dialog..."); diff --git a/src/plugins/cxx/cmake/model/kitlistmodel.cpp b/src/plugins/cxx/cmake/model/kitlistmodel.cpp index 9e58e5703..b8656609e 100644 --- a/src/plugins/cxx/cmake/model/kitlistmodel.cpp +++ b/src/plugins/cxx/cmake/model/kitlistmodel.cpp @@ -70,6 +70,7 @@ QModelIndex KitListModel::addItem() { Kit item; item.setKitName(tr("Unnamed")); + item.setId(QUuid::createUuid().toString()); int pos = kitItemList.size(); beginInsertRows(QModelIndex(), pos, pos); diff --git a/src/plugins/cxx/cmake/option/kit.cpp b/src/plugins/cxx/cmake/option/kit.cpp index ef4dfe0b1..7b5346bc6 100644 --- a/src/plugins/cxx/cmake/option/kit.cpp +++ b/src/plugins/cxx/cmake/option/kit.cpp @@ -8,14 +8,6 @@ class KitPrivate { -public: - explicit KitPrivate(QString _id) - : id(_id) - { - if (id.isEmpty()) - id = QUuid::createUuid().toString(); - } - public: QString id; QString kitName; @@ -26,14 +18,14 @@ class KitPrivate QString cmakeGenerator; }; -Kit::Kit(QString id, QObject *parent) +Kit::Kit(QObject *parent) : QObject(parent), - d(new KitPrivate(id)) + d(new KitPrivate()) { } Kit::Kit(const Kit &other) - : d(new KitPrivate("")) + : d(new KitPrivate()) { copyFrom(other); } @@ -113,6 +105,11 @@ void Kit::setCMakeGenerator(const QString &cg) d->cmakeGenerator = cg; } +bool Kit::isValid() const +{ + return !d->id.isEmpty(); +} + void Kit::copyFrom(const Kit &other) { d->id = other.d->id; diff --git a/src/plugins/cxx/cmake/option/kit.h b/src/plugins/cxx/cmake/option/kit.h index 0ae3925d5..cbbd92f81 100644 --- a/src/plugins/cxx/cmake/option/kit.h +++ b/src/plugins/cxx/cmake/option/kit.h @@ -12,7 +12,7 @@ class Kit : public QObject { Q_OBJECT public: - explicit Kit(QString id = "", QObject *parent = nullptr); + explicit Kit(QObject *parent = nullptr); Kit(const Kit &other); ~Kit(); @@ -31,6 +31,7 @@ class Kit : public QObject QString cmakeGenerator() const; void setCMakeGenerator(const QString &cg); + bool isValid() const; void copyFrom(const Kit &other); QVariantMap toVariantMap(); static QVariantMap toVariantMap(const Kit &kit); diff --git a/src/plugins/cxx/cmake/option/kitmanager.cpp b/src/plugins/cxx/cmake/option/kitmanager.cpp index 8defbc396..2b20d8743 100644 --- a/src/plugins/cxx/cmake/option/kitmanager.cpp +++ b/src/plugins/cxx/cmake/option/kitmanager.cpp @@ -32,7 +32,7 @@ QList KitManager::kitList() const Kit KitManager::findKit(const QString &id) { - auto iter = std::find_if(allKit.cbegin(), allKit.cbegin(), + auto iter = std::find_if(allKit.cbegin(), allKit.cend(), [&id](const Kit &kit) { return kit.id() == id; }); diff --git a/src/plugins/cxx/cmake/project/cmakeprojectgenerator.cpp b/src/plugins/cxx/cmake/project/cmakeprojectgenerator.cpp index 192c4ad6a..a90888ccb 100644 --- a/src/plugins/cxx/cmake/project/cmakeprojectgenerator.cpp +++ b/src/plugins/cxx/cmake/project/cmakeprojectgenerator.cpp @@ -9,6 +9,7 @@ #include "properties/bulidCfgWidget/buildpropertypage.h" #include "properties/runCfgWidget/runpropertypage.h" #include "properties/configWidget/configpropertywidget.h" +#include "properties/kitpage/kitpage.h" #include "properties/configutil.h" #include "properties/targetsmanager.h" #include "services/builder/builderservice.h" @@ -530,6 +531,9 @@ void CmakeProjectGenerator::runCMake(QStandardItem *root, const QPairgetConfigureParamPointer(); + ConfigUtil::instance()->updateProjectInfo(proInfo, param); + // reconfigure project info configure(proInfo); } @@ -545,9 +549,11 @@ void CmakeProjectGenerator::actionProperties(const dpfservice::ProjectInfo &info BuildPropertyPage *buildWidget = new BuildPropertyPage(info); RunPropertyPage *runWidget = new RunPropertyPage(info, item); + KitPage *kitPage = new KitPage(info, item); dlg.insertPropertyPanel(tr("Build"), buildWidget); dlg.insertPropertyPanel(tr("Run"), runWidget); + dlg.insertPropertyPanel(tr("Kit"), kitPage); connect(buildWidget, &BuildPropertyPage::cacheFileUpdated, this, [=](){ runCMake(this->rootItem, {}); diff --git a/src/plugins/cxx/cmake/project/properties/bulidCfgWidget/buildpropertypage.cpp b/src/plugins/cxx/cmake/project/properties/bulidCfgWidget/buildpropertypage.cpp index 1a18877ac..a2cc076ff 100644 --- a/src/plugins/cxx/cmake/project/properties/bulidCfgWidget/buildpropertypage.cpp +++ b/src/plugins/cxx/cmake/project/properties/bulidCfgWidget/buildpropertypage.cpp @@ -8,6 +8,7 @@ #include "environmentwidget.h" #include "stepspane.h" #include "targetsmanager.h" +#include "cmake/option/kitmanager.h" #include "services/project/projectservice.h" #include "cmakeCfgWidget/cmakepropertypage.h" diff --git a/src/plugins/cxx/cmake/project/properties/configutil.cpp b/src/plugins/cxx/cmake/project/properties/configutil.cpp index 1171405fe..f402c29f1 100644 --- a/src/plugins/cxx/cmake/project/properties/configutil.cpp +++ b/src/plugins/cxx/cmake/project/properties/configutil.cpp @@ -90,6 +90,8 @@ dpfservice::ProjectInfo ConfigUtil::createProjectInfo(const ProjectConfigure *pa info.setBuildType(ConfigUtil::instance()->getNameFromType(iter->type)); info.setBuildFolder(iter->directory); info.setBuildProgram(kit.cmakeTool().path); + info.setDebugProgram(kit.debugger().path); + info.setKitId(kit.id()); QStringList configArguments; configArguments << "-S"; @@ -100,6 +102,8 @@ dpfservice::ProjectInfo ConfigUtil::createProjectInfo(const ProjectConfigure *pa configArguments << CDT_PROJECT_KIT::get()->CBP_GENERATOR; configArguments << "-DCMAKE_BUILD_TYPE=" + info.buildType(); configArguments << "-DCMAKE_EXPORT_COMPILE_COMMANDS=1"; + configArguments << "-DCMAKE_C_COMPILER=" + kit.ccompiler().path; + configArguments << "-DCMAKE_CXX_COMPILER=" + kit.cxxcompiler().path; info.setConfigCustomArgs(configArguments); QStringList buildArguments; @@ -187,6 +191,8 @@ bool ConfigUtil::updateProjectInfo(dpfservice::ProjectInfo &info, const ProjectC info.setBuildType(ConfigUtil::instance()->getNameFromType(iter->type)); info.setBuildFolder(iter->directory); info.setBuildProgram(kit.cmakeTool().path); + info.setDebugProgram(kit.debugger().path); + info.setKitId(kit.id()); QStringList arguments; arguments << "-S"; @@ -197,6 +203,8 @@ bool ConfigUtil::updateProjectInfo(dpfservice::ProjectInfo &info, const ProjectC arguments << CDT_PROJECT_KIT::get()->CBP_GENERATOR; arguments << "-DCMAKE_BUILD_TYPE=" + info.buildType(); arguments << "-DCMAKE_EXPORT_COMPILE_COMMANDS=1"; + arguments << "-DCMAKE_C_COMPILER=" + kit.ccompiler().path; + arguments << "-DCMAKE_CXX_COMPILER=" + kit.cxxcompiler().path; info.setConfigCustomArgs(arguments); for (auto iterStep = iter->buildConfigure.steps.begin(); iterStep != iter->buildConfigure.steps.end(); ++iterStep) { diff --git a/src/plugins/cxx/cmake/project/properties/kitpage/kitpage.cpp b/src/plugins/cxx/cmake/project/properties/kitpage/kitpage.cpp new file mode 100644 index 000000000..165f63ede --- /dev/null +++ b/src/plugins/cxx/cmake/project/properties/kitpage/kitpage.cpp @@ -0,0 +1,65 @@ +// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "kitpage.h" +#include "configutil.h" +#include "cmake/option/kitmanager.h" + +#include + +using namespace config; +DWIDGET_USE_NAMESPACE + +KitPage::KitPage(const dpfservice::ProjectInfo &projectInfo, QStandardItem *item, QWidget *parent) + : PageWidget(parent) +{ + this->projectInfo = projectInfo; + this->item = item; + initUI(); +} + +void KitPage::initUI() +{ + kitComboBox = new DComboBox(this); + kitComboBox->setFixedWidth(220); + + QFormLayout *layout = new QFormLayout(this); + layout->addRow(tr("Kit:"), kitComboBox); +} + +void KitPage::readConfig() +{ + kitComboBox->clear(); + + kitComboBox->addItem(tr("None")); + const auto &kitList = KitManager::instance()->kitList(); + for (const auto &kit : kitList) { + kitComboBox->addItem(kit.kitName(), kit.id()); + } + + const auto &id = projectInfo.kitId(); + const auto &kit = KitManager::instance()->findKit(id); + if (!kit.isValid()) { + kitComboBox->setCurrentIndex(0); + } else { + int index = kitComboBox->findData(id); + kitComboBox->setCurrentIndex(index); + } +} + +void KitPage::saveConfig() +{ + ProjectConfigure *param = ConfigUtil::instance()->getConfigureParamPointer(); + const QString id = kitComboBox->currentData().toString(); + if (id == param->kitId) + return; + + param->kit = kitComboBox->currentText(); + param->kitId = id; + QString filePath = ConfigUtil::instance()->getConfigPath(param->workspace); + ConfigUtil::instance()->saveConfig(filePath, *param); + + ConfigUtil::instance()->updateProjectInfo(projectInfo, param); + dpfservice::ProjectInfo::set(item, projectInfo); +} diff --git a/src/plugins/cxx/cmake/project/properties/kitpage/kitpage.h b/src/plugins/cxx/cmake/project/properties/kitpage/kitpage.h new file mode 100644 index 000000000..b41b5e2e6 --- /dev/null +++ b/src/plugins/cxx/cmake/project/properties/kitpage/kitpage.h @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef KITPAGE_H +#define KITPAGE_H + +#include "common/widget/pagewidget.h" +#include "common/project/projectinfo.h" + +#include + +class KitPage : public PageWidget +{ +public: + explicit KitPage(const dpfservice::ProjectInfo &projectInfo, QStandardItem *item, QWidget *parent = nullptr); + + void readConfig() override; + void saveConfig() override; + +private: + void initUI(); + + DTK_WIDGET_NAMESPACE::DComboBox *kitComboBox { nullptr }; + dpfservice::ProjectInfo projectInfo; + QStandardItem *item { nullptr }; +}; + +#endif // KITPAGE_H diff --git a/src/plugins/cxx/cmake/settings/kitoptionwidget.cpp b/src/plugins/cxx/cmake/settings/kitoptionwidget.cpp index b70f33b78..454980a6a 100644 --- a/src/plugins/cxx/cmake/settings/kitoptionwidget.cpp +++ b/src/plugins/cxx/cmake/settings/kitoptionwidget.cpp @@ -314,8 +314,6 @@ void KitOptionWidget::setConfig(const QVariantMap &config) d->parseKitParamsV1(config); else d->parseKitParamsV2(config); - - KitManager::instance()->setKitList(d->listModel.itemList()); } QVariantMap KitOptionWidget::getConfig() const @@ -329,5 +327,6 @@ QVariantMap KitOptionWidget::getConfig() const map.insert(item.kitName(), params); } + KitManager::instance()->setKitList(d->listModel.itemList()); return map; } diff --git a/src/plugins/debugger/dap/dapdebugger.cpp b/src/plugins/debugger/dap/dapdebugger.cpp index 35b88958d..633893cdc 100644 --- a/src/plugins/debugger/dap/dapdebugger.cpp +++ b/src/plugins/debugger/dap/dapdebugger.cpp @@ -260,11 +260,13 @@ void DAPDebugger::attachDebug(const QString &processId) // only support gdb for now updateRunState(kStart); - QString debuggerTool = OptionManager::getInstance()->getCxxDebuggerToolPath(); + auto prjInfo = dpfGetService(ProjectService)->getActiveProjectInfo(); + QString debuggerTool = prjInfo.debugProgram(); if (!debuggerTool.contains("gdb")) { auto msg = tr("The gdb is required, please install it in console with \"sudo apt install gdb\", " "and then restart the tool, reselect the CMake Debugger in Options Dialog..."); printOutput(msg, OutputPane::OutputFormat::ErrorMessage); + return; } //todo : change signal to other debuger @@ -273,7 +275,7 @@ void DAPDebugger::attachDebug(const QString &processId) "getDebugPort"); d->requestDAPPortPpid = QString(getpid()); msg << d->requestDAPPortPpid - << "gdb" + << debuggerTool << processId << QStringList(); bool ret = QDBusConnection::sessionBus().send(msg);