Recherche…


Règle de base

Une règle de motif est indiquée par un seul caractère % dans la cible. Le % correspond à une chaîne non vide appelée la tige . La racine est alors substituée à chaque % qui apparaît dans la liste de prérequis.

Par exemple, cette règle:

%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

Correspond à toute cible se terminant par .o . Si la cible était foo.o , la racine serait foo et compilerait foo.c à foo.o Les cibles et les prérequis sont accessibles à l'aide de variables automatiques.

Cibles correspondant à plusieurs règles de modèle

Si une cible correspond à plusieurs règles de modèle, make utilisera celle dont les conditions préalables existent ou peuvent être générées. Par exemple:

%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@
%.o: %.s
    $(AS) $(ASFLAGS) $< -o $@

Compilera foo.c pour foo.o ou assemblera foo.s à foo.o , en fonction de celui de foo.c ou foo.s

Si plusieurs règles ont des conditions préalables qui existent ou peuvent être générées, make utilisera la règle qui correspond à la plus courte racine. Par exemple:

f%r:
    @echo Stem is: $*
fo%r:
    @echo Stem is: $*

Utilisera la deuxième règle pour rendre la cible foo.bar , écho Stem is: o.ba

Si plusieurs règles correspondent à la plus courte racine, make utilisera la première dans le Makefile.

Répertoires dans les règles de modèle

Si le modèle cible ne contient pas de barre oblique, make supprime la partie de répertoire de la cible qu'il tente de générer avant de la mettre en correspondance. Le répertoire sera alors placé devant la tige. Lorsque la tige est utilisée pour créer le nom cible et les conditions préalables, la partie répertoire est supprimée, la racine est substituée à la place de % et le répertoire est finalement placé devant la chaîne. Par exemple:

foo%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

lib/foobar.o , avec:

  • Stem ( $* ): lib/bar
  • Nom de la cible ( $@ ): lib/foobar.o
  • Prérequis ( $< , $^ ): lib/foobar.c

Dans cet exemple, une règle lib/foo%.o sur la règle foo%.o car elle correspond à une racine plus courte.

Règles de modèle avec plusieurs cibles

Les règles de pattern peuvent avoir plusieurs cibles mais, contrairement aux règles normales, la recette est responsable de la réalisation de toutes les cibles. Par exemple:

debug/%.o release/%.o: %.c
    $(CC) $(CFLAGS_DEBUG) -c $< -o debug/$*.o
    $(CC) $(CFLAGS_RELEASE) -c $< -o release/$*.o

Est une règle valide qui va créer des objets de débogage et de libération lorsque l'un d'eux doit être construit. Si nous écrivions quelque chose comme:

debug/%.o release/%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

Cela fonctionnerait quand un seul des programmes debug/*.o ou release/*.o est construit, mais il ne construira que la première cible (et considérera la seconde comme étant à jour) lorsque les deux doivent être construits.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow