Makefile 避免重复GNU制定规则

Makefile 避免重复GNU制定规则,makefile,rules,targets,Makefile,Rules,Targets,我一直在编写一个Makefile来执行一些依赖项生成,我发现自己必须复制规则,因为(遗留)代码库包含.cpp和.cc文件的混合体。看起来有点难看。是否需要指定目标的先决条件可以是.cpp或.cc文件 因此,我们没有: %.d : %.cpp $(CPP) -MM $(CPPFLAGS) $< %.d : %.cc $(CPP) -MM $(CPPFLAGS) $< %.d:%.cpp $(CPP)-MM$(CPP标志)$< %.d:%.cc $(CPP)-MM$(

我一直在编写一个Makefile来执行一些依赖项生成,我发现自己必须复制规则,因为(遗留)代码库包含
.cpp
.cc
文件的混合体。看起来有点难看。是否需要指定目标的先决条件可以是
.cpp
.cc
文件

因此,我们没有:

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

%.d : %.cc
    $(CPP) -MM $(CPPFLAGS) $<
%.d:%.cpp
$(CPP)-MM$(CPP标志)$<
%.d:%.cc
$(CPP)-MM$(CPP标志)$<
创建一些没有重复的内容,如:

%.d : %.(cpp | cc)
    $(CPP) -MM $(CPPFLAGS) $<
%.d:%。(政协)
$(CPP)-MM$(CPP标志)$<
或者,这种强制冗余只是GNU Make设计中的一个不幸因素吗?

这应该是可行的:

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

%.d :: %.cc
    $(CPP) -MM $(CPPFLAGS) $<
%.d::%.cpp
$(CPP)-MM$(CPP标志)$<
%.d::%.cc
$(CPP)-MM$(CPP标志)$<
另一个想法是:

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

%.c : %.cpp
    ln $< $@  # or cp -p
%.d:%.c
$(CPP)-MM$(CPP标志)$<
%.c:%.cpp
ln$<$#或cp-p
另一个想法是让gnumake生成两个模式规则。 基本上有两种方法可以做到这一点:

  • 将它们写入makefile(
    %-cc.mk
    或类似文件),您可以使用gnumake的
    include
    语句将它们包含在实际的makefile中
  • 使用GNU make的
    $(eval)
    $(call)
    函数内联生成和评估它们
与C/Unix开发工具链中的大多数其他技术一样,这些技术本质上是一种预处理形式,使它们易于理解,但代价是非常难以使用(大量的二次或三次转义,很难跟踪何时扩展的内容;调试可能是一种巨大的痛苦,至少在我的经验中是这样)


因此,为更复杂的用例保留它们(其中堆栈溢出列出了一些)。

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

DEPGEN=$(CPP) -MM $(CPPFLAGS) $<
%.d: %.cpp ; $(DEPGEN)
%.d: %.cc  ; $(DEPGEN)

如果您使用GNU自动工具,您可能会使用m4宏。这些选项似乎都不会导致生成更简洁的makefile。我可能会坚持原来的形式。谢谢你的建议。
$(foreach src,cpp cc,$(eval %.d: %.$(src) ; $$(CPP) -MM $$(CPPFLAGS) $$<))