Sei sulla pagina 1di 5

22/02/13

Appunti Linux: Automazione della compilazione: Make e Makefile

[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 uno script che 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 programma makeviene 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
makefile serve a elencare a makele 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 che makeavvii 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 obbiettivo con il nome provaall'interno del makefile stesso.

103.2 Makefile
Un makefile uno script specializzato per la automazione della compilazione attraverso Make. Contiene la
definizione di macro, simili alle variabili di ambiente di uno script di shell, e di obbiettivi che rappresentano
le varie operazioni da 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.
www.fis.uniroma3.it/CALCOLO_DOC/unix/appuntilinux/al131.htm

1/5

22/02/13

Appunti Linux: Automazione della compilazione: Make e Makefile

<nome> = <stringa>

La stringa non deve essere delimitata, e il funzionamento molto simile alle variabili di ambiente dichiarate
all'interno di uno script di shell. Per esempio,
prefix=/usr/local

definisce la macro prefixche da quel punto in poi equivale a /usr/local. La sostituzione di una macro si
indica attraverso due modi possibili:
$(<nome>)

oppure
${<nome>}

come nell'esempio seguente, dove la macro exec_prefixviene generata a partire dal contenuto di prefix.
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 makefile simile a quello seguente, e
quindi eseguire semplicemente make(i vari comandi echosono rientrati con un carattere di tabulazione).
all:
@echo MAKE $(MAKE) ; \
echo AR $(AR) ; \
echo ARFLAGS $(ARFLAGS) ; \
www.fis.uniroma3.it/CALCOLO_DOC/unix/appuntilinux/al131.htm

2/5

22/02/13

Appunti Linux: Automazione della compilazione: Make e Makefile

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 obbiettivi abbinati ai
comandi necessari per ottenerli.
<obbiettivo>... : [<dipendenza>...]
<HT><comando>[; <comando>]...

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
devono iniziare dopo un carattere di tabulazione.
L'esempio seguente mostra una regola attraverso cui si dichiara il comando necessario a eseguire il link di 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;

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

3/5

22/02/13

Appunti Linux: Automazione della compilazione: Make e Makefile

@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.3 ne riporta alcune per
chiarire il concetto.
Obbiettivo Comando corrispondente
.c

$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $<

.f

$(FC) $(FFLAGS) $(LDFLAGS) -o $@ $<

.c.o

$(CC) $(CFLAGS) -o $<

.f.o

$(FC) $(FFLAGS) -o $<

Tabella 103.3: Elenco di regole deduttive a singolo e a doppio prefisso.

103.4 Makefile tipico


Il tipico makefile permette di automatizzare tutte le fasi legate alla riproduzione di un programma e alla sua
installazione. Si distinguono alcuni obbiettivi comuni, usati di frequente:
all

utile per definire l'azione da compiere quando non si indica alcun obbiettivo;
clean

per eliminare i file oggetto e i binari gi compilati;


install

per installare il programma eseguibile dopo la compilazione.


Si ricorder che le tipiche fasi di una installazione di un programma distribuito in forma sorgente sono
appunto:
# make

che richiama automaticamente l'obbiettivo alldel makefile, coincidente con i comandi necessari per la
compilazione del programma, e
# make install

che provvede a installare gli eseguibili compilati nella loro destinazione prevista.
Supponendo di avere realizzato un programma, denominato mioprog.c, il cui eseguibile debba essere
installato nella directory /usr/local/bin/, si potrebbe utilizzare un makefile composto come l'esempio
seguente.
www.fis.uniroma3.it/CALCOLO_DOC/unix/appuntilinux/al131.htm

4/5

22/02/13

Appunti Linux: Automazione della compilazione: Make e Makefile

prefix=/usr/local
bindir=${prefix}/bin
all:
cc -o mioprog mioprog.c
clean:
rm -f core *.o mioprog
install:
cp mioprog $(bindir)

Come si pu osservare, sono state definire le macro prefixe bindirin modo da facilitare la modifica della
destinazione del programma installato, senza intervenire sui comandi.
L'obbiettivo cleanelimina un eventuale file core, generato da un errore irreversibile durante l'esecuzione del
programma, probabilmente mentre lo si prova tra una compilazione e l'altra, quindi elimina gli eventuali file
oggetto e infine l'eseguibile generato dalla compilazione.
--------------------------AppuntiLinux 1998.11.22 --- Copyright 1997-1998 Daniele Giacomini - daniele@calion.com
[indice generale] [precedente] [successivo] [indice analitico] [note introduttive]

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

5/5