1

このようなものがmakefileで機能しない理由はありますか?

all : $(GOAL_DB) $(GOAL)

%.d: %.cpp      
    $(CC) $(CPPFLAGS_DB) $<  > $@
%.o : %.cpp
    $(CC) $(FLAGS_DB) $< -o $@

$(GOAL_DB) : $(OFILES)
        $(CC) $(LFLAGS_DB) -o $@ $^ $(LIBS_DB)
    strip $(GOAL_DB)
    rm -f *.o *.d

%.d: %.cpp     
    $(CC) $(CPPFLAGS) $<  > $@
%.o : %.cpp
    $(CC) $(FLAGS) $< -o $@
$(GOAL) : $(OFILES)
        $(CC) $(LFLAGS) -o $@ $^ $(LIBS)
    strip $(GOAL)
    rm -f *.o *.d

make all、GNUmakeを使用して2つの異なるターゲットを構築しようとしています。

最初のターゲットは正常にビルドされますが、別のターゲットの新しいオブジェクトファイルは作成されません。

4

1 に答える 1

3

makefileは、順次実行される標準プログラムとは異なります。新しいターゲットの前に表示される新しいルールがそのターゲットに適用されると想定しているようです。これはそうではありません。makefileは、ルールの適用を開始する前に、変数、ターゲット、依存関係などについて完全に評価されます。

Makeは、それらの$(OFILES)をそれらの%.d:ターゲットの1つだけと照合します。これは、おそらく最初に検出されたターゲットパターンです。

他のターゲットの新しいオブジェクトを取得しない理由は、同じファイルのセットを2回ビルドしているように見せるため、2番目のビルドはすでに完了しているため、スキップするためです。

解決策は、「ターゲット固有の変数」を使用することです。

all : $(GOAL_DB) $(GOAL)

$(GOAL): BUILD_FLAGS=$(FLAGS)
$(GOAL): BUILD_CPPFLAGS=$(CPPFLAGS)
$(GOAL): BUILD_OUTDIR=./outdir
$(GOAL): $(OFILES)

$(GOAL_DB): BUILD_FLAGS=$(FLAGS_DB)
$(GOAL_DB): BUILD_CPPFLAGS=$(CPPFLAGS_DB)
$(GOAL_DB): BUILD_OUTDIR=./outdir_db
$(GOAL_DB): $(OFILES)

%.d: %.cpp      
    mkdir -p $(BUILD_OUTDIR)
    $(CC) $(BUILD_CPPFLAGS) $<  > $(BUILD_OUTDIR)/$@

%.o : %.cpp
    mkdir -p $(BUILD_OUTDIR)
    $(CC) $(BUILD_FLAGS) $< -o $(BUILD_OUTDIR)/$@
于 2013-02-12T18:33:08.100 に答える