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.