Corso di C con Linux

Macro e Makefile

 

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