Мой make-файл выглядит примерно так:
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.
# ...
Когда (не , если ) добавлено больше целей в проект, разработчику придется обновить как минимум три вещи:
- Список объектных файлов новой цели
- Список всех объектных файлов
- Цели для создания новой цели, даже если она использует те же правила, что идругие
Есть ли способ упростить этот процесс, или я застрял с ним?
Я пытался использовать правила подстановочных знаков, но похоже, что они не работают с макросами.
$(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.
Нет лучшего способа?