2017-06-13 54 views
1

是否有將這兩個模式規則合併爲一個的方法? (它們是相同的,除了一個用於C文件,另一個用於裝配。)與.c或.s匹配的Makefile模式規則

$(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) 

重複並不可怕;但是,這只是讓我感到兩個規則之間只有一個字母的區別。 (而且,與Makefile implicit rules matching .c OR .cpp不同,我不認爲我的旗幟會發生分歧。)

回答

2

不是真的。你可以做(​​IMO)最好是使用一個變量的配方,以避免一些重複:

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) 

這是更有效的做通配符一次,而不是每一個規則被匹配時重做:

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

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

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

更妙的是使用的自動依存產生的方法之一,以便改變一個頭不重新編譯世界(除非你知道你的所有.c.s文件包括所有的頭所有的時間) 。

有喜歡使用defineforeach等,但只有兩個規則,他們是矯枉過正選擇,並留下您的makefile很多可讀。如果你有5或10個變種,也許這是值得的。