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

0001 /*
0002     SPDX-FileCopyrightText: 2010 Andreas Pakulat <apaku@gmx.de>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-or-later
0005 */
0006 
0007 #include "custombuildsystemplugin.h"
0008 
0009 #include <KPluginFactory>
0010 #include <KLocalizedString>
0011 
0012 #include <project/projectmodel.h>
0013 #include <interfaces/iproject.h>
0014 #include "configconstants.h"
0015 #include "kcm_custombuildsystem.h"
0016 
0017 #include "custombuildjob.h"
0018 
0019 using KDevelop::ProjectTargetItem;
0020 using KDevelop::ProjectFolderItem;
0021 using KDevelop::ProjectBuildFolderItem;
0022 using KDevelop::ProjectBaseItem;
0023 using KDevelop::ProjectFileItem;
0024 using KDevelop::IPlugin;
0025 using KDevelop::ICore;
0026 using KDevelop::IOutputView;
0027 using KDevelop::IProjectFileManager;
0028 using KDevelop::IProjectBuilder;
0029 using KDevelop::IProject;
0030 using KDevelop::Path;
0031 
0032 K_PLUGIN_FACTORY_WITH_JSON(CustomBuildSystemFactory, "kdevcustombuildsystem.json", registerPlugin<CustomBuildSystem>(); )
0033 
0034 CustomBuildSystem::CustomBuildSystem( QObject *parent, const QVariantList & )
0035     : AbstractFileManagerPlugin( QStringLiteral("kdevcustombuildsystem"), parent )
0036 {
0037 }
0038 
0039 CustomBuildSystem::~CustomBuildSystem()
0040 {
0041 }
0042 
0043 bool CustomBuildSystem::addFilesToTarget( const QList<ProjectFileItem*>&, ProjectTargetItem* )
0044 {
0045     return false;
0046 }
0047 
0048 bool CustomBuildSystem::hasBuildInfo( ProjectBaseItem* ) const
0049 {
0050     return false;
0051 }
0052 
0053 KJob* CustomBuildSystem::build( ProjectBaseItem* dom )
0054 {
0055     return new CustomBuildJob( this, dom, CustomBuildSystemTool::Build );
0056 }
0057 
0058 Path CustomBuildSystem::buildDirectory( ProjectBaseItem*  item ) const
0059 {
0060     Path p;
0061     if( item->folder() ) {
0062         p = item->path();
0063     } else {
0064         ProjectBaseItem* parent = item;
0065         while( !parent->folder() ) {
0066             parent = parent->parent();
0067         }
0068         p = parent->path();
0069     }
0070     const QString relative = item->project()->path().relativePath(p);
0071     KConfigGroup grp = configuration( item->project() );
0072     if(!grp.isValid()) {
0073         return Path();
0074     }
0075 
0076     Path builddir(grp.readEntry(ConfigConstants::buildDirKey(), QUrl()));
0077     if(!builddir.isValid() )  // set builddir to default if project contains a buildDirKey that does not have a value
0078     {
0079         builddir = item->project()->path();
0080     }
0081     builddir.addPath( relative );
0082     return builddir;
0083 }
0084 
0085 IProjectBuilder* CustomBuildSystem::builder() const
0086 {
0087     return const_cast<IProjectBuilder*>(dynamic_cast<const IProjectBuilder*>(this));
0088 }
0089 
0090 KJob* CustomBuildSystem::clean( ProjectBaseItem* dom )
0091 {
0092     return new CustomBuildJob( this, dom, CustomBuildSystemTool::Clean );
0093 }
0094 
0095 KJob* CustomBuildSystem::configure( IProject* project )
0096 {
0097     return new CustomBuildJob( this, project->projectItem(), CustomBuildSystemTool::Configure );
0098 }
0099 
0100 ProjectTargetItem* CustomBuildSystem::createTarget( const QString&, ProjectFolderItem* )
0101 {
0102     return nullptr;
0103 }
0104 
0105 QHash<QString, QString> CustomBuildSystem::defines( ProjectBaseItem* ) const
0106 {
0107     return {};
0108 }
0109 
0110 IProjectFileManager::Features CustomBuildSystem::features() const
0111 {
0112     return IProjectFileManager::Files | IProjectFileManager::Folders;
0113 }
0114 
0115 ProjectFolderItem* CustomBuildSystem::createFolderItem( IProject* project,
0116                     const Path& path, ProjectBaseItem* parent )
0117 {
0118     return new ProjectBuildFolderItem( project, path, parent );
0119 }
0120 
0121 Path::List CustomBuildSystem::includeDirectories( ProjectBaseItem* ) const
0122 {
0123     return {};
0124 }
0125 
0126 Path::List CustomBuildSystem::frameworkDirectories( ProjectBaseItem* ) const
0127 {
0128     return {};
0129 }
0130 
0131 QString CustomBuildSystem::extraArguments(KDevelop::ProjectBaseItem*) const
0132 {
0133     return {};
0134 }
0135 
0136 KJob* CustomBuildSystem::install( KDevelop::ProjectBaseItem* item, const QUrl &installPrefix )
0137 {
0138     auto job = new CustomBuildJob( this, item, CustomBuildSystemTool::Install );
0139     job->setInstallPrefix(installPrefix);
0140     return job;
0141 }
0142 
0143 KJob* CustomBuildSystem::prune( IProject* project )
0144 {
0145     return new CustomBuildJob( this, project->projectItem(), CustomBuildSystemTool::Prune );
0146 }
0147 
0148 bool CustomBuildSystem::removeFilesFromTargets( const QList<ProjectFileItem*>& )
0149 {
0150     return false;
0151 }
0152 
0153 bool CustomBuildSystem::removeTarget( ProjectTargetItem* )
0154 {
0155     return false;
0156 }
0157 
0158 QList<ProjectTargetItem*> CustomBuildSystem::targets( ProjectFolderItem* ) const
0159 {
0160     return QList<ProjectTargetItem*>();
0161 }
0162 
0163 KConfigGroup CustomBuildSystem::configuration( IProject* project ) const
0164 {
0165     KConfigGroup grp = project->projectConfiguration()->group(ConfigConstants::customBuildSystemGroup());
0166     if (grp.isValid() && grp.hasKey(ConfigConstants::currentConfigKey()))
0167         return grp.group(grp.readEntry(ConfigConstants::currentConfigKey()));
0168     else
0169         return KConfigGroup();
0170 }
0171 
0172 int CustomBuildSystem::perProjectConfigPages() const
0173 {
0174     return 1;
0175 }
0176 
0177 KDevelop::ConfigPage* CustomBuildSystem::perProjectConfigPage(int number, const KDevelop::ProjectConfigOptions& options, QWidget* parent)
0178 {
0179     if (number == 0) {
0180         return new CustomBuildSystemKCModule(this, options, parent);
0181     }
0182     return nullptr;
0183 }
0184 
0185 KDevelop::Path CustomBuildSystem::compiler(KDevelop::ProjectTargetItem* item) const
0186 {
0187     Q_UNUSED(item);
0188     return {};
0189 }
0190 
0191 #include "custombuildsystemplugin.moc"
0192 #include "moc_custombuildsystemplugin.cpp"