私の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.
# ...
プロジェクトにさらにターゲットが追加された場合(そうでない場合)、開発者は少なくとも3つのことを更新する必要があります。
- 新しいターゲットのオブジェクトファイルのリスト
- すべてのオブジェクトファイルのリスト
- 他のターゲットと同じルールを使用している場合でも、新しいターゲットを作成するためのターゲット
このプロセスを簡素化する方法はありますか、それとも私はそれに固執していますか?
ワイルドカードルールを使用してみましたが、マクロで機能するようには見えません。
$(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.
これ以上の方法はありませんか?