2015-05-07 16 views
6

Sul mio file system locale ho il seguente progetto di C struttura di directory:Gradle C Plugin by Example

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

Dove derpus.c è:

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

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

Vorrei utilizzare il Gradle Native (C) Plugin per gestire il spettro completo della build derpus. In particolare vorrei Gradle a:

  1. generare un wrapper Gradle in modo che posso usare gradlew per tutte le mie invocazioni di compilazione; e
  2. Compilare & in derpus in derpus.exe tramite gradlew; e
  3. Generare Eclipse informazioni progetto quando corro gradlew eclipse in modo da poter poi importare il progetto in Eclipse (ho già pre-installato il plugin di Eclipse CDT)

Ecco il mio 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' 
} 

Ovviamente dovrei essere in grado di eseguire gradle wrapper per occuparsi del primo elemento. Ma per quanto riguarda la compilazione e la compilazione, in nessun punto dei documenti del plugin C vedo effettivamente un comando o una chiamata di build che esegue effettivamente una compilazione e crea!

Per quanto riguarda il terzo elemento, utilizzando il plug-in Eclipse e invocandolo tramite gradlew eclipse, mi chiedo se c'è qualcos'altro che devo fare in modo che le configurazioni risultanti del progetto/impostazioni siano compatibili con ciò che il plugin Eclipse CDT si aspetta in ordine di lavorare con i programmi C. Anche se intendo lasciare che Gradle gestisca tutte le mie build, voglio comunque fare tutto il mio sviluppo in Eclipse, e quindi tutte le cose che il CDT include (evidenziazione della sintassi, compilazione, ecc.) Sono importanti per me.

risposta

6

OK Ho capito tutti e 3, e ho pensato di pubblicare questa risposta per ogni futuro lettore.

Si prega di notare: Questa soluzione è davvero il possibile per moderni programmatori C che:

  • vuole fare tutto sviluppo in Eclipse, approfittando di moderne strutture IDE come l'evidenziazione della sintassi, errori, dichiarazione goto, aprire la gerarchia di chiamate, il debugger di Eclipse e così via; ma ...
  • Vuoi un moderno, kick-a ** sistema di compilazione come Gradle di fare tutto l'edificio della riga di comando/shell

Inoltre, perché sono su Windows, ho scelto di usa MinGW per il mio provisioning GCC, quindi se sei su * nix o Mac, o se preferisci Cygwin, dovrai personalizzare ulteriormente questa soluzione.

Inoltre, ho solo verificato che questo funziona con Eclipse Luna, utilizzando l'ultimo plugin Eclipse CDT (8.6) e utilizzando Gradle 2.3.

Soluzione

Per prima cosa ho dovuto correggere il mio utilizzo del plugin C, cambiando il mio build.gradle a guardare come questo:

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' 
} 

Questo mi ha permesso di correre gradle wrapper senza errori.

Successivamente, ho iniziato a trovare molto strano che la documentazione di Gradle Native Binaries mai menzioni la chiamata di build per la compilazione/costruzione di eseguibili nativi. Ho immaginato che sarebbe stato possibile sfruttare l'approccio di "convention over configuration" di Gradle, e ho eseguito gradlew build - voilà! Grande successo. Ora sotto derpus/build/binaries/derpusExecutable ho derpus.exe! Fin qui tutto bene.

Il vero problema si verifica quando si desidera importare questo progetto gestito da Gradle in Eclipse, ma è comunque possibile che Eclipse CDT fornisca tutte le normali funzionalità di un moderno IDE C.

Ho iniziato eseguendo gradlew eclipse, che ha aggiunto le seguenti file sotto la root derpus/ progetto:

  • .project
  • .settings/language.settings

ho aperto Eclipse e importato come un progetto, però Ho avuto tutti i tipi di errori e quando ho passato il tempo sopra lo #include <stdio.h> nel mio file derpus.c e ho fatto clic su F3, Eclipse di d niente. Chiaramente qualcosa non era ancora configurato correttamente. E così ho avuto modo di hackerare.

scopre che basta:

  • Naturalmente, prima assicurarsi che sia installato il plugin CDT e funziona correttamente (doh!)
  • Creare un progetto C "fittizio" in Eclipse, che sarà consentono di copiare n' incollare le impostazioni Eclipse CDT-generati/configurazioni al attuale progetto
  • Modificare il file vero e proprio .project per includere gli stessi <buildSpec /> e <natures /> elementi che sono stati generati nel progetto manichino .project file
  • Copiare il file .cproject del progetto fittizio sulla radice del progetto corrente, quindi aprirlo in un editor di testo. Vuoi rinominare TUTTE le istanze del nome del progetto fittizio con il nome del tuo progetto attuale; nel mio caso ci sono state 3 istanze. Nel mio caso, il mio progetto fittizio è stato letteralmente denominato dummy e il mio progetto effettivo è denominato derpus. Quindi ho dovuto modificare 3 istanze di dummy in derpus in questo file.
  • riavviare Eclipse

Il progetto vero e proprio ora si comportano esattamente allo stesso modo di un progetto C creato con il plugin CDT.Non dimenticate di eliminare te progetto "fittizio" ;-)

1

È possibile aggiungere il ++ natura c al progetto con l'aiuto di:

  1. creare un progetto Gradle
  2. selezionare il progetto
  3. utilizzare Eclipse-> Nuovo-> altri
  4. selezionare C++ -> Converti in un C++ progetto
  5. ripulire il progetto
+0

Ha funzionato per me importando prima come progetto Gradle e successivamente aggiungendo la natura C/C++ come menzionato sopra (Eclipse Oxygen/Gradle 4.0). Non scherzare con i file di configurazione! – lazlev

0

appena provato questo (con Gradle 4.3), e vorrei sottolineare che è possibile semplificare la sezione model a:

model { 
    components { 
     derpus(NativeExecutableSpec) 
    } 
} 

perché i valori di default directory sorgente "src/derpus/c" comunque.

Problemi correlati