与.c或.s匹配的Makefile模式规则

与.c或.s匹配的Makefile模式规则,makefile,gnu-make,Makefile,Gnu Make,有没有办法将这两个模式规则组合成一个?(除了一个用于C文件,另一个用于程序集之外,它们是相同的。) $(USR\u OBJ)/%.o:$(USR\u SRC)/%.c$(OS\u SRC)/*.h $(elfCC)$(CFLAGS)-c$

有没有办法将这两个模式规则组合成一个?(除了一个用于C文件,另一个用于程序集之外,它们是相同的。)

$(USR\u OBJ)/%.o:$(USR\u SRC)/%.c$(OS\u SRC)/*.h
$(elfCC)$(CFLAGS)-c$<-o$@-I$(OS_SRC)
$(USR_OBJ)/%.o:$(USR_SRC)/%.s$(OS_SRC)/*.h
$(elfCC)$(CFLAGS)-c$<-o$@-I$(OS_SRC)

复制并不可怕;但是,这两条规则之间只有一个字母的区别,这让我很恼火。(而且,与此不同,我不希望我的旗帜会出现分歧。)

不太可能。您所能做的最好(IMO)是为配方使用一个变量,以避免重复:

COMPILE.o = $(elfCC) $(CFLAGS) -c $< -o $@ -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)
更好的方法是使用一种自动依赖项生成方法,这样更改一个头就不会重新编译世界(除非您知道所有
.c
.s
文件始终包含所有头)

有一些选项,比如使用
define
foreach
等。但是只有两个规则是多余的,它们会使生成文件的可读性大大降低。如果你有5个或10个变体,也许是值得的

COMPILE.o = $(elfCC) $(CFLAGS) -c $< -o $@ -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)