Appunti Linux_ Automazione Della Compilazione_ Make e Makefile

download Appunti Linux_ Automazione Della Compilazione_ Make e Makefile

of 5

Transcript of Appunti Linux_ Automazione Della Compilazione_ Make e Makefile

  • 7/23/2019 Appunti Linux_ Automazione Della Compilazione_ Make e Makefile

    1/5

    22/02/13 Appunti Linux: Automazione della compilazione: Make e Makefile

    www.fis.uniroma3.it/CALCOLO_DOC/unix/appuntilinux/al131.htm 1/5

    [indice generale][precedente][successivo][indice analitico][note introduttive]

    103. Automazione della compilazione: Make e

    Makefile

    La compilazione di un programma, in qualunque linguaggio sia scritto, pu essere un'operazione molto

    laboriosa, soprattutto se si tratta di aggregare un sorgente suddiviso in pi parti. Una soluzione potrebbe

    essere quella di predisporre unoscriptche esegue sequenzialmente tutte le operazioni necessarie, ma la

    tradizione impone di utilizzare il programma Make.

    Uno dei vantaggi pi appariscenti sta nella possibilit di evitare che vengano ricompilati i file sorgenti che non

    sono stati modificati, abbreviando quindi il tempo di compilazione necessario quando si procede a una serie di

    modifiche limitate.

    103.1 Make

    Il programmamakeviene utilizzato normalmente assieme a un file, detto makefile, il cui nome pu essere

    generalmente makefileo Makefile(quest'ultimo, con l'iniziale maiuscola, normalmente preferito). Il

    makefileserve a elencare amakele operazioni da compiere e le interdipendenze che ci sono tra le varie fasi.

    makepu anche essere usato da solo, senza makefile, per compilare un singolo sorgente, e in questo caso,

    tenta di determinare l'operazione pi adatta da compiere in base all'estensione del sorgente stesso. Per

    esempio, se esiste il file prova.cnella directory corrente, il comando

    $make prova

    fa s chemakeavvii in pratica il comando seguente.

    $ cc -o prova prova.c

    Se invece esistesse un makefile, lo stesso comando,make prova, avrebbe un significato diverso,

    corrispondendo alla ricerca di un obbiettivocon il nomeprovaall'interno del makefilestesso.

    103.2 Makefile

    Un makefile unoscriptspecializzato per la automazione della compilazione attraverso Make. Contiene la

    definizione di macro, simili alle variabili di ambiente di unoscriptdishell, e di obbiettiviche rappresentano

    le varie operazionida compiere.

    All'interno di questi file, il simbolo #rappresenta l'inizio di un commento, cio di una parte di testo che non

    viene interpretata da Make.

    103.2.1 Macro

    La definizione di una macro avviene in modo molto semplice, indicando l'assegnamento di una stringa a un

    nome che da quel momento la rappresenter.

    http://www.fis.uniroma3.it/CALCOLO_DOC/unix/appuntilinux/altoc.htmhttp://www.fis.uniroma3.it/CALCOLO_DOC/unix/appuntilinux/al130.htmhttp://www.fis.uniroma3.it/CALCOLO_DOC/unix/appuntilinux/al132.htmhttp://www.fis.uniroma3.it/CALCOLO_DOC/unix/appuntilinux/index.htmhttp://www.fis.uniroma3.it/CALCOLO_DOC/unix/appuntilinux/alndx.htmhttp://www.fis.uniroma3.it/CALCOLO_DOC/unix/appuntilinux/al132.htmhttp://www.fis.uniroma3.it/CALCOLO_DOC/unix/appuntilinux/al130.htmhttp://www.fis.uniroma3.it/CALCOLO_DOC/unix/appuntilinux/altoc.htm
  • 7/23/2019 Appunti Linux_ Automazione Della Compilazione_ Make e Makefile

    2/5

    22/02/13 Appunti Linux: Automazione della compilazione: Make e Makefile

    www.fis.uniroma3.it/CALCOLO_DOC/unix/appuntilinux/al131.htm 2/5

    =

    La stringa non deve essere delimitata, e il funzionamento molto simile alle variabili di ambiente dichiarate

    all'interno di unoscriptdishell. Per esempio,

    prefix=/usr/local

    definisce la macroprefixche da quel punto in poi equivale a /usr/local. La sostituzione di una macro si

    indica attraverso due modi possibili:

    $()

    oppure

    ${}

    come nell'esempio seguente, dove la macro exec_prefixviene generata a partire dal contenuto diprefix.

    prefix=/usr/local

    exec_prefix=$(prefix)

    Esistono alcune macro predefinite, il cui contenuto pu anche essere modificato. Le pi importanti sono

    elencate nella tabella 103.1.

    Nome Contenuto

    MAKE make

    AR ar ARFLAGS rw

    YACC yacc

    YFLAGS

    LEX lex

    LFLAGS

    LDFLAGS

    CC cc

    CFLAGS

    FC f77

    FFLAGS

    Tabella 103.1:Elenco di alcune macro predefinite di Make.

    Per verificare il contenuto delle macro predefinite, si pu predisporre un makefilesimile a quello seguente, e

    quindi eseguire semplicementemake(i vari comandi echosono rientrati con un carattere di tabulazione).

    all:

    @echo MAKE $(MAKE) ; \

    echo AR $(AR) ; \

    echo ARFLAGS $(ARFLAGS) ; \

    http://www.fis.uniroma3.it/CALCOLO_DOC/unix/appuntilinux/al131.htm#tabella-make-macro-predefinite
  • 7/23/2019 Appunti Linux_ Automazione Della Compilazione_ Make e Makefile

    3/5

    22/02/13 Appunti Linux: Automazione della compilazione: Make e Makefile

    www.fis.uniroma3.it/CALCOLO_DOC/unix/appuntilinux/al131.htm 3/5

    echo YACC $(YACC) ; \

    echo YFLAGS $(YFLAGS) ; \

    echo LEX $(LEX) ; \

    echo LFLAGS $(LFLAGS) ; \

    echo LDFLAGS $(LDFLAGS) ; \

    echo CC $(CC) ; \

    echo CFLAGS $(CFLAGS) ; \

    echo FC $(FC) ; \

    echo FFLAGS $(FFLAGS)

    Oltre alle macro predefinite, ne esistono altre, la cui utilit si vedr in seguito.

    Macro Significato

    $< Il nome del file per il quale stato scelto l'obbiettivo per deduzione.

    $* Il nome dell'obbiettivo senza suffisso.

    $@ L'obbiettivo della regola specificata.

    Tabella 103.2:Elenco di alcune macro interne.

    103.2.2 Regole

    Le regole sono il fondamento dei makefile. Attraverso di esse si stabiliscono degli obbiettiviabbinati ai

    comandi necessari per ottenerli.

    ... : [...]

    [; ]...

    La sintassi indica un comando che deve essere eseguito per raggiungere uno degli obbiettivi nominati all'inizio,

    e le dipendenze che devono essere soddisfatte. In pratica, non si pu eseguire il comando se prima non

    esistono i file indicati nelle dipendenze.

    La dichiarazione inizia a partire dalla prima colonna, con il nome del primo obbiettivo, mentre i comandi

    devonoiniziare dopo un carattere di tabulazione.

    L'esempio seguente mostra una regola attraverso cui si dichiara il comando necessario a eseguire il linkdi un

    programma oggetto, specificando che questo pu essere eseguito solo quando esiste gi il file oggetto in

    questione.

    mioprog: prova.o

    cc -o prova prova.o

    Il comando indicato in una regola, pu proseguire su pi righe successive, basta utilizzare la sequenza di

    escape\newline, ovvero si tratta di concludere la riga, prima del codice newline, con una barra obliqua

    inversa. Quello che conta che le righe aggiuntive inizino sempre dopo un carattere di tabulazione.

    Il comando di una regola pu iniziare con un prefisso particolare:

    -fa in modo che gli errori vengano ignorati;

    +fa in modo che il comando venga eseguito sempre;

  • 7/23/2019 Appunti Linux_ Automazione Della Compilazione_ Make e Makefile

    4/5

    22/02/13 Appunti Linux: Automazione della compilazione: Make e Makefile

    www.fis.uniroma3.it/CALCOLO_DOC/unix/appuntilinux/al131.htm 4/5

    @fa in modo che il testo del comando non venga mostrato.

    103.3 Regole deduttive

    Make prevede alcune regole predefinite, o deduttive, riferite ai suffissi dei file indicati come obbiettivo. Si

    distingue tra due tipi di regole deduttive: a singolo e a doppio suffisso. La tabella 103.3ne riporta alcune per

    chiarire il concetto.

    Obbiettivo Comando corrispondente

    .c $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $