File indexing completed on 2024-05-05 16:46:01

0001 /*
0002     SPDX-FileCopyrightText: 2017 Aleix Pol Gonzalez <aleixpol@kde.org>
0003     SPDX-FileCopyrightText: 2018 Daniel Mensinger <daniel@mensinger-ka.de>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #pragma once
0009 
0010 #include <project/interfaces/iprojectbuilder.h>
0011 #include <util/path.h>
0012 
0013 namespace Meson
0014 {
0015 struct BuildDir;
0016 }
0017 
0018 class MesonBuilder : public QObject, public KDevelop::IProjectBuilder
0019 {
0020     Q_OBJECT
0021     Q_INTERFACES(KDevelop::IProjectBuilder)
0022 public:
0023     enum DirectoryStatus {
0024         DOES_NOT_EXIST = 0,
0025         CLEAN,
0026         MESON_CONFIGURED,
0027         MESON_FAILED_CONFIGURATION,
0028         INVALID_BUILD_DIR,
0029         DIR_NOT_EMPTY,
0030         EMPTY_STRING,
0031         ___UNDEFINED___
0032     };
0033 
0034     explicit MesonBuilder(QObject* parent);
0035 
0036     KJob* build(KDevelop::ProjectBaseItem* item) override;
0037     KJob* clean(KDevelop::ProjectBaseItem* item) override;
0038     KJob* install(KDevelop::ProjectBaseItem* dom, const QUrl& installPath) override;
0039     KJob* prune(KDevelop::IProject* project) override;
0040 
0041     KJob* configure(KDevelop::IProject* project) override;
0042     KJob* configure(KDevelop::IProject* project, const Meson::BuildDir& buildDir, QStringList args,
0043                     DirectoryStatus status = ___UNDEFINED___);
0044 
0045     /// Evaluate a directory for the use with meson
0046     static DirectoryStatus evaluateBuildDirectory(const KDevelop::Path& path, const QString& backend);
0047 
0048     bool hasError() const;
0049     QString errorDescription() const;
0050 
0051     QList<KDevelop::IProjectBuilder*> additionalBuilderPlugins(KDevelop::IProject* project) const override;
0052 
0053 Q_SIGNALS:
0054     void built(KDevelop::ProjectBaseItem*);
0055     void installed(KDevelop::ProjectBaseItem*);
0056     void cleaned(KDevelop::ProjectBaseItem*);
0057     void failed(KDevelop::ProjectBaseItem*);
0058     void configured(KDevelop::IProject*);
0059     void pruned(KDevelop::IProject*);
0060 
0061 private:
0062     KDevelop::IProjectBuilder* m_ninjaBuilder = nullptr;
0063     QString m_errorString;
0064 
0065     KJob* configureIfRequired(KDevelop::IProject* project, KJob* realJob);
0066 };