Makefile - Altre caratteristiche

In questo capitolo, esamineremo varie altre caratteristiche di Makefile.

Uso ricorsivo di Make

Uso ricorsivo di make significa usare makecome comando in un makefile. Questa tecnica è utile quando si vogliono makefile separati per vari sottosistemi che compongono un sistema più grande. Per esempio, supponi di avere una sottodirectory chiamata `subdir 'che ha il suo makefile, e desideri che il makefile della directory contenitore venga eseguitomakenella sottodirectory. Puoi farlo scrivendo il codice sottostante -

subsystem:
   cd subdir && $(MAKE)

or, equivalently:
 	
subsystem:
   $(MAKE) -C subdir

Puoi scrivere ricorsivo makecomandi semplicemente copiando questo esempio. Tuttavia, è necessario sapere come funzionano e perché, e in che modo la marca secondaria si collega alla marca di primo livello.

Comunicazione di variabili a un sub-make

Valori variabili del primo livello makepuò essere passato al sub-make attraverso l'ambiente su esplicita richiesta. Queste variabili sono definite nella sub-marca come valori predefiniti. Non è possibile sovrascrivere ciò che è specificato nel makefile usato dal sub-make makefile a meno che non si usi l'opzione `-e '.

Per trasmettere o esportare una variabile, makeaggiunge la variabile e il suo valore all'ambiente per l'esecuzione di ogni comando. Il sub-make, a sua volta, utilizza l'ambiente per inizializzare la sua tabella di valori variabili.

Le variabili speciali SHELL e MAKEFLAGS vengono sempre esportate (a meno che non vengano annullate). MAKEFILES viene esportato se lo imposti su qualcosa.

Se vuoi esportare variabili specifiche in un sub-make, usa la direttiva export, come mostrato di seguito -

export variable ...

Se vuoi impedire che una variabile venga esportata, usa la direttiva unexport, come mostrato di seguito -

unexport variable ...

La variabile MAKEFILES

Se la variabile d'ambiente MAKEFILES è definita, makeconsidera il suo valore come un elenco di nomi (separati da spazi bianchi) di makefile aggiuntivi da leggere prima degli altri. Funziona in modo molto simile alla direttiva include: i file vengono ricercati in varie directory.

L'utilizzo principale di MAKEFILES è nella comunicazione tra invocazioni ricorsive di make.

Incluso file di intestazione da directory diverse

Se hai messo i file di intestazione in directory diverse e stai eseguendo makein una directory diversa, quindi è necessario fornire il percorso dei file di intestazione. Questo può essere fatto usando l'opzione -I nel makefile. Supponendo che il file functions.h sia disponibile nella cartella / home / tutorialspoint / header e il resto dei file sia disponibile nella cartella / home / tutorialspoint / src /, il makefile verrebbe scritto come segue:

INCLUDES = -I "/home/tutorialspoint/header"
CC = gcc
LIBS =  -lm
CFLAGS = -g -Wall
OBJ =  main.o factorial.o hello.o

hello: ${OBJ}
   ${CC} ${CFLAGS} ${INCLUDES} -o $@ ${OBJS} ${LIBS}
.cpp.o:
   ${CC} ${CFLAGS} ${INCLUDES} -c $<

Aggiunta di più testo alle variabili

Spesso è utile aggiungere più testo al valore di una variabile già definita. Lo fai con una riga contenente "+ =", come mostrato -

objects += another.o

Prende il valore degli oggetti variabili e aggiunge il testo "another.o", preceduto da un singolo spazio come mostrato di seguito.

objects = main.o hello.o factorial.o
objects += another.o

Il codice precedente imposta gli oggetti su `main.o hello.o factorial.o another.o '.

L'uso di "+ =" è simile a:

objects = main.o hello.o factorial.o
objects := $(objects) another.o

Riga di continuazione nel Makefile

Se non ti piacciono le linee troppo grandi nel tuo Makefile, puoi spezzare la linea usando una barra rovesciata "\" come mostrato di seguito -

OBJ =  main.o factorial.o \
   hello.o

is equivalent to

OBJ =  main.o factorial.o hello.o

Esecuzione di Makefile dal prompt dei comandi

Se hai preparato il Makefile con il nome "Makefile", scrivi semplicemente make al prompt dei comandi e verrà eseguito il file Makefile. Ma se hai dato un altro nome al Makefile, usa il seguente comando:

make -f your-makefile-name