Makefile 避免重复GNU制定规则
我一直在编写一个Makefile来执行一些依赖项生成,我发现自己必须复制规则,因为(遗留)代码库包含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$(
.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(
或类似文件),您可以使用gnumake的%-cc.mk
语句将它们包含在实际的makefile中include
- 使用GNU make的
和$(eval)
函数内联生成和评估它们$(call)
因此,为更复杂的用例保留它们(其中堆栈溢出列出了一些)。第一个选项,使用变量定义规则体一次,并根据需要重用它:
DEPGEN=$(CPP) -MM $(CPPFLAGS) $<
%.d: %.cpp ; $(DEPGEN)
%.d: %.cc ; $(DEPGEN)
如果您使用GNU自动工具,您可能会使用m4宏。这些选项似乎都不会导致生成更简洁的makefile。我可能会坚持原来的形式。谢谢你的建议。
$(foreach src,cpp cc,$(eval %.d: %.$(src) ; $$(CPP) -MM $$(CPPFLAGS) $$<))