Définition de règles dans Makefile

Nous allons maintenant apprendre les règles de Makefile.

La syntaxe générale d'une règle cible Makefile est -

target [target...] : [dependent ....]
[ command ...]

Dans le code ci-dessus, les arguments entre crochets sont facultatifs et les points de suspension signifient un ou plusieurs. Ici, notez que l'onglet précédant chaque commande est obligatoire.

Un exemple simple est donné ci-dessous où vous définissez une règle pour rendre votre cible bonjour à partir de trois autres fichiers.

hello: main.o factorial.o hello.o
   $(CC) main.o factorial.o hello.o -o hello

NOTE - Dans cet exemple, vous devrez donner des règles pour créer tous les fichiers objets à partir des fichiers source.

La sémantique est très simple. Lorsque vous dites "ciblez", lemaketrouve la règle cible qui s'applique; et, si l'une des personnes à charge est plus récente que la cible,makeexécute les commandes une par une (après substitution de macro). Si des dépendants doivent être créés, cela se produit en premier (vous avez donc une récursivité).

Makese termine si une commande renvoie un état d'échec. La règle suivante sera affichée dans ce cas -

clean:
   -rm *.o *~ core paper

Makeignore l'état renvoyé sur les lignes de commande commençant par un tiret. Par exemple, qui se soucie s'il n'y a pas de fichier de base?

Makefait écho aux commandes, après la substitution de macro pour vous montrer ce qui se passe. Parfois, vous voudrez peut-être désactiver cela. Par exemple -

install:
   @echo You must be root to install

Les gens s'attendent à certaines cibles dans Makefiles. Vous devez toujours naviguer en premier. Cependant, il est raisonnable de s'attendre à ce que toutes les cibles (ou simplement créer), installer et nettoyer soient trouvées.

  • make all - Il compile tout pour que vous puissiez faire des tests locaux avant d'installer des applications.

  • make install - Il installe les applications aux bons endroits.

  • make clean - Il nettoie les applications, supprime les exécutables, les fichiers temporaires, les fichiers objets, etc.

Règles implicites Makefile

La commande est celle qui devrait fonctionner dans tous les cas où nous construisons un exécutable x à partir du code source x.cpp. Cela peut être énoncé comme une règle implicite -

.cpp:
   $(CC) $(CFLAGS) [email protected] $(LDFLAGS) -o [email protected]

Cette règle implicite indique comment créer x à partir de xc - exécuter cc sur xc et appeler la sortie x. La règle est implicite car aucune cible particulière n'est mentionnée. Il peut être utilisé dans tous les cas.

Une autre règle implicite courante est la construction de fichiers .o (objets) à partir de .cpp (fichiers sources).

.cpp.o:
   $(CC) $(CFLAGS) -c $<

alternatively

.cpp.o:
   $(CC) $(CFLAGS) -c $*.cpp