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"