Automake e autoconf sono il modo standard di compilare il codice?


22

A volte compilo app dalla fonte e sto usando:

./configure
make
sudo make install

Ma di recente, mi sono imbattuto in ciò ./autogen.shche genera la configurazione e crea script per me e li esegue.

Quali altri metodi per semplificare la compilazione C / C ++ / C # (mono) esistono? Make sembra un po 'vecchio. Ci sono nuovi strumenti là fuori? Data la scelta, quale dovrei usare?


non c'è niente come solo "codice". Ad esempio se ottieni il codice Java probabilmente lo costruirai usando Maven o Ant, se ottieni Python una buona scelta è setuptools. Non ci sono modi standard per compilare nulla. Forse dovresti riformulare la domanda.
diega

Buon punto. In realtà sto programmando in C # con mono, ma la mia domanda si applica anche a C / C ++.
Louis Salin,

Piccola nota: autogen.sh non esegue make for you, basta configurarlo.
Sandy,

@Sandy autogen.shsono principalmente script personalizzati, che di solito invocano autoreconfma potrebbero anche invocare ./configuree persino make. Non penso che il suo comportamento sia standardizzato in alcun modo; lo scopo principale è di avere un file eseguibile all'interno del progetto, che le persone possono eseguire (piuttosto che dover sapere che devono evocare autoreconf)
umläute,

Risposte:


42

Autoconf e Automake sono stati avviati per risolvere un problema evolutivo di Unix.

Man mano che Unix si evolveva in direzioni diverse, gli sviluppatori che volevano il codice portatile tendevano a scrivere codice in questo modo:

#if RUNNING_ON_BSD
Set things up in the BSD way
#if RUNNING_ON_SYSTEMV
Set things up in the SystemV way
#endif

Poiché Unix è stato distribuito in diverse implementazioni (BSD, SystemV, molti fork di fornitori e successivamente Linux e altri sistemi simili a Unix), è diventato importante per gli sviluppatori che volevano scrivere codice portatile per scrivere codice che non dipendesse da una particolare marca di sistema operativo , ma sulle funzionalità esposte dal sistema operativo. Questo è importante perché una versione Unix introdurrebbe una nuova funzionalità, ad esempio la "chiamata" di sistema, e successivamente altri sistemi operativi la adotteranno. Invece di avere uno spaghetto di codice che controllava le marche e le versioni, gli sviluppatori hanno iniziato a sondare le funzionalità, quindi il codice è diventato:

#if HAVE_SEND
Use Send here
#else
Use something else
#endif

La maggior parte dei file README per compilare il codice sorgente negli sviluppatori appuntiti degli anni '90 per modificare un file config.h e commentare che le funzionalità appropriate disponibili sul sistema, o spedirebbero i file config.h standard per ogni configurazione del sistema operativo che era stata testata.

Questo processo è stato sia ingombrante che soggetto a errori ed è così che è nato Autoconf. Dovresti pensare ad Autoconf come un linguaggio composto da comandi shell con macro speciali che sono state in grado di sostituire il processo di modifica umana di config.h con uno strumento che ha sondato il sistema operativo per la funzionalità.

Generalmente scrivere il codice di verifica nel file configure.ac e quindi eseguire il comando autoconf che compila questo file nel comando di configurazione eseguibile che hai visto usato.

Quindi, quando esegui, ./configure && makestavi sondando le funzionalità disponibili sul tuo sistema e quindi costruendo il file eseguibile con la configurazione rilevata.

Quando i progetti open source hanno iniziato a utilizzare i sistemi di controllo del codice sorgente, era logico controllare il file configure.ac, ma non il risultato della compilazione (configure). Autogen.sh è semplicemente un piccolo script che richiama il compilatore autoconf con gli argomenti di comando giusti per te.

-

Automake è cresciuto anche dalle pratiche esistenti nella comunità. Il progetto GNU ha standardizzato una serie regolare di obiettivi per Makefile:

  • make all costruirà il progetto
  • make clean rimuoverebbe tutti i file compilati dal progetto
  • make install installerebbe il software
  • cose come make diste make distcheckpreparerebbero la fonte per la distribuzione e verificherebbero che il risultato fosse un pacchetto completo di codice sorgente
  • e così via...

