2017-07-18 1 views
0

Voici mon makefile:Comment utiliser les règles implicites de GNU make pour faire `foo` de` foo.s`?

AS=nasm 
ASFLAGS=-f elf64 

%: %.o 
     ${LD} -o [email protected] $< 

Supposons que j'ai un fichier source foo.s, je peux courir make foo.o puis make foo pour rendre le fichier exécutable foo.

$ make foo.o 
nasm -f elf64 -o foo.o foo.s 
$ make foo 
ld -o foo foo.o 

Mais si je lance directement make foo, cc est utilisé à la place.

$ rm foo foo.o 
$ make foo 
cc -f elf64 foo.s -o foo 
cc: error: elf64: No such file or directory 
cc: error: unrecognized command line option ‘-f’ 
make: *** [<builtin>: foo] Error 1 

Ceci est expliqué dans the documentation, à la fin de la section « Liaison d'un seul fichier objet ».

Comment dois-je écrire mon makefile pour que je puisse courir make foo pour faire foo.o de foo.s puis foo de foo.o automatiquement?

Répondre

1

Vous pouvez effacer la règle par défaut implicite avec:

%: %.s 

Voir Canceling Implicit Rules dans le manuel de marque.

0

Vous pouvez remplacer:

%: %.o 
    ${LD} -o [email protected] $< 

par:

ASEXES := $(patsubst %.s,%,$(wildcard *.s)) 

$(ASEXES): %: %.o 
    ${LD} -o [email protected] $< 

C'est un un Static Pattern Rule. Pour chaque mot dans $(ASEXES), il instancie une règle explicite, pas une règle de modèle. Ainsi, il est traité exactement comme si vous aviez explicitement écrit:

foo: foo.o 
    ${LD} -o [email protected] $< 

pour chaque foo dans $(ASEXES), alors que les règles de modèle comme:

%: %.o 
     ${LD} -o [email protected] $< 

sont traités différemment (voir la section intitulée Static Pattern Rules versus Implicit Rules de la GNU faire un manuel).

+0

Cela fonctionne. Voulez-vous expliquer pourquoi? – TheoYou

+0

J'ai ajouté des liens vers le manuel GNU make –