File indexing completed on 2024-04-28 04:38:29

0001 /*
0002     SPDX-FileCopyrightText: 2007 Dukju Ahn <dukjuahn@gmail.com>
0003     SPDX-FileCopyrightText: 2011 Milian Wolff <mail@milianw.de>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #ifndef CUSTOMMAKEMANAGER_H
0009 #define CUSTOMMAKEMANAGER_H
0010 
0011 #include <project/abstractfilemanagerplugin.h>
0012 #include <project/interfaces/ibuildsystemmanager.h>
0013 
0014 #include <QScopedPointer>
0015 #include <QSet>
0016 
0017 class IMakeBuilder;
0018 class CustomMakeProvider;
0019 
0020 class CustomMakeManager : public KDevelop::AbstractFileManagerPlugin,
0021                           public KDevelop::IBuildSystemManager
0022 {
0023     Q_OBJECT
0024     Q_INTERFACES( KDevelop::IBuildSystemManager )
0025 public:
0026 
0027     explicit CustomMakeManager( QObject *parent = nullptr, const QVariantList& args = QVariantList()  );
0028 
0029     ~CustomMakeManager() override;
0030 
0031     Features features() const override { return Features(Folders | Targets | Files); }
0032     KDevelop::ProjectFolderItem* import(KDevelop::IProject* project) override;
0033 
0034     /**
0035      * Provide access to the builder
0036      */
0037     KDevelop::IProjectBuilder* builder() const override;
0038 
0039     /**
0040      * Provide a list of include directories.
0041      */
0042     KDevelop::Path::List includeDirectories(KDevelop::ProjectBaseItem*) const override;
0043 
0044     /**
0045      * Provide a list of framework directories.
0046      */
0047     KDevelop::Path::List frameworkDirectories(KDevelop::ProjectBaseItem*) const override;
0048 
0049     /**
0050      * Provide a list of files that contain the preprocessor defines for the
0051      * project
0052      */
0053     QHash<QString,QString> defines(KDevelop::ProjectBaseItem*) const override;
0054 
0055     QString extraArguments(KDevelop::ProjectBaseItem *item) const override;
0056 
0057     /**
0058      * Create a new target
0059      *
0060      * Creates the target specified by @p target to the folder @p parent and
0061      * modifies the underlying build system if needed
0062      */
0063     KDevelop::ProjectTargetItem* createTarget(const QString& target,
0064                                             KDevelop::ProjectFolderItem *parent) override;
0065 
0066     /**
0067      * Add a file to a target
0068      *
0069      * Adds the file specified by @p file to the target @p parent and modifies
0070      * the underlying build system if needed.
0071      */
0072     bool addFilesToTarget(const QList<KDevelop::ProjectFileItem*> &files, KDevelop::ProjectTargetItem *parent) override;
0073 
0074     /**
0075      * Remove a target
0076      *
0077      * Removes the target specified by @p target and
0078      * modifies the underlying build system if needed.
0079      */
0080     bool removeTarget(KDevelop::ProjectTargetItem *target) override;
0081 
0082     /**
0083      * Remove a file from a target
0084      *
0085      * Removes the file specified by @p file from the folder @p parent and
0086      * modifies the underlying build system if needed. The file is not removed
0087      * from the folder it is in
0088      */
0089     bool removeFilesFromTargets(const QList<KDevelop::ProjectFileItem*>&) override;
0090 
0091     /**
0092      * Test if @p item has any includes or defines from this BSM
0093      */
0094     bool hasBuildInfo(KDevelop::ProjectBaseItem* item) const override;
0095 
0096     /**
0097      * Get the toplevel build directory for the project
0098      */
0099     KDevelop::Path buildDirectory(KDevelop::ProjectBaseItem*) const override;
0100 
0101     /**
0102      * Get a list of all the targets in this project
0103      *
0104      * The list returned by this function should be checked to verify it is not
0105      * empty before using it
0106      *
0107      * @return The list of targets for this project
0108      * @todo implement
0109      */
0110     QList<KDevelop::ProjectTargetItem*> targets(KDevelop::ProjectFolderItem*) const override;
0111 
0112     KDevelop::Path compiler(KDevelop::ProjectTargetItem * p) const override;
0113 
0114 protected:
0115     KDevelop::ProjectFileItem* createFileItem(KDevelop::IProject* project,
0116                                                       const KDevelop::Path& path,
0117                                                       KDevelop::ProjectBaseItem* parent) override;
0118     KDevelop::ProjectFolderItem* createFolderItem(KDevelop::IProject* project,
0119                                                           const KDevelop::Path& path,
0120                                                           KDevelop::ProjectBaseItem* parent = nullptr) override;
0121 
0122     void unload() override;
0123 
0124 private Q_SLOTS:
0125     void reloadMakefile(KDevelop::ProjectFileItem *item);
0126 
0127     void projectClosing(KDevelop::IProject*);
0128 
0129 private:
0130     /**
0131      * Initialize targets by reading Makefile in @arg dir
0132      * @return Target lists in Makefile at @arg dir.
0133      */
0134     QStringList parseCustomMakeFile( const KDevelop::Path &makefile );
0135 
0136     void createTargetItems(KDevelop::IProject* project, const KDevelop::Path& path, KDevelop::ProjectBaseItem* parent);
0137 
0138 private:
0139     IMakeBuilder *m_builder = nullptr;
0140     QScopedPointer<CustomMakeProvider> m_provider;
0141     QSet<QString> m_projectPaths;
0142     friend class CustomMakeProvider;
0143 };
0144 #endif