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 };