File indexing completed on 2024-05-05 16:46:02
0001 /* 0002 SPDX-FileCopyrightText: 2017 Aleix Pol Gonzalez <aleixpol@kde.org> 0003 SPDX-FileCopyrightText: 2018 Daniel Mensinger <daniel@mensinger-ka.de> 0004 0005 SPDX-License-Identifier: LGPL-2.0-or-later 0006 */ 0007 0008 #pragma once 0009 0010 #include "mesonconfig.h" 0011 #include "mintro/mesontests.h" 0012 0013 #include <project/abstractfilemanagerplugin.h> 0014 #include <project/interfaces/ibuildsystemmanager.h> 0015 0016 #include <memory> 0017 0018 class MesonBuilder; 0019 class MesonTarget; 0020 class MesonTargets; 0021 class MesonTargetSources; 0022 0023 class KDirWatch; 0024 0025 using MesonSourcePtr = std::shared_ptr<MesonTargetSources>; 0026 using MesonTargetsPtr = std::shared_ptr<MesonTargets>; 0027 using KDirWatchPtr = std::shared_ptr<KDirWatch>; 0028 0029 class MesonManager : public KDevelop::AbstractFileManagerPlugin, public KDevelop::IBuildSystemManager 0030 { 0031 Q_OBJECT 0032 Q_INTERFACES(KDevelop::IBuildSystemManager) 0033 0034 public: 0035 explicit MesonManager(QObject* parent = nullptr, const QVariantList& args = QVariantList()); 0036 ~MesonManager() override; 0037 0038 // ******************** 0039 // * Custom functions * 0040 // ******************** 0041 0042 /** 0043 * Create a new build directory and write it into the config. 0044 * @returns The configuration job on success or nullptr on error. 0045 */ 0046 KJob* newBuildDirectory(KDevelop::IProject* project, Meson::BuildDir* outBuildDir = nullptr); 0047 0048 /// Returns a list of all supported Meson backends (for now only ninja) 0049 QStringList supportedMesonBackends() const; 0050 QString defaultMesonBackend() const; 0051 0052 KDevelop::Path findMeson() const; 0053 0054 // ********************************* 0055 // * AbstractFileManagerPlugin API * 0056 // ********************************* 0057 0058 KDevelop::IProjectFileManager::Features features() const override; 0059 KDevelop::ProjectFolderItem* createFolderItem(KDevelop::IProject* project, const KDevelop::Path& path, 0060 KDevelop::ProjectBaseItem* parent = nullptr) override; 0061 0062 bool reload(KDevelop::ProjectFolderItem* item) override; 0063 0064 // *********** 0065 // * IPlugin * 0066 // *********** 0067 0068 KDevelop::ConfigPage* perProjectConfigPage(int number, const KDevelop::ProjectConfigOptions& options, 0069 QWidget* parent) override; 0070 int perProjectConfigPages() const override; 0071 0072 // *************************** 0073 // * IBuildSystemManager API * 0074 // *************************** 0075 0076 KJob* createImportJob(KDevelop::ProjectFolderItem* item) override; 0077 0078 KDevelop::IProjectBuilder* builder() const override; 0079 0080 KDevelop::Path::List includeDirectories(KDevelop::ProjectBaseItem* item) const override; 0081 KDevelop::Path::List frameworkDirectories(KDevelop::ProjectBaseItem* item) const override; 0082 QHash<QString, QString> defines(KDevelop::ProjectBaseItem* item) const override; 0083 QString extraArguments(KDevelop::ProjectBaseItem* item) const override; 0084 bool hasBuildInfo(KDevelop::ProjectBaseItem* item) const override; 0085 0086 KDevelop::Path buildDirectory(KDevelop::ProjectBaseItem*) const override; 0087 QList<KDevelop::ProjectTargetItem*> targets(KDevelop::ProjectFolderItem*) const override; 0088 0089 // Not sure when/if these will be implemented. This would require modifying meson files. Regardless: TODO 0090 KDevelop::ProjectTargetItem* createTarget(const QString& /*target*/, 0091 KDevelop::ProjectFolderItem* /*parent*/) override 0092 { 0093 return nullptr; 0094 } 0095 bool removeTarget(KDevelop::ProjectTargetItem* /*target*/) override { return false; } 0096 bool addFilesToTarget(const QList<KDevelop::ProjectFileItem*>& /*files*/, 0097 KDevelop::ProjectTargetItem* /*target*/) override 0098 { 0099 return false; 0100 } 0101 bool removeFilesFromTargets(const QList<KDevelop::ProjectFileItem*>& /*files*/) override { return false; } 0102 0103 KDevelop::Path compiler(KDevelop::ProjectTargetItem* p) const override; 0104 0105 private: 0106 void onMesonInfoChanged(QString path, QString projectName); 0107 0108 private: 0109 MesonBuilder* m_builder; 0110 QHash<KDevelop::IProject*, MesonTargetsPtr> m_projectTargets; 0111 QHash<KDevelop::IProject*, MesonTestSuitesPtr> m_projectTestSuites; 0112 QHash<KDevelop::IProject*, KDirWatchPtr> m_projectWatchers; 0113 0114 MesonSourcePtr sourceFromItem(KDevelop::ProjectBaseItem* item) const; 0115 void populateTargets(KDevelop::ProjectFolderItem* item, QVector<MesonTarget*> targets); 0116 };