2017-06-13 1 views
1

Gibt es eine Möglichkeit, diese beiden Musterregeln zu einer zu kombinieren? (Sie sind identisch, mit Ausnahme einer für C-Dateien und die andere für die Montage ist.)Makefile-Musterregel, die entweder .c oder .s entspricht

$(USR_OBJ)/%.o: $(USR_SRC)/%.c $(OS_SRC)/*.h 
    $(elfCC) $(CFLAGS) -c $< -o [email protected] -I $(OS_SRC) 

$(USR_OBJ)/%.o: $(USR_SRC)/%.s $(OS_SRC)/*.h 
    $(elfCC) $(CFLAGS) -c $< -o [email protected] -I $(OS_SRC) 

Die Vervielfältigung ist nicht schrecklich; aber es stört mich nur, dass es nur einen Buchstaben Unterschied zwischen den beiden Regeln gibt. (Und im Gegensatz zu Makefile implicit rules matching .c OR .cpp erwarte ich nicht, dass meine Flags divergieren.)

Antwort

2

Nicht wirklich. Das Beste, was Sie tun können (IMO) ist eine Variable für das Rezept verwenden, um eine Doppelarbeit zu vermeiden:

COMPILE.o = $(elfCC) $(CFLAGS) -c $< -o [email protected] -I $(OS_SRC) 

$(USR_OBJ)/%.o: $(USR_SRC)/%.c $(OS_SRC)/*.h 
     $(COMPILE.o) 

$(USR_OBJ)/%.o: $(USR_SRC)/%.s $(OS_SRC)/*.h 
     $(COMPILE.o) 

Es ist viel effizienter, die Wildcard einmal zu tun, anstatt Redo es jedes Mal, wenn die Regel erfüllt ist:

HEADERS := $(wildcard $(OS_SRC)/*.h) 

$(USR_OBJ)/%.o: $(USR_SRC)/%.c $(HEADERS) 
     $(COMPILE.o) 

$(USR_OBJ)/%.o: $(USR_SRC)/%.s $(HEADERS) 
     $(COMPILE.o) 

Noch besser wäre eine der auto-Abhängigkeit Generation Methoden zu verwenden, so dass ein Kopf ändert die Welt nicht neu kompiliert werden (es sei denn, Sie wissen, dass alle Ihre .c und .s Dateien umfassen alle Header die ganze Zeit) .

Es gibt Optionen wie eine define verwenden und eine foreach etc., aber nur für zwei Regeln sind sie viel des Guten und wird Ihr Make-Datei viel weniger lesbar lassen. Wenn du 5 oder 10 Variationen hättest, wäre es vielleicht lohnenswert.

Verwandte Themen