Il programma make
Maurizio Rebaudengo, Fulvio Corno
Dip. Automatica e Informatica
Politecnico di Torino
Introduzione (I)
make è un programma di automazione dello
sviluppo del software.
Per realizzare anche piccole applicazioni in C
generalmente si usano più file sorgenti, file di
libreria, header file ecc., la cui gestione in fase
di compilazione e linking può essere ripetitiva
e lunga, nonchè può essere facile causa di
gravi errori.
A.A. 2001/2002
APA-makefile
2
Introduzione (II)
UNIX consente tramite make di specificare le dipendenze
tra i vari file e di aggiornare solo quei file che lo
richiedono, a seguito della modifica di qualche altro file.
Con il termine aggiornare si intende un’operazione di
compilazione o linking, oppure la rimozione di file
temporanei.
Questo processo di aggiornamento può talvolta essere
ripetuto innumerevoli volte durante lo sviluppo del
progetto software: tramite make tale procedura è
automatizzata, garantendo un notevole risparmio di
tempo e salvaguardano da possibili errori.
A.A. 2001/2002
APA-makefile
3
Make e makefile
Il programma make genera i comandi per espletare la
sua funzione usando un file di descrizione noto come
makefile; questi comandi sono poi eseguiti dalla
shell.
Il makefile è essenzialmente un insieme di regole che
make deve eseguire per aggiornare il programma
relativo.
Queste regole generalmente sono legate alla
definizione delle dipendenze tra i file. make è in grado
di accorgersi automaticamente se un file è stato
modificato dalla data di modifica.
make può essere usato per linguaggi diversi dal C,
come il Fortran, l'Assembler.
A.A. 2001/2002
APA-makefile
4
Formato di un makefile (I)
Il formato di un makefile è costituito da un
insieme di entry.
La prima linea di ciascuna entry è detta linea
delle dipendenze, mentre le successive sono
dette linee di comando.
La sintassi è la seguente:
target: dipendenze
(TAB) lista di comandi
A.A. 2001/2002
APA-makefile
5
Formato di un makefile (II)
Il formato di un makefile è costituito da un
insieme di entry.
La prima linea di ciascuna entry è detta linea
delle dipendenze, mentre le successive sono
Quando viene modificato
dette
linee devo
di comando
. il
dipendenze
aggiornare
La sintassi target
è la seguente:
Per aggiornare il target
bisogna eseguire la lista di
target: dipendenze
(TAB) lista di comandi
A.A. 2001/2002
APA-makefile
comandi
6
Formato di un makefile (III)
La lista dei comandi può contenere sia
comandi di compilazione che di altro tipo.
Si noti che il carattere TAB a sinistra della lista
dei comandi è parte integrante della sintassi
del makefile: ciascuna linea di comando deve
essere indentata usando un TAB.
A.A. 2001/2002
APA-makefile
7
Formato di un makefile (IV)
Quando la lista dei comandi comprende più
linee, la sintassi prevede due possibili forme:
target: dipendenze
(TAB)comando1;comando2;comando3
target: dipendenze
(TAB)comando1
(TAB)comando2
(TAB)comando3
A.A. 2001/2002
APA-makefile
8
Formato (V)
Le linee di commento sono precedute dal
carattere “#”.
A.A. 2001/2002
APA-makefile
9
Target
Il target generalmente è il nome di un file,
mentre le dipendenze sono generalmente dei
file collegati logicamente al target.
A.A. 2001/2002
APA-makefile
10
Aggiornamento del target
make stabilisce una gerarchia di esecuzione
dei comandi di ciascuna entry osservando le
relative dipendenze.
make aggiorna il target se:
il
target non esiste, oppure
la data dell'ultima modifica di almeno una
delle dipendenze è più recente di quella del
target.
A.A. 2001/2002
APA-makefile
11
Esecuzione di un comando
Per fare eseguire i comandi voluti è necessario
specificare il nome del target:
make target
In questo modo make comincia a leggere
l‘entry che ha il target specificato ed esegue i
comandi in base alle dipendenze.
Se non si specifica nessun target, make
comincia a leggere la prima entry.
A.A. 2001/2002
APA-makefile
12
Convenzione
make ricerca i comandi solo nel file di nome
makefile (o Makefile), che deve essere
presente nella directory corrente.
Se si vuole che make legga i comandi da un
altro file, si usa l'opzione:
make -f nomefile target
A.A. 2001/2002
APA-makefile
13
Esempio
Si vuole rendere eseguibile il programma
prova compilando e linkando i seguenti file:
main.c
stampa.c
/usr/lib/book.a
(file di libreria)
crea.s (file in assembler)
A.A. 2001/2002
APA-makefile
14
Soluzione (I)
prova è il target del make mentre i file
oggetto e le librerie sono le sue dipendenze.
A.A. 2001/2002
APA-makefile
15
Soluzione (II)
# Makefile di prova 1
prova: main.o stampa.o crea.o /usr/lib/book.a
(TAB) cc -o prova main.o stampa.o crea.o /usr/lib/book.a
main.o: main.c
(TAB) cc -c main.c
stampa.o: stampa.c
(TAB) cc -c stampa.c
crea.o: crea.s
(TAB) as -o crea.o crea.s
fresh: pippo
(TAB) rm *.o
A.A. 2001/2002
APA-makefile
16
Commento (I)
Digitando il comando:
make prova
make inizialmente legge l’entry di prova; però
poichè le sue dipendenze sono a loro volta dei
target in altre entry, prima esegue i comandi
di tali entry, e poi quelli di prova.
Sul video apparirà la sequenza dei comandi
eseguiti.
A.A. 2001/2002
APA-makefile
17
Commento (II)
Digitando il comando make prova, il
comando relativo al target fresh non viene
eseguito, poichè fresh non è una dipendenza
di prova.
Per eseguire questo comando occorre
digitare:
make fresh
A.A. 2001/2002
APA-makefile
18
Le macro
All'interno del makefile è possibile definire
delle macro.
Sarà compito del make espandere tali macro.
A.A. 2001/2002
APA-makefile
19
Sintassi (I)
identificatore di macro=testo
L'identificatore della macro può essere scritto sia in
lettere maiuscole che minuscole, anche se per
convenzione è scritto in lettere maiuscole.
Il testo può essere :
un nome di un file
un nome di una directory
un programma da eseguire
una stringa nulla
una lista di file
una stringa di testo racchiusa tra doppie virgolette
A.A. 2001/2002
APA-makefile
20
Sintassi (II)
Le macro al loro interno possono contenere altre
macro.
Per riferirsi al contenuto di una macro all'interno del
makefile, l'identificatore di macro deve essere
racchiuso tra parentesi graffe (o tonde) e deve essere
preceduto dal carattere “$”.
Le macro devono essere definite prima che siano
usate in una linea di dipendenze.
Esempio
BOOK_DIR=/home/book/
MIO_LIBRO=${BOOK_DIR}/Andrea/libro
A.A. 2001/2002
APA-makefile
21
Macro nascoste
make ha delle macro interne, utilizzate per
sostituire i comandi più comunemente
utilizzati. Ne riportiamo alcune:
CC identifica il compilatore C (cc o gcc)
CFLAGS definisce i flag del compilatore C
(ad es. -g)
$@ identifica il target corrente
$? identifica tutti i file di dipendenza che
sono più recenti del target corrente.
A.A. 2001/2002
APA-makefile
22
Esempio (I)
Utilizzando le macro il makefile di esempio si
può scrivere in questo modo :
# Makefile di prova versione 2
CC=/usr/bin/gcc
AS=/usr/bin/as
OGGETTI=main.o stampa.o crea.o
LIB_DIR=/usr/lib
LIB_FILES=${LIB_DIR}/book.a
A.A. 2001/2002
APA-makefile
23
Esempio (II)
pippo : ${OGGETTI} ${LIB_FILES}
(TAB)${CC} -o $@ ${OGGETTI} ${LIB_FILES}
main.o : main.c
(TAB)${CC} -c $?
stampa.o : stampa.c
(TAB) ${CC} -c $?
crea.o : crea.s
(TAB)${AS} -o $@ $?
fresh : pippo
(TAB) rm *.o
A.A. 2001/2002
APA-makefile
24
Suffissi (I)
make è stato scritto per facilitare lo sviluppo
del software in UNIX, perciò è possibile
omettere determinate informazioni
predefinite.
Ad esempio, make sa che il compilatore C
compila file sorgenti aventi estensione .c e
che genera file oggetto aventi estensione .o .
Questa conoscenza è contenuta in una regola
per i suffissi: make esamina il suffisso del
target o quello delle dipendenze per
determinare cosa fare successivamente.
A.A. 2001/2002
APA-makefile
25
Suffissi (II)
Ci sono molte regole per i suffisi predefinite
nel make, la maggior parte delle quali
riguarda la compilazione e il linking dei file
oggetto.
Esempio:
.SUFFIXES: .o .c .s
linea di dipendenze, che comunica a make
su quali tipi di estensioni deve eseguire le
regole di suffisso
A.A. 2001/2002
APA-makefile
26
Suffissi (III)
Di default, il make riconosce (e tratta con regole
implicite) i suffissi
.out .a .ln .o .c .cc .C .p .f .F .r
.y .l .s .S .mod .sym .def .h .info
.dvi .tex .texinfo .texi .txinfo .w
.ch .web .sh .elc .el
Per specificare altri suffissi occorre utilizzare la
clausola .SUFFIXES con il seguente formato:
.SUFFIXES: suffissi_separati_da_spazi
A.A. 2001/2002
APA-makefile
27
Regole implicite
Le regole implicite possono essere definite come
segue:
.suffisso_file_sorg.suffisso_file_ogg:
(TAB)comando
i file che terminano con suffisso_file_ogg
devono essere generati dai file (e dipendono da questi
file) che terminano con suffisso_file_sorg e che
hanno la stessa radice di nome di file mediante
l'esecuzione del comando comando.
A.A. 2001/2002
APA-makefile
28
Regole implicite (II)
.c.o:
(TAB)${CC} ${CFLAGS} -c $<
regole di suffisso per .c e .o: comunica al
make di eseguire una compilazione C per
tutti i file aventi estensione .c e per i quali
i relativi file oggetto non sono stati ancora
aggiornati
.s.o:
(TAB)${AS} ${ASFLAGS} -o $@ $<
direttiva analoga per sorgenti assembler.
A.A. 2001/2002
APA-makefile
29
macro $<
Svolge una funzione simile alla $? (si riferisce
a tutte le dipendenze che risultano essere più
recenti rispetto al target corrente ), ma può
essere usata solo in una regola di suffisso.
Rappresenta la dipendenza per la quale la
regola di suffisso è attualmente utilizzata.
A.A. 2001/2002
APA-makefile
30
Regole di suffisso definite
dall’utente
Anche l'utente può definire le proprie regole di
suffisso.
Ad esempio, se volessimo copiare i file
oggetto in un’altra directory dopo la
compilazione, dovremmo definire la seguente
regola di suffisso :
.c.o:
(TAB)${CC} ${CFLAGS} -c $<
(TAB)cp $@ backup
A.A. 2001/2002
APA-makefile
31
Attivazione delle regole di
suffisso
A.A. 2001/2002
make cerca di generare un target
provando ad applicare le regole
utente definisce le dipendenze senza
comandi.
APA-makefile
32
Esempio
# Makefile di prova versione 3
CC=/usr/bin/gcc
AS=/usr/bin/as
OGGETTI=main.o stampa.o crea.o
LIB_DIR=/usr/lib
LIB_FILES=${LIB_DIR}/book.a
pippo:${OGGETTI} ${LIB_FILES}
(TAB)${CC} -o $@ ${OGGETTI} ${LIB_FILES}
main.o:main.c
fresh:pippo
(TAB)rm *.o
A.A. 2001/2002
APA-makefile
33
Opzioni
Fra le opzioni accettate dal comando make le
piu' importanti sono:
-f nomefile
considera il makefile nomefile anziché i
makefile di default
-n
fa vedere i comandi che verrebbero
eseguiti senza però eseguirli (utile in fase
di debug del makefile)
A.A. 2001/2002
APA-makefile
34
Opzioni (II)
-d
stampa molte informazioni di debugging, fra cui
anche le informazioni usate per decidere quali
azioni compiere
-p
stampa il data base delle regole in uso, prima di
procedere alle azioni giudicate necessarie in base
alle regole
es.
make –p –f /dev/null
stampa regole predefinite
A.A. 2001/2002
APA-makefile
35
Opzioni (III)
-r
inibisce l’uso delle regole/macro di default
MACRO=valore
proceda come se nel makefile vi fosse una
riga MACRO=valore
A.A. 2001/2002
APA-makefile
36
File Header
Occorre creare la dipendenza tra il file .h ed il
file .o che si genera dai corrispondenti file .c
che includono il file .h.
Non bisogna creare una dipendenza tra file .h
e file .c.
A.A. 2001/2002
APA-makefile
37
Esempio
OGG=main.o mergsort.o
main: $(OGG)
$(CC) $(CFLAGS) –o $@ $(OGG)
main.o: main.c mergesort.h
mergesort.o: mergesort.c mergesort.h
A.A. 2001/2002
APA-makefile
38