2017-06-13 53 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个变种,也许这是值得的。