La creazione di makefile conformi è diventata gravosa perché c'era un sacco di scaldabagni che si ripetevano più volte. Quindi Automake era un nuovo compilatore che si integrava con autoconf ed elaborava i Makefile "source" (chiamati Makefile.am) in Makefile che potevano quindi essere inviati ad Autoconf.

La toolchain automake / autoconf in realtà utilizza una serie di altri strumenti di supporto e sono aumentati da altri componenti per altre attività specifiche. Con l'aumentare della complessità dell'esecuzione di questi comandi in ordine, è nata la necessità di uno script pronto per l'esecuzione, ed è qui che è nata autogen.sh.

Per quanto ne so, Gnome è stato un progetto che ha introdotto l'uso di questo script di supporto autogen.sh


Solo un piccolo inconveniente: gli standard GNU impongono la spedizione di file generati in tarball, per ridurre le dipendenze di build al minimo di strumenti universalmente disponibili. Se si ottiene una fonte non elaborata (ad esempio da un sistema di controllo della versione), i file generati non saranno presenti.
vonbrand

14

Ci sono due "Grandi giocatori" in quest'area; Cmake e GNU Autotools.

  • GNU Autotools è il modo GNU di fare le cose ed è abbastanza focalizzato su * nix. È una sorta di sistema meta-build, che fornisce una serie di strumenti che generano configurazioni specifiche e creano file per ciò che stai cercando di fare. Questo ti aiuta ad apportare più modifiche al tuo codice senza dover manipolare direttamente il tuo sistema di compilazione, e aiuta gli altri a costruire il tuo codice in modi per cui non avevi progettato - sotto * nix.

  • Cmake è il modo multipiattaforma per fare le cose. Il team di Cmake sviluppa software in molti modi diversi, con GCC, Visual Studio, XCode, Windows, OSX, Solaris, BSD, GNU / Linux, qualunque cosa. Se sei interessato alla portabilità della tua base di codice, questa è la strada da percorrere.

Come è stato menzionato, alcune persone sembrano essere appassionate di Scons. Se hai familiarità con Python, ciò potrebbe fornire maggiore coerenza nel tuo ambiente di lavoro.

Ruby ha anche una sorta di sistema meta-build chiamato Rake, che è piuttosto bello a sé stante, ed è molto utile per coloro che hanno già familiarità con Ruby.


6

Scons è una possibile sostituzione, anche se non ho esperienza personale. È anche implementato in Python, il che potrebbe costituire un problema, a seconda dell'ambiente di compilazione.


2
La portabilità non è il problema poiché Python ora è praticamente ovunque. La lamentela principale sugli SCons finora è che è inaccettabilmente lenta. Ci sono alcune modifiche per sacrificare l'accuratezza della costruzione a favore della velocità, ma non sono sicuro che sia ancora alla pari con Make.
Alex B

3

Se stai usando C # / Mono, puoi usare msbuild (i file .sln / .csproj usati da MonoDevelop e Visual Studio) per gestire l'intero processo di compilazione.

Puoi quindi compilare da MonoDevelop o eseguire il xbuildcomando nel tuo terminale preferito (funziona meglio in Mono> = 2.6). Questo è estremamente semplice e non richiede praticamente alcun lavoro da parte tua, perché MonoDevelop gestirà i file msbuild per te e non dovrai modificarli a meno che tu non voglia modificare le cose oltre ciò che l'interfaccia utente di MonoDevelop può fare per te.

Non ho familiarità con il modo in cui le persone che dipendono da msbuild gestiscono le installazioni per i loro progetti, ma puoi sempre chiederlo. ;-)


Sì, conosco xbuild, ma sto cercando di svezzarmi dagli IDE che vogliono solo tenere la mia mano. Inoltre, Mono viene compilato utilizzando Mono e utilizza autoconf, quindi volevo sapere qualcosa in più. Grazie!
Louis Salin,

1
È interessante notare che molti progetti Mono stanno provando a migrare su msbuild ora che xbuild funziona così bene. Rende il supporto di Windows / Mac un po 'più semplice. Mono ha così tanto codice C che non sono sicuro di quanto sarebbe pratico passare a xbuild. Ma autoconf funziona alla grande, quindi fai quello che fa per te. :-)
Sandy

0

Per C # puoi usare xbuild (e msbuild su windows), che costruirà il progetto dai tuoi file di progetto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.