Molto spesso soprattutto per aumentare la flessibilità di progetti di grandi dimensioni vengono usate all'interno di un Makefile le macro. Una macro é un nome, che ha associato un valore. Tutte le volte che il make incontra quel nome, rimpiazza il nome con il valore ad esso associato. Facciamo un esempio più chiaro, supponiamo di aver bisogno di una data flessibilità quando compiliamo un file, e creiamo una macro CFLAGS= -g -Wall, faremo riferimento a tale macro in tutto il Makefile con $(CFLAGS). Tutte le volte che il make incontra l'espressione $(CFLAGS), la sostituisce con -g -Wall.
Vediamo un esempio di un Makefile con macro:
Esempio 2-2. Makefile con i suffissi
# Tipo di compilatore
CC= gcc
# Opzioni per il compilatore
CFLAGS= -g -Wall
@echo Compilazione in corso
all : main.o token.o mostra.o \
ins.o matrix.o
$(CC) $(CFLAGS) -o sysa main.o token.o mostra.o \
ins.o matrix.o
@echo Compilazione dei sottoprogrammi
main.o : main.c header1.h
$(CC) $(CFLAGS) -c main.c
token.o : token.c tokentype.h
$(CC) $(CFLAGS) -c token.c
mostra.o : mostra.c header1.h
$(CC) $(CFLAGS) -c mostra.c
ins.o : ins.c tokentype.h
$(CC) $(CFLAGS) -c ins.c
matrix.o : matrix.c header1.h
$(CC) $(CFLAGS) -c matrix.c
main.o : main.c header1.h
gcc -c main.c
clean : rm sysa main.o token.o mostra.o ins.o \
matrix.o
install: cp sysa /usr/bin/sysa
Nell'esempio soprastante, vedete le macro CC, e CFLAGS. Tutte le
volte che compaiono il make le rimpiazza con la stringa associata
ad esse, quello che voglio farvi notare é quanto questo sia utile.
Supponete che invece di avere un Makefile di dieci righe come questo,
abbiate bisogno di un Makefile ben più grande. In questo caso se
volete cambiare le opzioni del compilatore nel Makefile, dovrete
sostituire tutte le opzioni, per esempio usando Emacs, mediante
un Query and Replace.
Questa é operazione un po' noiosa se il Makefile é lunghissimo,
ma per fortuna l'esistenza delle macro ci dispensa da ciò, basta
infatti solo cambiare una linea e il lavoro é finito. La linea CFLAGS,
é appunto la macro che rappresenta le opzioni da passare al compilatore
che é rappresentato dalla macro CC. Ho scelto di definire una macro
per il compilatore perché in Linux esistono molti compilatori C.
Ancora un altro Makefile.
Vediamo di spiegare nei dettagli questo Makefile, che é un pò
più complesso:
Esempio 2-3. Un makefile più interessante
# Directory dove
andrà installato il programma
INSTDIR= /usr/local/bin
# Tipo di compilatore
CC= gcc
# Opzioni per il compilatore
CFLAGS= -g -Wall
@echo Compilazione in corso
all : main.o token.o mostra.o \
ins.o matrix.o
$(CC) $(CFLAGS) -o sysa main.o token.o mostra.o \
ins.o matrix.o
@echo Compilazione dei sottoprogrammi
main.o : main.c header1.h
$(CC) $(CFLAGS) -c main.c
token.o : token.c tokentype.h
$(CC) $(CFLAGS) -c token.c
mostra.o : mostra.c header1.h
$(CC) $(CFLAGS) -c mostra.c
ins.o : ins.c tokentype.h
$(CC) $(CFLAGS) -c ins.c
matrix.o : matrix.c header1.h
$(CC) $(CFLAGS) -c matrix.c
clean : -rm sysa main.o token.o mostra.o ins.o \
matrix.o
install:
@if [ -d $(INSTDIR) ] ;\
then \
install -m 711 sysa $(INSTDIR)/sysa &&\
echo "Installazione eseguita con successo!";\
else \
echo "Impossibile installare nella directory
$(INSTDIR)" ;\
fi
.PHONY: install
Torna all'indice Generale del corso di Corso di C con Linux di Software Planet