il programma make maurizio rebaudengo, fulvio corno dip. automatica e informatica politecnico di...

38
Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

Upload: filumena-milani

Post on 01-May-2015

216 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

Il programma make

Maurizio Rebaudengo, Fulvio Corno

Dip. Automatica e InformaticaPolitecnico di Torino

Page 2: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 2

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.

Page 3: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 3

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.

Page 4: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 4

Make e makefileIl 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.

Page 5: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 5

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

Page 6: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 6

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 dette linee di comando.La sintassi è la seguente:

target: dipendenze (TAB) lista di comandi

Quando viene modificato dipendenze devo aggiornare

il targetPer aggiornare il target bisogna

eseguire la lista di comandi

Page 7: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 7

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.

Page 8: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 8

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

Page 9: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 9

Formato (V)

Le linee di commento sono precedute dal carattere “#”.

Page 10: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 10

Target

Il target generalmente è il nome di un file, mentre le dipendenze sono generalmente dei file collegati logicamente al target.

Page 11: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 11

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.

Page 12: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 12

Esecuzione di un comandoPer 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.

Page 13: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 13

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

Page 14: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 14

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)

Page 15: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 15

Soluzione (I)

prova è il target del make mentre i file oggetto e le librerie sono le sue dipendenze.

Page 16: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 16

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

Page 17: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 17

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.

Page 18: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 18

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

Page 19: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 19

Le macro

All'interno del makefile è possibile definire delle macro. Sarà compito del make espandere tali macro.

Page 20: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 20

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

Page 21: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 21

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. EsempioBOOK_DIR=/home/book/ MIO_LIBRO=${BOOK_DIR}/Andrea/libro

Page 22: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 22

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.

Page 23: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 23

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

Page 24: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 24

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

Page 25: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 25

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.

Page 26: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 26

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

Page 27: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 27

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

Page 28: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 28

Regole impliciteLe 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.

Page 29: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 29

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.

Page 30: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 30

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.

Page 31: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 31

Regole di suffisso definite dall’utenteAnche 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

Page 32: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 32

Attivazione delle regole di suffisso

make cerca di generare un target provando ad applicare le regole

utente definisce le dipendenze senza comandi.

Page 33: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 33

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

Page 34: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 34

Opzioni

Fra le opzioni accettate dal comando make le piu' importanti sono: -f nomefile

considera il makefile nomefile anziché i makefile di default

-nfa vedere i comandi che verrebbero eseguiti senza però eseguirli (utile in fase di debug del makefile)

Page 35: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 35

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 regolees.make –p –f /dev/null

stampa regole predefinite

Page 36: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 36

Opzioni (III)

-r inibisce l’uso delle regole/macro di default

MACRO=valore proceda come se nel makefile vi fosse una riga MACRO=valore

Page 37: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 37

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.

Page 38: Il programma make Maurizio Rebaudengo, Fulvio Corno Dip. Automatica e Informatica Politecnico di Torino

A.A. 2001/2002 APA-makefile 38

Esempio

OGG=main.o mergsort.o

main: $(OGG)

$(CC) $(CFLAGS) –o $@ $(OGG)

main.o: main.c mergesort.h

mergesort.o: mergesort.c mergesort.h