File indexing completed on 2024-04-28 04:39:10

0001 /*
0002     SPDX-FileCopyrightText: 2006-2007 Andreas Pakulat <apaku@gmx.de>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "qmakebuilder.h"
0008 
0009 #include "qmakebuilderpreferences.h"
0010 #include "qmakeconfig.h"
0011 #include "qmakeutils.h"
0012 
0013 #include <project/projectmodel.h>
0014 
0015 #include <interfaces/iproject.h>
0016 #include <interfaces/icore.h>
0017 #include <interfaces/iplugincontroller.h>
0018 #include <makebuilder/imakebuilder.h>
0019 
0020 #include <KPluginFactory>
0021 
0022 #include "qmakejob.h"
0023 #include <debug.h>
0024 
0025 using namespace KDevelop;
0026 
0027 K_PLUGIN_FACTORY_WITH_JSON(QMakeBuilderFactory, "kdevqmakebuilder.json", registerPlugin<QMakeBuilder>();)
0028 
0029 QMakeBuilder::QMakeBuilder(QObject* parent, const QVariantList&)
0030     : KDevelop::IPlugin(QStringLiteral("kdevqmakebuilder"), parent)
0031 {
0032     m_makeBuilder = core()->pluginController()->pluginForExtension(QStringLiteral("org.kdevelop.IMakeBuilder"));
0033     if (m_makeBuilder) {
0034         auto* mbuilder = m_makeBuilder->extension<IMakeBuilder>();
0035         if (mbuilder) {
0036             connect(m_makeBuilder, SIGNAL(built(KDevelop::ProjectBaseItem*)), this,
0037                     SIGNAL(built(KDevelop::ProjectBaseItem*)));
0038             connect(m_makeBuilder, SIGNAL(cleaned(KDevelop::ProjectBaseItem*)), this,
0039                     SIGNAL(cleaned(KDevelop::ProjectBaseItem*)));
0040             connect(m_makeBuilder, SIGNAL(installed(KDevelop::ProjectBaseItem*)), this,
0041                     SIGNAL(installed(KDevelop::ProjectBaseItem*)));
0042             connect(m_makeBuilder, SIGNAL(failed(KDevelop::ProjectBaseItem*)), this,
0043                     SIGNAL(failed(KDevelop::ProjectBaseItem*)));
0044             connect(m_makeBuilder, SIGNAL(makeTargetBuilt(KDevelop::ProjectBaseItem*,QString)), this,
0045                     SIGNAL(pruned(KDevelop::ProjectBaseItem*)));
0046         }
0047     }
0048 }
0049 
0050 QMakeBuilder::~QMakeBuilder()
0051 {
0052 }
0053 
0054 KJob* QMakeBuilder::prune(KDevelop::IProject* project)
0055 {
0056     qCDebug(KDEV_QMAKEBUILDER) << "Distcleaning";
0057     if (m_makeBuilder) {
0058         auto* builder = m_makeBuilder->extension<IMakeBuilder>();
0059         if (builder) {
0060             qCDebug(KDEV_QMAKEBUILDER) << "Distcleaning with make";
0061             return builder->executeMakeTarget(project->projectItem(), QStringLiteral("distclean"));
0062         }
0063     }
0064     return nullptr;
0065 }
0066 
0067 KJob* QMakeBuilder::build(KDevelop::ProjectBaseItem* dom)
0068 {
0069     qCDebug(KDEV_QMAKEBUILDER) << "Building";
0070     if (m_makeBuilder) {
0071         auto* builder = m_makeBuilder->extension<IMakeBuilder>();
0072         if (builder) {
0073             qCDebug(KDEV_QMAKEBUILDER) << "Building with make";
0074             return maybePrependConfigureJob(dom, builder->build(dom), BuilderJob::Build);
0075         }
0076     }
0077     return nullptr;
0078 }
0079 
0080 KJob* QMakeBuilder::configure(KDevelop::IProject* project)
0081 {
0082     auto job = new QMakeJob(this);
0083     job->setProject(project);
0084     return job;
0085 }
0086 
0087 KJob* QMakeBuilder::clean(KDevelop::ProjectBaseItem* dom)
0088 {
0089     qCDebug(KDEV_QMAKEBUILDER) << "Cleaning";
0090     if (m_makeBuilder) {
0091         auto* builder = m_makeBuilder->extension<IMakeBuilder>();
0092         if (builder) {
0093             qCDebug(KDEV_QMAKEBUILDER) << "Cleaning with make";
0094             return maybePrependConfigureJob(dom, builder->clean(dom), BuilderJob::Clean);
0095         }
0096     }
0097     return nullptr;
0098 }
0099 
0100 KJob* QMakeBuilder::install(KDevelop::ProjectBaseItem* dom, const QUrl& /* prefix */)
0101 {
0102     qCDebug(KDEV_QMAKEBUILDER) << "Installing";
0103     if (m_makeBuilder) {
0104         auto* builder = m_makeBuilder->extension<IMakeBuilder>();
0105         if (builder) {
0106             qCDebug(KDEV_QMAKEBUILDER) << "Installing with make";
0107             return maybePrependConfigureJob(dom, builder->install(dom), BuilderJob::Install);
0108         }
0109     }
0110     return nullptr;
0111 }
0112 
0113 int QMakeBuilder::perProjectConfigPages() const
0114 {
0115     return 1;
0116 }
0117 
0118 KDevelop::ConfigPage* QMakeBuilder::perProjectConfigPage(int number, const KDevelop::ProjectConfigOptions& options,
0119                                                          QWidget* parent)
0120 {
0121     switch (number) {
0122     case 0:
0123         return new QMakeBuilderPreferences(this, options, parent);
0124     default:
0125         return nullptr;
0126     }
0127 }
0128 
0129 QList<IProjectBuilder*> QMakeBuilder::additionalBuilderPlugins(KDevelop::IProject* project) const
0130 {
0131     Q_UNUSED(project);
0132 
0133     if (auto* makeBuilder = m_makeBuilder->extension<IMakeBuilder>()) {
0134         return QList<KDevelop::IProjectBuilder*>() << makeBuilder;
0135     }
0136 
0137     return QList<IProjectBuilder*>();
0138 }
0139 
0140 KJob* QMakeBuilder::maybePrependConfigureJob(ProjectBaseItem* dom, KJob* job, BuilderJob::BuildType type)
0141 {
0142     Q_ASSERT(dom);
0143 
0144     if (!job) {
0145         qCDebug(KDEV_QMAKEBUILDER) << "Null job passed";
0146         return nullptr;
0147     }
0148 
0149     const bool needsConfigure = QMakeUtils::checkForNeedingConfigure(dom->project());
0150     if (needsConfigure) {
0151         qCDebug(KDEV_QMAKEBUILDER) << "Project" << dom->project()->name() << "needs configure";
0152 
0153         auto builderJob = new BuilderJob;
0154         builderJob->addCustomJob(BuilderJob::Configure, configure(dom->project()), dom);
0155         builderJob->addCustomJob(type, job, dom);
0156         builderJob->updateJobName();
0157         return builderJob;
0158     }
0159 
0160     return job;
0161 }
0162 
0163 #include "qmakebuilder.moc"
0164 #include "moc_qmakebuilder.cpp"