与.c或.s

时间:2017-06-13 17:30:34

标签: makefile gnu-make

有没有办法将这两个模式规则合并为一个? (它们是相同的,除了一个用于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不同,我不希望我的旗帜会分歧。)

1 个答案:

答案 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文件都包含所有标题一直在。)

有一些选项,比如使用defineforeach等等,但只有两条规则它们会过度杀戮,并且会让你的makefile多可读。如果您有5或10个变化,那么它是值得的。