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

0001 /*
0002     SPDX-FileCopyrightText: 2004 Roberto Raggi <roberto@kdevelop.org>
0003     SPDX-FileCopyrightText: 2007 Andreas Pakulat <apaku@gmx.de>
0004     SPDX-FileCopyrightText: 2007 Dukju Ahn <dukjuahn@gmail.com>
0005 
0006     SPDX-License-Identifier: LGPL-2.0-or-later
0007 */
0008 
0009 #ifndef MAKEBUILDER_H
0010 #define MAKEBUILDER_H
0011 
0012 #include <interfaces/iplugin.h>
0013 
0014 #include <QVariantList>
0015 
0016 #include "imakebuilder.h"
0017 #include "makejob.h"
0018 
0019 #include <util/objectlist.h>
0020 
0021 namespace KDevelop {
0022 class ProjectBaseItem;
0023 }
0024 
0025 /**
0026 @author Roberto Raggi
0027 */
0028 class MakeBuilder: public KDevelop::IPlugin, public IMakeBuilder
0029 {
0030     Q_OBJECT
0031     Q_INTERFACES( IMakeBuilder )
0032     Q_INTERFACES( KDevelop::IProjectBuilder )
0033 public:
0034     explicit MakeBuilder(QObject *parent = nullptr, const QVariantList &args = QVariantList());
0035     ~MakeBuilder() override;
0036 
0037     /**
0038      * If argument is ProjectItem, invoke "make" in IBuildSystemManager::buildDirectory(), with
0039      * specified target in project setting.
0040      *
0041      * If argument is ProjectTargetItem, invoke "make" with targetname QStandardItem::text(). In this case,
0042      * it tries its best to fetch ProjectItem, which is the argument of IBuildSystemManager::buildDirectory()
0043      * If it fails to fetch ProjectItem, the top build directory is defaulted to project directory.
0044      * Based on top build directory, the actual build_dir is computed and handed to outputview
0045      *
0046      * If argument is ProjectBuildFolderItem, invoke "make" with specified target in project setting.
0047      * To determine the build directory, first calculates rel_dir between
0048      * top_project_dir(ProjectItem::url()) and ProjectBuildFolderItem::url().
0049      * Then invokes make in top_build_dir/rel_dir.
0050      * If this fails to fetch top_build_dir, just invoke "make" in ProjectBuildFolderItem::url().
0051      *
0052      * @TODO: Work on any project item, for fileitems you may find a target.
0053      */
0054     KJob* build(KDevelop::ProjectBaseItem *dom) override;
0055     KJob* clean(KDevelop::ProjectBaseItem *dom) override;
0056     KJob* install(KDevelop::ProjectBaseItem *dom, const QUrl &installPath) override;
0057 
0058     KJob* executeMakeTarget(KDevelop::ProjectBaseItem* item, const QString& targetname ) override;
0059     KJob* executeMakeTargets(KDevelop::ProjectBaseItem* item, const QStringList& targetnames,
0060                                      const MakeVariables& variables = MakeVariables() ) override;
0061     KJob* runMake( KDevelop::ProjectBaseItem*, MakeJob::CommandType, const QStringList& = QStringList(),
0062                    const MakeVariables& variables = MakeVariables() );
0063 
0064     int perProjectConfigPages() const override;
0065     KDevelop::ConfigPage* perProjectConfigPage(int number, const KDevelop::ProjectConfigOptions& options, QWidget* parent) override;
0066 
0067 Q_SIGNALS:
0068     void built( KDevelop::ProjectBaseItem* );
0069     void failed( KDevelop::ProjectBaseItem* );
0070     void installed(KDevelop::ProjectBaseItem*);
0071     void cleaned(KDevelop::ProjectBaseItem*);
0072     void makeTargetBuilt( KDevelop::ProjectBaseItem* item, const QString& targetname );
0073 
0074 private Q_SLOTS:
0075     void jobFinished(KJob* job);
0076 
0077 private:
0078     KDevelop::ObjectList<MakeJob> m_activeMakeJobs;
0079 };
0080 
0081 #endif // KDEVMAKEBUILDER_H
0082