与.c或.s匹配的Makefile模式规则
有没有办法将这两个模式规则组合成一个?(除了一个用于C文件,另一个用于程序集之外,它们是相同的。)与.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$
$(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)