我的 makefile 看起来像这样:
FOO_OBJECT_FILES := $(OBJDIR)/Foo.cpp.o
BAR_OBJECT_FILES := $(OBJDIR)/Bar.cpp.o $(OBJDIR)Bar.c.o
ALL_OBJECT_FILES := $(FOO_OBJECT_FILES) $(BAR_OBJECT_FILES)
$(BINDIR)/Foo.a: $(FOO_OBJECT_FILES)
# Rules for making a static library out of Foo's object files go here.
$(BINDIR)/Bar.a: $(BAR_OBJECT_FILES)
# This uses the exact same command sequence as the previous rule.
$(BINDIR)/All.a: $(ALL_OBJECT_FILES)
# Ditto.
# ...
当(不是if)更多目标被添加到项目中时,开发人员将必须更新至少三件事:
- 新目标的目标文件列表
- 所有目标文件的列表
- 用于制作新目标的目标,即使它使用与其他目标相同的规则
有没有办法简化这个过程,还是我坚持下去?
我尝试使用通配符规则,但看起来它们不适用于宏。
$(BINDIR)/%.a: $(%_OBJECT_FILES)
# ...
您可以将目标文件列表视为规则,但最终目标规则无法直接访问它们。
OBJECT_FILES_Foo: $(OBJDIR)/Foo.cpp.o
OBJECT_FILES_Bar: $(OBJDIR)/Bar.cpp.o $(OBJDIR)Bar.c.o
OBJECT_FILES_All: FOO_OBJECT_FILES BAR_OBJECT_FILES
$(BINDIR)/%.a: OBJECT_FILES_%
# This rule can't see into the object file lists to use them to build.
没有更好的办法吗?