Makefile - Autres fonctionnalités

Dans ce chapitre, nous examinerons diverses autres fonctionnalités de Makefile.

Utilisation récursive de Make

Utilisation récursive de make signifie utiliser makeen tant que commande dans un makefile. Cette technique est utile lorsque vous voulez des fichiers Make séparés pour différents sous-systèmes qui composent un système plus grand. Par exemple, supposons que vous ayez un sous-répertoire nommé `subdir 'qui a son propre makefile, et que vous souhaitiez que le makefile du répertoire contenant s'exécutemakedans le sous-répertoire. Vous pouvez le faire en écrivant le code ci-dessous -

subsystem:
   cd subdir && $(MAKE)

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

Vous pouvez écrire récursif makecommandes simplement en copiant cet exemple. Cependant, vous devez savoir comment ils fonctionnent et pourquoi, et comment la sous-marque est liée à la marque de niveau supérieur.

Communication de variables à une sous-marque

Valeurs variables du niveau supérieur makepeut être passé au sous-make via l'environnement par requête explicite. Ces variables sont définies par défaut dans la sous-marque. Vous ne pouvez pas remplacer ce qui est spécifié dans le makefile utilisé par le makefile du sous-make à moins d'utiliser le commutateur `-e '.

Pour transmettre ou exporter une variable, makeajoute la variable et sa valeur à l'environnement pour exécuter chaque commande. La sous-marque, à son tour, utilise l'environnement pour initialiser sa table de valeurs de variables.

Les variables spéciales SHELL et MAKEFLAGS sont toujours exportées (sauf si vous les annulez). MAKEFILES est exporté si vous le définissez sur quelque chose.

Si vous souhaitez exporter des variables spécifiques vers une sous-marque, utilisez la directive d'exportation, comme indiqué ci-dessous -

export variable ...

Si vous souhaitez empêcher l'exportation d'une variable, utilisez la directive unxport, comme indiqué ci-dessous -

unexport variable ...

La variable MAKEFILES

Si la variable d'environnement MAKEFILES est définie, makeconsidère sa valeur comme une liste de noms (séparés par un espace) de makefiles supplémentaires à lire avant les autres. Cela fonctionne un peu comme la directive include: dans divers répertoires sont recherchés ces fichiers.

L'utilisation principale de MAKEFILES est la communication entre les invocations récursives du make.

Inclure le fichier d'en-tête de différents répertoires

Si vous avez placé les fichiers d'en-tête dans différents répertoires et que vous exécutez makedans un répertoire différent, il est alors nécessaire de fournir le chemin des fichiers d'en-tête. Cela peut être fait en utilisant l'option -I dans makefile. En supposant que le fichier functions.h est disponible dans le dossier / home / tutorialspoint / header et que le reste des fichiers est disponible dans le dossier / home / tutorialspoint / src /, alors le makefile serait écrit comme suit -

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 $<

Ajouter plus de texte aux variables

Il est souvent utile d'ajouter plus de texte à la valeur d'une variable déjà définie. Vous faites cela avec une ligne contenant `+ = ', comme indiqué -

objects += another.o

Il prend la valeur des objets variables et y ajoute le texte «another.o», précédé d'un seul espace comme indiqué ci-dessous.

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

Le code ci-dessus définit les objets sur `main.o hello.o factorial.o another.o '.

L'utilisation de `+ = 'est similaire à:

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

Ligne de continuation dans Makefile

Si vous n'aimez pas les lignes trop grandes dans votre Makefile, vous pouvez couper votre ligne en utilisant une barre oblique inverse "\" comme indiqué ci-dessous -

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

is equivalent to

OBJ =  main.o factorial.o hello.o

Exécution de Makefile à partir de l'invite de commande

Si vous avez préparé le Makefile avec le nom "Makefile", écrivez simplement make à l'invite de commande et il exécutera le fichier Makefile. Mais si vous avez donné un autre nom au Makefile, utilisez la commande suivante -

make -f your-makefile-name