有没有办法将这两个模式规则合并为一个? (它们是相同的,除了一个用于C文件,另一个用于汇编。)
$(USR_OBJ)/%.o: $(USR_SRC)/%.c $(OS_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)
重复并不可怕;但是,这只是让我觉得两条规则之间只有一个字母差异。 (而且,与Makefile implicit rules matching .c OR .cpp不同,我不希望我的旗帜会分歧。)
答案 0 :(得分:2)
不是真的。您可以做的最好的事情(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)
一次执行通配符更有效,而不是每次匹配规则时重做它:
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
文件都包含所有标题一直在。)
有一些选项,比如使用define
和foreach
等等,但只有两条规则它们会过度杀戮,并且会让你的makefile多少可读。如果您有5或10个变化,那么它是值得的。