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.htm7/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-predefinite7/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 $@ $
Top Related