2015-05-07 10 views
6

Auf meinem lokalen Dateisystem Ich habe folgende C Projektverzeichnisstruktur:Gradle C Plugin von Beispiel

derpus/ 
    src/ 
     derpus/ 
      c/ 
       derpus.c 
      headers/ 
    build.gradle 

Wo derpus.c ist:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
    puts("Derp!"); 
    return EXIT_SUCCESS; 
} 

Ich mag die Gradle Native (C) Plugin verwenden, um die Verwaltung komplettes Spektrum des derpus Builds. Insbesondere würde Ich mag Gradle an:

  1. eine Gradle Wrapper generieren, so dass ich gradlew für alle meine Build Anrufungen verwenden können; und
  2. Kompilieren & bauen derpus in derpus.exe über gradlew; und
  3. generieren Eclipse-Projekt Info, wenn ich laufen gradlew eclipse so kann ich dann das Projekt in Eclipse importieren (ich habe bereits vorinstalliert das Eclipse-CDT-Plugin)

Hier ist meine build.gradle:

apply plugin: 'c' 
apply plugin: 'eclipse' 

sources { 
    c { 
     source { 
      srcDir "src/derpus/c" 
      include "**/*.c" 
     } 
     exportedHeaders { 
      srcDir "src/derpus/headers" 
     } 
    } 
} 

task wrapper(type: Wrapper) { 
    gradleVersion = '2.3' 
} 

Offensichtlich sollte ich gradle wrapper ausführen können, um auf den ersten Gegenstand aufzupassen. Aber zum Kompilieren und Erstellen, nirgendwo in der C-Plugin-Dokumentation sehe ich tatsächlich einen Befehl oder Build-Aufruf , die tatsächlich eine Kompilierung und Build läuft!

Als drittes Element, mit dem Eclipse-Plugin und Aufruf über gradlew eclipse, frage ich mich, ob ich noch etwas tun muss, damit die resultierenden Projekt/Einstellungen-Konfigurationen mit dem Eclipse CDT-Plugin kompatibel sind um mit C-Programmen zu arbeiten. Obwohl ich beabsichtige, Gradle alle meine Builds behandeln zu lassen, möchte ich immer noch meine gesamte Entwicklung in Eclipse machen, und so ist mir all das wichtig, was CDT mitbringt (Syntaxhervorhebung, Kompilierung usw.).

Antwort

6

OK Ich dachte alle 3 aus und dachte, ich würde diese Antwort für zukünftige Leser veröffentlichen.

Bitte beachten Sie: Diese Lösung für moderne C-Programmierer, die wirklich auf lebensfähig ist:

  • tun wollen alle Entwicklung in Eclipse, die Vorteile der modernen IDE-Einrichtungen wie Syntaxhervorhebung, Fehler, zur Erklärung, offene Aufrufhierarchie, Eclipse-Debugger, etc .; aber ...
  • ein modernes Wollen, Kick-a ** Build-System wie Gradle alle Befehlszeile/Shell-Gebäude zu tun

Des Weiteren, weil ich auf Windows bin, entschied ich mich zu Verwenden Sie MinGW für meine GCC-Bereitstellung. Wenn Sie also entweder * nix oder Mac verwenden oder Cygwin bevorzugen, müssen Sie diese Lösung noch weiter anpassen.

Noch weiter, ich habe nur verifiziert, das funktioniert mit Eclipse Luna, mit dem neuesten Eclipse CDT-Plugin (8.6) und Gradle 2.3 verwenden.

Lösung

Zuerst hatte ich meine Verwendung des C-Plugin zu korrigieren, meine build.gradle Wechsel wie folgt aussehen:

apply plugin: 'c' 
apply plugin: 'eclipse' 

model { 
    components { 
     derpus(NativeExecutableSpec) { 
      sources { 
       c(CSourceSet) { 
        source { 
         srcDir "src/derpus/c" 
         include "**/*.c" 
        } 
        exportedHeaders { 
         srcDir "src/derpus/headers" 
        } 
       } 
      } 
     } 
    } 
} 

task wrapper(type: Wrapper) { 
    gradleVersion = '2.3' 
} 

Das bin ich gradle wrapper ohne Fehler ablaufen.

Als nächstes fand ich es sehr eigenartig, dass die Graadle Native Binaries Dokumentation nie erwähnt den Build-Aufruf zum Kompilieren/Erstellen von nativen ausführbaren Dateien. Ich nahm eine wilde Vermutung, dass es Gradle's "convention over configuration" Ansatz nutzen könnte, und ich lief gradlew build - voila! Großer Erfolg. Jetzt unter derpus/build/binaries/derpusExecutable habe ich derpus.exe! So weit, ist es gut.

Die wahren Kopfschmerzen setzt ein, wenn Sie jetzt dieses Gradle-gesteuerte Projekt in Eclipse importieren möchten, aber Eclipse CDT immer noch alle normalen Funktionen einer modernen C IDE bieten.

begann ich durch Laufen gradlew eclipse, die hinzugefügt, um die folgenden Dateien unter dem derpus/ Projektstamm aus:

  • .project
  • .settings/language.settings

Ich öffnete Eclipse und importiert sie als Projekt jedoch Ich habe alle Arten von Fehlern, und wenn ich über #include <stdio.h> in meiner derpus.c Datei schwebte und klickte F3, Eclipse di d nichts. Klar war noch etwas nicht richtig konfiguriert. Und so fing ich an zu hacken.

stellte sich heraus, Sie müssen nur:

  • Natürlich zuerst sicher, das CDT-Plugin installiert ist und ordnungsgemäß funktioniert (doh!)
  • Erstellen Sie eine "Dummy" C-Projekt in Eclipse, denen erlauben Sie Eclipse-CDT-generierten Einstellungen/configs zu Ihrem tatsächlichen Projekt
  • ändern Sie bitte Ihre tatsächliche .project Datei kopieren n‘fügen Sie die gleichen <buildSpec /> und <natures /> Elemente enthalten, die in dem Dummy-Projekt generiert wurden .project Datei
  • Kopieren Sie die Datei .cproject des Dummy-Projekts in das Stammverzeichnis Ihres aktuellen Projekts und öffnen Sie sie dann in einem Texteditor. Sie möchten alle Instanzen des Dummy-Projektnamens mit dem Namen Ihres aktuellen Projekts umbenennen; in meinem Fall gab es 3 Instanzen. In meinem Fall wurde mein Dummy-Projekt buchstäblich dummy genannt, und mein aktuelles Projekt heißt derpus. Also musste ich 3 Instanzen von dummy zu derpus in dieser Datei ändern.
  • Neustart von Eclipse

Ihr aktuelles Projekt verhält sich nun genau die gleiche Weise wie ein C-Projekt mit der CDT-Plugin erstellt.Vergessen Sie nicht, dass Sie „Dummy“ Projekt löschen ;-)

1

Sie können die C++ Natur in das Projekt mit Hilfe von:

  1. erstellen gradle Projekt
  2. wählen Sie das Projekt
  3. verwenden Eclipse-> neuen-> andere
  4. wählen C++ -> zu einem C++ konvertiert Projekt
  5. das Projekt aufzuräumen
+0

Arbeitete für mich, indem ich zuerst als Gradle-Projekt importiere und danach die C/C++ - Natur wie oben erwähnt hinzufügte (Eclipse Oxygen/Gradle 4.0). Kein Umständliches mit Konfigurationsdateien! – lazlev

0

hätte gerade versucht, diese (mit Gradle 4.3), und ich möchte darauf hinweisen, dass Sie den model Abschnitt vereinfachen:

model { 
    components { 
     derpus(NativeExecutableSpec) 
    } 
} 

weil das Quellverzeichnis standardmäßig "src/derpus/c" sowieso.

Verwandte Themen