避免重复GNU Make规则

Ala*_*air 5 makefile rules targets

我一直在编写一个Makefile来执行一些依赖项生成,我发现自己不得不重复规则,因为(遗留)代码库包含.cpp.cc文件的混合.看起来有点不雅观.无论如何要指定目标的先决条件可以是文件.cpp还是.cc文件?

所以,而不是:

%.d : %.cpp
    $(CPP) -MM $(CPPFLAGS) $<

%.d : %.cc
    $(CPP) -MM $(CPPFLAGS) $<
Run Code Online (Sandbox Code Playgroud)

创建没有重复的东西,如:

%.d : %.(cpp | cc)
    $(CPP) -MM $(CPPFLAGS) $<
Run Code Online (Sandbox Code Playgroud)

或者这种强制冗余只是GNU Make设计的一个不幸因素?

Eri*_*ski 3

第一个选项,使用变量定义规则主体一次,并根据需要重用它:

DEPGEN=$(CPP) -MM $(CPPFLAGS) $<
%.d: %.cpp ; $(DEPGEN)
%.d: %.cc  ; $(DEPGEN)
Run Code Online (Sandbox Code Playgroud)

第二个选项,用于$(eval)动态生成规则:

$(foreach src,cpp cc,$(eval %.d: %.$(src) ; $$(CPP) -MM $$(CPPFLAGS) $$<))
Run Code Online (Sandbox Code Playgroud)