2009-06-23 11 views
20

Sto cercando in scons e voglio solo essere sicuro di sapere quali sono le alternative, prima di investire un pezzo di cellule cerebrali in qualcosa di completamente diverso. Ho usato GNU make in passato, ma non sono mai stato particolarmente soddisfatto.ant + cpptasks vs. scons vs. make

In particolare: perché Ant non viene utilizzato più spesso con progetti C/C++? (dato che c'è ant cpptasks) ho letto alcuni post che dicono che Ant è più orientato su Java (ovviamente), ma quale è lo svantaggio di farlo? E perché gli scons sono molto meglio che fare?

Sto lavorando con un cross-compiler per DSP TI, in genere ci sono 20-50 file cpp in un progetto. Sembrerebbe che la parte più difficile nella gestione delle build sia il controllo automatico delle dipendenze. Tutto il resto sta solo mappando liste di file insieme a set di opzioni del compilatore.

modifica: e perché la compilazione incrociata modifica qualcosa? è un compilatore che funziona allo stesso modo di gcc, solo che produce file oggetto/eseguibili che non funzioneranno sul mio PC.

risposta

25

Per la compilazione incrociata, penso che le vostre scelte migliori siano o CMake o Autotools. Soprattutto se è possibile compilare il codice per più architetture/piattaforme. Generalmente compilo un sottoinsieme del mio codice sulla macchina nativa per scopi di testing unitario e tutto per la piattaforma di destinazione. CMake gestisce questo particolarmente bene, in quanto consente di specificare dove vivono le librerie cross-compilate. Quindi, piuttosto che cercare la croce libpng compilata in/usr/lib, si può dire di cercare in/opt/arm-eabi-gcc/o ovunque ci siano le librerie della catena di strumenti installate sulla macchina di compilazione. Puoi creare più directory di compilazione per le diverse varianti e compilare manualmente ogni variante con make, o innescare il lotto con una marca ricorsiva a mano libera.

Ant ha lo svantaggio di essere fondamentalmente buono o cattivo come Vanilla Make, con l'ulteriore svantaggio di utilizzare qualcosa che non è particolarmente mainstream per C o C++. Devi gestire tutte le tue dipendenze, sia quelle interne, come il file C, il file di intestazione, la libreria o l'eseguibile, e anche le dipendenze esterne come il collegamento con le librerie di terze parti. Inoltre, non penso che i compiti di Ant C siano realmente mantenuti così tanto. Tutti quelli che ho visto che usano Ant for C sostengono di chiamare GCC con compiti exec.

SCons è migliore, ma la compilazione incrociata non è il suo punto di forza. Neanche un "sistema di build" come CMake o Autotools, è solo uno strumento di costruzione. Come dice sul loro wiki, it is pretty much "Make in Python". Tuttavia, ha incorporato la gestione delle dipendenze, il che significa che non è necessario eseguire il rollover con "gcc -MM -MD" o qualsiasi altra cosa, quindi è un vantaggio rispetto a Make. SCons ha anche il supporto per il rilevamento di librerie di terze parti che sono installate, ma il modo in cui viene solitamente fatto può aggiungere molto al tempo di costruzione. A differenza di altri sistemi, SCons esegue la fase di verifica ogni volta che viene eseguito, sebbene la maggior parte dei risultati sia memorizzata nella cache. SCons è anche famigerato per i suoi lunghi tempi di costruzione, anche se per 50 file non sarebbe un problema. Il supporto per la compilazione incrociata in SCons è inesistente: devi eseguire il rollover del tuo as discussed on this thread on the mailing list. Generalmente si costringe la build a essere come una piattaforma Unix, quindi si sovrascrive il nome del compilatore C. La creazione di più varianti o la separazione della directory di build dalla directory di origine è piena di trucchi, che lo rende meno adatto se si incrocia e si compila in modo nativo il codice.

CMake e Autotools hanno i problemi di dipendenza ben identificati e il supporto cross-compilation degli autotools è maturo. CMake ha avuto una compilazione incrociata dalla versione 2.6.0, che è stata rilasciata nell'aprile 2008. Le funzionalità sono gratuite, più altre come il confezionamento e i test delle unità in esecuzione ("make check" o obiettivi simili). Lo svantaggio di entrambi questi strumenti è che richiedono il bootstrap.Nel caso di CMake, è necessario che il binario di CMake sia installato per creare i file di soluzione Makefiles o Visual Studio. Nel caso di Autotools è un po 'più complicato perché non tutti quelli che compilano il software avrebbero bisogno di automake e autoconf installati, solo quelli che hanno bisogno di cambiare il sistema di build (l'aggiunta di nuovi file conta come la modifica del sistema di build). Il bootstrap a 2 stadi (configure.ac -> configure, configure + Makefile.in -> Makefile) è concettualmente un po 'più complicato da comprendere.

Per la modifica: la compilazione incrociata è un ulteriore mal di testa nei sistemi di compilazione per il fatto che aggiunge complessità al rilevamento automatico di programmi e librerie. SCons non affronta questo problema, lascia a te la responsabilità di risolverlo. Allo stesso modo, Ant non fa nulla. Autoconf lo gestisce nel caso degli autotools, ma potresti dover fornire "--with-libfoobar =/some/path" sulla riga di comando quando configuri o affronti il ​​collegamento interrotto quando tenta di usare/usr/lib nella fase di collegamento . L'approccio di CMake è un po 'più pesante con il file toolchain, ma significa che non è necessario specificare tutti gli strumenti e le librerie (CC, CXX, RANLIB, --with-ibfoo =, ecc.) Come vengono rilevati da una convenzione standard. In teoria è possibile riutilizzare un file di toolchain CMake opportunamente predisposto in più progetti per compilarli. In pratica, CMake non è abbastanza diffuso da rendere questo conveniente per il tuo hacker medio, sebbene possa essere utile se stai creando più progetti proprietari.

1

Ant ha una base di utenti molto pesante per Java (per motivi naturali). Il fatto che Ant possa essere molto utile in un contesto molto più ampio è qualcosa che la maggior parte degli sviluppatori non Java non sono a conoscenza. Di conseguenza, se usi Ant per costruire il tuo codice C/C++, tanto più per conto tuo se usi un sistema con una base utenti più ampia (CMake o SCons).

Personalmente sono stato molto felice con CMake, principalmente perché è l'unico sistema di compilazione in grado di generare progetti di Visual Studio reali. Anche SCons può farlo, ma fanno solo una chiamata esterna a SCons, mentre CMake genera progetti che utilizzano il motore di compilazione di Visual Studio. Questo è molto utile se stai lavorando insieme a persone che sono abituate a Visual Studio.

Non sono sicuro che chiamerei il supporto di CMake per la crosscompilation "maturo", poiché è ancora piuttosto giovane. Ma la gente di CMake ne è seria, quindi non esiterei a provarlo.

6

Ho usato Ant + CppTasks pesantemente alcuni anni fa per la creazione di basi di codice molto grandi che sono state integrate nel nuovo codice Java tramite JNI, ed ero molto soddisfatto del risultato di build incrementali molto affidabili di codice C++, buona flessibilità (nei file di build o tramite modifiche al codice). BUT, CppTasks è un progetto senza community e il manutentore (Curt Arnold) non ha fatto nulla per molto tempo. Rimane molto buono e utile, ma sappi che pochissime persone conoscono o usano CppTasks (il modo in cui i compilatori "offrono" per i file mordimi, ad esempio quando avevo bisogno di un compilatore specifico per i file C, e il compilatore C++ diverso li stava raccogliendo anziché).

I CppTasks modo in cui registra opzioni di compilazione, e dinamicamente scansioni fonti per le dipendenze di intestazione, per tutto il tempo ancora abbastanza veloce (c'è qualche caching delle dipendenze), significava l'unico sistema con cui ho lavorato che ha avuto incrementale accurate costruisce, qualcosa di molto importante quando si costruiscono basi di codice molto grandi.

Così come ho già detto un paio di volte negli elenchi utente/dev Ant, se si hanno un sacco di roba Java e hanno già un investimento in formica, e non hanno paura di tuffarsi nel doc e il codice di CppTasks, e ora è necessario creare il codice "glue" JNI e/o le librerie native "legacy" che il codice collettivo espone, è un concorrente che vale la pena, e le ricompense possono essere grandiose.

Ho facilmente integrato <rc> per la DLL di Windows per aggiungere informazioni complete sulla versione, ad esempio, scrivendo una piccola attività Ant per formattare correttamente il file .res.Ha funzionato per me, ma Ant + CppTasks è sicuramente di più per l'utente avanzato "Ant"/sviluppatore IMHO.

Spero che questo aiuti. --DD

3

Mi piacerebbe raccomandare terp per costruire progetti C++ da ANT. Abbiamo sviluppato terp perché ANT è il nostro strumento di costruzione scelto e i CppTask stavano diventando un po 'lunghi nel dente e perché volevamo lavorare su un diverso livello di astrazione. terp supporta molti compilatori diversi ed è supportato dalla nostra azienda. Per la maggior parte dei progetti, però, non è gratuito.

Abbiamo progettato terp principalmente per ricostruzioni complete piuttosto che build incrementali con analisi delle dipendenze. Ci stiamo arrivando ma non c'è ancora. Il punto debole di terp è nelle versioni multi-piattaforma, multi-procarch e multi-compilatore in cui non si desidera mantenere n diverse configurazioni per tutte le combinazioni. A questo punto (luglio '09) è in beta pubblica, ma verrà rilasciato presto.

2

Ho lavorato a un progetto negli ultimi cinque anni che utilizza x86 e arm build con ant. Abbiamo ottimizzato i cpptask per i nostri scopi per produrre un compilatore generico che abbiamo appena passato in un prefisso a ... come arm-gum-linux-gnueabi- e quindi che viene anteposto allo strumento effettivo come g ++ o ar o qualsiasi altra cosa. Nessun prefisso significa ottenere gli strumenti di sviluppo delle piattaforme di sviluppo. I toolchain per la compilazione incrociata hanno quei prefissi sui loro binari degli strumenti di compilazione. Quasi l'intero motivo per cui andare con Ant piuttosto che fare qualcosa è la capacità di creare build inedmentali e il groviglio di cose che deve accadere per mantenere l'autoconf. Siamo in grado di supportare il paradigma che quasi tutti i file sorgente, in particolare quelli in una struttura ad albero di cartelle per un set di librerie, possono essere creati/rinominati/cancellati e non è necessario apportare modifiche ai file di build. Un piccolo inconveniente è che il collegamento dei file aggiorna le proprietà in un modo che causerà una ricostruzione non necessaria.

<target name="lib.cvp"> 
<fetch.and.log.version 
    svnvers.target="common/cvp" 
    svnvers.property="libcvp.version"/> 
    <cc objdir="${obj.dir}/common/cvp" 
     commandPrefix="${command.prefix}" 
     compilerName="${compiler.name}" 
     outfile="${lib.dir}/cvp" outtype="static"> 
     <compiler extends="base.compiler"/> 
     <compilerarg 
      value="-D__CVP_LIB_BUILD_VERSION__=&quot;${libcvp.version}&quot;"/> 
     <compilerarg 
      value="-D__BUILD_NOTES__=&quot;${libcvp.toolversion}&quot;"/> 
     <compilerarg if="is.x86" value="-DARCH_X86"/> 
     <linker extends="base.linker"/> 
     <includepath refid="common.inc"/> 
     <fileset dir="${project.home}/common/cvp"> 
      <include name="*.c"/> 
      <include name="*.cpp"/> 
     </fileset> 
    </cc> 
</target>