Menu Chiudi

Autotool Bootstrap Howto

Author: mercutio
Version: 1.0
Date: 12/4/2004

Una mini guida all’uso di autoconf e automake.

Author: mercutio
Version: 1.0
Date: 12/4/2004

Una mini guida all’uso di autoconf e automake.

Introduzione

Ah, i giovani d’oggi non sono più come quelli d’una volta. Adesso, tutti vogliono installare pacchetti. Il vecchio caro tarball coi sorgenti è fuori moda. E quelli che installano i programmi partendo dai sorgenti, anche loro si sono rammolliti. Dicono, se non posso procedere col classico

./configure --prefix=/usr/local && make && make install

te lo puoi tenere il tuo programma. Non mi interessa quanto buono sia… Avete provato a replicare che per impostare il prefisso di installazione basta modificare il valore della variabile PREFIX definita nel file Makefile.inc, ma loro vi hanno guardato con un misto di disprezzo e commiserazione. E va be’, bisognerà imparare ad usare questi famosi autotool: automake, autoconf e i loro amici autoscan, aclocal, autoheader. C’è da impazzire. E tutto quel tempo perso a studiare make…

Suppongo che abbiate trovato, scaricato e letto con la giusta dose di venerazione e tremore i manuali dei sacri programmi e ora siate pronti a partire a sporcarvi le mani su un caso pratico. Fantastico! Il problema è: da dove si comincia?

Bootstrap

Ecco un po’ di note che spero possano essere utili durante la fase di bootstrap. Finita quella, temo che sia ora di tornare ai temuti manuali. Solita regola del YMMV: questo è un super-mini-quick HOWTO, perciò non tutti i dettagli sono spiegati, perciò non è detto che il tutto funzioni, ecc.

Supponiamo che i file che compongono il vostro programma, siano organizzati più o meno in questo modo:

|-- your_program/
| |-- src/ (contiene il codice)
| |-- doc/ (documentazione varia, in particolare man page)
| |-- test/ (testate il vostro codice, vero?)
| |-- README
| |-- INSTALL
| ...
| ...

Entrate in your_program/ e iniziamo:

  • Lanciate:

    $ autoscan

    autoscan analizza i sorgenti contenuti nella directory corrente, riconosce possibili problemi di portabilità e genera il file configure.scan che può essere utilizzato come punto di partenza per creare il proprio configure.ac

  • Modificate configure.scan in modo che si adatti al vostro progetto e rinominatelo configure.ac. Di solito è sufficiente inserire il nome del progetto, il numero di versione e l’indirizzo e-mail cui inviare bug report nella chiamata alla macro AC_INIT; e aggiungere la riga:

    AM_INIT_AUTOMAKE
  • Create il Makefile.am di livello superiore. Nel caso più semplice ci si può limitare a segnalare la presenza di sottodirectory:

    SUBDIRS = test doc src
  • Create il Makefile.am della directory src/. Ad esempio:

    bin_PROGRAMS = programma
    programma_SOURCES = main.c interface.c extra.c
  • Create un Makefile.am in ogni directory elencata in SUBDIRS

  • Lanciate:

    $ aclocal
    $ autoheader
    $ automake -ac --foreign
    $ autoconf

Questo dovrebbe darvi un configure eseguibile! Non era poi così difficile…

Librerie esterne

Benissimo, aggiungiamo un po’ di complicazioni. Supponiamo che il programma utilizzi una libreria esterna, per fare un caso concreto, libxml2. Nella fase di configure dovete ovviamente controllare che la libreria sia presente sul sistema e in caso contrario segnalare all’utente l’errore. Nel caso più semplice, la libreria è distribuita insieme ad un file di macro m4 che si occupano di tutti i passi necessari. libxml2 adotta questa soluzione. Provate a dare un’occhiata a /usr/share/aclocal/libxml.m4 (nota che il file potrebbe trovarsi in un’altra posizione). Fatto? Allora, non rimane che aggiungere in configure.ac:

AM_PATH_XML2(, ,
[AC_MSG_ERROR([*** cannot find the libxml2 library])])

La macro definisce le variabili XML_CFLAGS e XML_LIBS che dovete aggiungere al vostro set di CFLAGS e LIBS.

Se la libreria non fornisce un suo file m4, direi che la cosa migliore da fare è scriverne uno seguendo la traccia, ad esempio, di libxml.m4 e inviarlo ai responsabili della libreria. Se, invece, vi accontentate di un test veloce potete aggiungere nel vostro configure.ac qualcosa di simile a questo:

dnl
dnl Check for the posix thread library
dnl
AC_CHECK_LIB(pthread, pthread_create,
AC_SUBST(PTHREAD_LDFLAGS, "-lpthread"),
AC_MSG_ERROR([*** could not found library libpthread ***]))

e in src/Makefile:

LDADD = @PTHREAD_LDFLAGS@

Traduzioni

Bene, tutto funziona per il meglio e vi siete messi in testa di voler tradurre il programma in diverse lingue. Come fare? Facile: seguite le istruzioni del gettext-bootstrap-HOWTO.

Man page

Ma è incredibile, adesso qualcuno si lamenta che il programma non è documentato a sufficienza! Eppure nella directory doc/ avete raccolto un sacco di documentazione. Ma, quelli dicono, non c’è nemmeno la man page. Questo è innegabile: avete provata a scriverla, ma il formato oscuro usato dalle man page vi ha presto sconfitto. E ora che si fa? Semplice, usate help2man! Salvate la man page in doc/ e modificate il Makefile.am di doc/ aggiungedo la riga:

man_MANS = your_program.1
WordPress Appliance - Powered by TurnKey Linux