File indexing completed on 2024-05-19 15:45:27
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