2010-12-15 12 views
2

Ich benutze GNU make. In einem Makefile, das ich bekommen habe, sehe ich das Symbol '%'. z.B. im Kontext von % .c,% .asm,% .o etc .. (Ist es ein Platzhalter, der alle Dateien dieser Erweiterung zurückgibt)Was macht der `%` Charakter in GNU Make?

Was bedeutet%?

Was wird die folgende Regel tun:

%.o: %.c 
    gcc $< -o:[email protected] 

danke,

-AD

+0

Diese Frage ist "welches Ziel sind Wildcards für?" Es gab eine andere Frage formuliert "wie kann ich das Ziel erreichen" mit der Antwort "mit Wildcards!" Ich würde es ein Reverse-Dupe nennen :-) Hier ist die Frage: http://StackOverflow.com/Questions/1633527/Wildcard-Targets-in-Amakefile –

+0

Ich las über Musterregeln an: gnu.org/ software/automake/manual/make/Pattern-Rules.html Dort las ich eine Aussage, die sagte: "Eine Musterregel sieht wie eine gewöhnliche Regel aus, außer dass ihr Ziel das Zeichen '%' enthält (genau eine davon)." Was? ist genau einer von ihnen gemeint? – goldenmean

Antwort

2

Die Regel:

%.o: %.c 
    gcc $< -o:[email protected] 

für jede C-Datei einer Objektdatei erstellen Verwenden Sie den Befehl darunter. Also ja,% ist wie eine Wildcard, aber ich denke, es ist "für jeden", denn das passiert als Ergebnis der Regel. $< bedeutet abhängige Dateien und [email protected] bedeutet das Objekt, das gebaut werden soll. Wenn Sie dies tun:

fred.o: fred.c 
    gcc $< -o:[email protected] 

Hier [email protected]=fred.o und $<=fred.c Ebenso

fred.o: fred.c george.c 
    gcc $< -o:[email protected] 

geben [email protected]=fred.o und $<=fred.c george.c.

Edit: von den Befehlen werde ich auf diese erweitern.

% wird alles passen, das dazu passt. So bedeutet %.c alle .c-Dateien im aktuellen Verzeichnis. asm/%.asm bedeutet alle Dateien im Unterverzeichnis asm mit der Erweiterung .asm. Es wirkt wie ein Token, also wird das, was gefunden wird, immer dann verwendet, wenn Sie das nächste Mal %, d. H. Im Etikett, verwenden.

also die Regel:

objs/asm/%.o: arch/%.S 
    nasm -felf64 $< -o [email protected] 

Bei arch/hello.S, arch/bye.S, arch/somethingelse.S wird obj/asm/hello.o, obj/asm/bye.S, obj/asm/somethingelse.o erstellen.

+0

Ich las über Musterregeln unter: http://www.gnu.org/software/automake/manual/make/Pattern-Rules.html Dort las ich eine Aussage, die sagte: "Eine Musterregel sieht wie eine gewöhnliche Regel aus, außer dass sein Ziel das Zeichen '%' enthält (genau einer von ihnen). "Was bedeutet genau einer von ihnen?" Außerdem hatte ich eine Musterregel wie:% .obj: isp /%. Asm $ (ASM) $ <-o: $ @, aber irgendwie wurden nicht alle asm-Dateien für die Assemblierung ausgewählt. Ich habe später eine Assembly-Datei zu diesem Ordner hinzugefügt und es wurde nicht zusammengebaut. Muss die Erstellungsregel für diese Datei manuell hinzufügen. – goldenmean

+0

Es bedeutet, dass, was auch immer% repräsentiert, überall dort verwendet wird, wo% erwähnt wird. Sie können nicht zwei Dinge auf einmal zusammenbringen. Diese Regel passt alles in isp/somename.asm an und erstellt somename.o. Versuchen Sie ls isp/*. Asm.Das ist, was isp /%. Asm zusammenbringt. Dann wird es das% nehmen, ein .o auf das Ende setzen und das wird der Name der Regel (die zu machende Sache). –

+0

Ok, also wenn% .asm für jede asm-Datei bedeutet, wandle jeden in * .obj um. Also, wenn ich eine weitere asm-Datei zu den vorhandenen Dateien im Ordner hinzufüge, aber es wurde nicht zusammengebaut? Was könnte der Grund sein? Sorry, ich bin etwas verwirrt? – goldenmean