diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,6 +29,7 @@ enable_testing() +add_subdirectory(go-buildsystem) add_subdirectory(parser) add_subdirectory(duchain) add_subdirectory(codecompletion) diff --git a/go-buildsystem/CMakeLists.txt b/go-buildsystem/CMakeLists.txt new file mode 100644 --- /dev/null +++ b/go-buildsystem/CMakeLists.txt @@ -0,0 +1,13 @@ +add_definitions(-DTRANSLATION_DOMAIN=\"go-buildsystem\") + +set(gobuildsystem_PART_SRCS + gobuildsystem.cpp + gobuilder.cpp +) + +qt5_add_resources(gobuildsystem_PART_SRCS gobuildsystem.qrc) +kdevplatform_add_plugin(gobuildsystem JSON gobuildsystem.json SOURCES ${gobuildsystem_PART_SRCS}) +target_link_libraries(gobuildsystem + KF5::KIOWidgets + KDev::Interfaces KDev::Project KDev::Util KDev::Language KDev::OutputView +) diff --git a/go-buildsystem/gobuilder.h b/go-buildsystem/gobuilder.h new file mode 100644 --- /dev/null +++ b/go-buildsystem/gobuilder.h @@ -0,0 +1,33 @@ +/* KDevelop go build support + * + * Copyright 2017 Mikhail Ivchenko + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + */ +#ifndef GOBUILDER_H +#define GOBUILDER_H + +#include + +namespace KDevelop { + class ProjectBaseItem; +} + +class GoBuilder: public QObject, public KDevelop::IProjectBuilder +{ + Q_OBJECT + Q_INTERFACES(KDevelop::IProjectBuilder) +public: + KJob* build(KDevelop::ProjectBaseItem *dom) override; + KJob* clean(KDevelop::ProjectBaseItem *dom) override; + KJob* install(KDevelop::ProjectBaseItem *dom, const QUrl &installPath) override; + +private: + KJob *createJobForAction(KDevelop::ProjectBaseItem *dom, const QString &action) const; +}; + +#endif // GOBUILDER_H + diff --git a/go-buildsystem/gobuilder.cpp b/go-buildsystem/gobuilder.cpp new file mode 100644 --- /dev/null +++ b/go-buildsystem/gobuilder.cpp @@ -0,0 +1,44 @@ +/* KDevelop go build support + * + * Copyright 2017 Mikhail Ivchenko + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + */ + +#include "gobuilder.h" + +#include +#include +#include +#include + +KJob* GoBuilder::build( KDevelop::ProjectBaseItem *dom ) +{ + return createJobForAction(dom, "build"); +} + +KJob* GoBuilder::clean( KDevelop::ProjectBaseItem *dom ) +{ + return createJobForAction(dom, "clean"); +} + +KJob* GoBuilder::install(KDevelop::ProjectBaseItem *dom, const QUrl &installPath) +{ + Q_UNUSED(installPath) + return createJobForAction(dom, "install"); +} + +KJob* GoBuilder::createJobForAction(KDevelop::ProjectBaseItem *dom, const QString &action) const +{ + auto bsm = dom->project()->buildSystemManager(); + auto buildDir = bsm->buildDirectory(dom); + auto job = new KDevelop::OutputExecuteJob(); + (*job) << "/usr/bin/go" << action; + job->setWorkingDirectory(buildDir.toUrl()); + return job; +} + +#include "gobuilder.moc" diff --git a/go-buildsystem/gobuildsystem.h b/go-buildsystem/gobuildsystem.h new file mode 100644 --- /dev/null +++ b/go-buildsystem/gobuildsystem.h @@ -0,0 +1,44 @@ +/* KDevelop go build support + * + * Copyright 2017 Mikhail Ivchenko + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + */ + +#ifndef GOBUILDSYSTEM_H +#define GOBUILDSYSTEM_H + +#include +#include + +class GoBuildSystem : public KDevelop::AbstractFileManagerPlugin, + public KDevelop::IBuildSystemManager +{ + Q_OBJECT + Q_INTERFACES( KDevelop::IBuildSystemManager ) +public: + + GoBuildSystem(QObject* parent = nullptr, const QVariantList& args = QVariantList()); + + ~GoBuildSystem() override; + + Features features() const override { return Features(Folders | Targets | Files); } + KDevelop::IProjectBuilder* builder() const override; + KDevelop::Path::List includeDirectories(KDevelop::ProjectBaseItem*) const override; + KDevelop::Path::List frameworkDirectories(KDevelop::ProjectBaseItem*) const override; + QHash defines(KDevelop::ProjectBaseItem*) const override; + KDevelop::ProjectTargetItem* createTarget(const QString& target, KDevelop::ProjectFolderItem *parent) override; + bool addFilesToTarget(const QList &files, KDevelop::ProjectTargetItem *parent) override; + bool removeTarget(KDevelop::ProjectTargetItem *target) override; + bool removeFilesFromTargets(const QList&) override; + bool hasBuildInfo(KDevelop::ProjectBaseItem* item) const override; + KDevelop::Path buildDirectory(KDevelop::ProjectBaseItem*) const override; + QList targets(KDevelop::ProjectFolderItem*) const override; + +private: + KDevelop::IProjectBuilder* m_builder; +}; +#endif diff --git a/go-buildsystem/gobuildsystem.cpp b/go-buildsystem/gobuildsystem.cpp new file mode 100644 --- /dev/null +++ b/go-buildsystem/gobuildsystem.cpp @@ -0,0 +1,114 @@ +/* KDevelop go build support + * + * Copyright 2017 Mikhail Ivchenko + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + */ + +#include "gobuildsystem.h" + +#include "gobuilder.h" +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + + +using namespace KDevelop; + +K_PLUGIN_FACTORY_WITH_JSON(GoBuildSystemFactory, "gobuildsystem.json", registerPlugin(); ) + +GoBuildSystem::GoBuildSystem( QObject *parent, const QVariantList& args ) +: KDevelop::AbstractFileManagerPlugin( "gobuildsystem", parent ), m_builder(new GoBuilder()) +{ + Q_UNUSED(args) + + setXMLFile( "gobuildsystem.rc" ); +} + +GoBuildSystem::~GoBuildSystem() +{ +} + +IProjectBuilder* GoBuildSystem::builder() const +{ + return m_builder; +} + +Path::List GoBuildSystem::includeDirectories(KDevelop::ProjectBaseItem*) const +{ + return Path::List(); +} + +Path::List GoBuildSystem::frameworkDirectories(KDevelop::ProjectBaseItem*) const +{ + return Path::List(); +} + +QHash GoBuildSystem::defines(KDevelop::ProjectBaseItem*) const +{ + return QHash(); +} + +ProjectTargetItem* GoBuildSystem::createTarget(const QString& target, KDevelop::ProjectFolderItem *parent) +{ + Q_UNUSED(target) + Q_UNUSED(parent) + return nullptr; +} + +bool GoBuildSystem::addFilesToTarget(const QList< ProjectFileItem* > &files, ProjectTargetItem* parent) +{ + Q_UNUSED( files ) + Q_UNUSED( parent ) + return false; +} + +bool GoBuildSystem::removeTarget(KDevelop::ProjectTargetItem *target) +{ + Q_UNUSED( target ) + return false; +} + +bool GoBuildSystem::removeFilesFromTargets(const QList< ProjectFileItem* > &targetFiles) +{ + Q_UNUSED( targetFiles ) + return false; +} + +bool GoBuildSystem::hasBuildInfo(KDevelop::ProjectBaseItem* item) const +{ + Q_UNUSED(item); + return false; +} + +Path GoBuildSystem::buildDirectory(KDevelop::ProjectBaseItem* item) const +{ + ProjectFolderItem *fi = dynamic_cast(item); + for(; !fi && item; ) + { + item = item->parent(); + fi = dynamic_cast(item); + } + if(!fi) { + return item->project()->path(); + } + return fi->path(); +} + +QList GoBuildSystem::targets(KDevelop::ProjectFolderItem*) const +{ + return QList(); +} + +#include "gobuildsystem.moc" diff --git a/go-buildsystem/gobuildsystem.json b/go-buildsystem/gobuildsystem.json new file mode 100644 --- /dev/null +++ b/go-buildsystem/gobuildsystem.json @@ -0,0 +1,22 @@ +{ + "KPlugin": { + "Category": "Project Management", + "Description": "Imports go projects", + "Icon": "kdevelop", + "Id": "KDevGoBuildSystem", + "Name": "Go Project Manager", + "ServiceTypes": [ + "KDevelop/Plugin" + ] + }, + "X-KDevelop-FileManager": "Go", + "X-KDevelop-IRequired": [ + "org.kdevelop.IMakeBuilder", + "org.kdevelop.IDefinesAndIncludesManager" + ], + "X-KDevelop-Interfaces": [ + "org.kdevelop.IBuildSystemManager", + "org.kdevelop.IProjectFileManager" + ], + "X-KDevelop-Mode": "NoGUI" +} diff --git a/go-buildsystem/gobuildsystem.qrc b/go-buildsystem/gobuildsystem.qrc new file mode 100644 --- /dev/null +++ b/go-buildsystem/gobuildsystem.qrc @@ -0,0 +1,6 @@ + + + + gobuildsystem.rc + + diff --git a/go-buildsystem/gobuildsystem.rc b/go-buildsystem/gobuildsystem.rc new file mode 100644 --- /dev/null +++ b/go-buildsystem/gobuildsystem.rc @@ -0,0 +1,9 @@ + + + + + Run + + + +