Corso di C con Linux

Creiamo un pacchetto con Automake e Autoconf

 

Passiamo ora dalla teoria alla pratica eseguendo le diverse fasi indicate negli articoli precedenti.

Prima fase: Dai sorgenti al file configure.in
Supponiamo di aver già eseguito l'autoscan, ora ci accingiamo a editare il file configure.in nel seguente modo:
       dnl Process this file with autoconf to produce a configure script.

       AC_INIT(main.c)
       dnl Checks for programs.
       AM_CONFIG_HEADER(config.h)
       AM_INIT_AUTOMAKE(matrix,0.1)
       AC_PROG_CC
       AC_PROG_INSTALL

       dnl Checks for libraries.

       dnl Checks for header files.
       AC_HEADER_STDC
       if test $ac_cv_header_stdc = no; then
       AC_MSG_ERROR([Matrix richiede ANSI C])
       fi

       dnl Checks for typedefs, structures, and compiler characteristics.

       dnl Checks for library functions.
       AC_CHECK_FUNCS(getline)
       AC_OUTPUT(Makefile)

Il file configure.in mostrato sopra é suddiviso in diverse sezioni, suddivisione che viene rispettata da tutti i file configure.in. Queste sezioni sono:
Inizializzazione
Controllo programmi presenti nel sistema, da cui il vostro programma dipende
Controllo librerie necessarie e presenti nel sistema
Controllo degli header per la compilazione
Controllo delle funzioni di libreria

Per ogni sezione si specificano delle macro (leggi regole di controllo), che servono a svolgere ogni singolo controllo sulla configurazione richiesta dal programma per funzionare. Penso che abbiate già capito, che i commenti nel file configure.in sono differenti rispetto ai Makefile tradizionali, dove erano rappresentati da #. Qui infatti i commenti si esprimono mediante la parola dnl, ovvero tutto ciò, che é specificato dopo la parola dnl fino a fine linea viene ignorato dall'autoconf.


Iniziamo la descrizione del configure.in presentato, cercando di chiarire le cose passo dopo passo:

     riga 1: dnl Process this file with autoconf to produce a configure script.
     riga 2: AC_INIT(main.c)
     riga 3: dnl Checks for programs.
     riga 4: AM_CONFIG_HEADER(config.h)
     riga 5: AM_INIT_AUTOMAKE(matrix,0.1)
     riga 6: AC_PROG_CC
     riga 7: AC_PROG_INSTALL
     riga 8: dnl Checks for libraries.
     riga 9: dnl Checks for header files.
     riga 10:AC_HEADER_STDC
     riga 11:if test $ac_cv_header_stdc = no; then
     riga 12:AC_MSG_ERROR([Matrix richiede ANSI C])
     riga 13:fi
     riga 14:dnl Checks for typedefs, structures, and compiler characteristics.
     riga 15:dnl Checks for library functions.
     riga 16:AC_CHECK_FUNC(getline)
     riga 17:AC_OUTPUT(Makefile)


La riga 2 (AC_INIT(main.c)) imposta lo script configure in modo che controlli il file specificato tra parentesi per assicurarsi che la directory corrente sia quella contente i file sorgente del pacchetto. Questa é la fase di inizializzazione.
La riga 4 serve all'autoconf per generare lo script configure
La riga 5 (AM_INIT_AUTOMAKE(matrix,0.1)), serve a svolgere le inizializzazioni per l'uso con automake, dove l'espressione posta tra parentesi rappresenta rispettivamente il nome e la versione del pacchetto. In generale ogni macro, che ha come prime due lettere 'AM' é una macro per l'uso di automake. Se volete scrivervi manualmente i Makefile non avete bisogno di questa macro.
AC_PROG_CC. Questa macro controlla il tipo di compilatore che avete.
AC_PROG_INSTALL. Questa riga serve a controllare se avete un'utility di installazione compatibile BSD.
AC_HEADER_STDC. Questa macro controlla se i file header dello standard ANSI C sono presenti.

Ora abbiamo 3 righe interessanti (11,12,13):

       riga 11:if test $ac_cv_header_stdc = no; then
       riga 12:AC_MSG_ERROR([L'applicazione richiede ANSI C])
       riga 13:fi


In parole queste tre righe si traducono in :
       se il test precedente é negativo
                ==> allora scrivi su schermo il messaggio:
                             "L'applicazione richiede ANSI C"

Facciamone una breve descrizione. La riga 11 usa una variabile (simile a quelle dei makefile) $ac_cv_header_stdc, che viene impostata durante l'esecuzione dello script configure. Questa variabile corrisponde alla macro $AC_HEADER_STDC. Da notare che ogni macro ha una variabile simile, per esempio la macro AC_PROG_FUNCS ha una variabile $ac_cv_prog_funcs associata.
Durante l'esecuzione, configure testa se la richiesta di una data macro é soddisfatta o meno nel sistema e imposta la variabile associata alla macro. Nelle righe sopra illustrate (11,12,13) si va a verificare la compatibilità con l'ANSI C, se tale compatibilità é presente allora la $ac_cv_header_stdc sarà uguale a 'yes', altrimenti sarà uguale a 'no'. In quest'ultimo caso l'esecuzione di configure sarà interrotta e apparirà sullo schermo il messaggio tra parentesi quadre presente nella macro AC_MSG_ERROR.

 

Torna all'indice Generale del corso di Corso di C con Linux di Software Planet