2016-08-08 15 views
1

私が作成したmakeファイルは、.dependによって生成されたヘッダファイルが変更された場合、自動検出の簡単な例を表します。gcc -MM -MFによって生成されます。なぜこのmakeファイルに前提条件 ".depend"を追加する必要はありませんか?

は、次のメイクファイルを考えてみましょう:私たちは、これが正常に動作し、私は理由を知りたいmain.cfactorial.h

CC=gcc 
CFLAGS=-c -Wall 
OBJECTS=main.o 
SRCS=main.c 
EXECUTABLE=program 

all: $(EXECUTABLE) 

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(OBJECTS) -o $(EXECUTABLE) 


.depend: $(SRCS) 
    rm -f ./.depend 
    $(CC) $(CFLAGS) -MM $^ -MF ./.depend; 


sinclude .depend 
#main.o: main.c factorial.h 

clean: 
    rm -rf *.o $(EXECUTABLE) .depend 

を持っています! 常識は、我々はファイル.dependがあることを確認したいので

$(EXECUTABLE): $(OBJECTS) .depend

を書くことです。しかし、省略してもうまく動作するようです。どうして?また、include(この場合はsinclude)が実際に何をしているのか知りたいです。私たちの例では、この例ではinclude .depend
main.o: main.c factorial.hに置き換えられますが、やはりワークフローは意味をなさないものです。どんな専門家?

答えて

1

メイクは自動的include directive

の目標をリメイクしようと[...]すべてのmakefileに読んだ後、makeがゴールターゲットとして、それぞれを検討し、それを更新しようとします。

sinclude .dependが作る伝えライン「それが失敗した場合は終了していない、.dependで読むすべての一致ルールを探し、それが古くなっていた場合.dependをリメイク。」コンパイルの副作用として依存関係を作成する必要がありますいずれにせよ

は、本当に

target := program 
sources := main.c 
objs := $(sources:.c=.o) 
deps := $(objs:.o=.d) 

CPPFLAGS := -MMD -MP 
CFLAGS := -Wall 

$(target): $(objs) 
    $(LINK.o) $^ $(LDLIBS) -o [email protected] 

clean: ; $(RM) $(target) $(objs) $(deps) 

-include $(deps) 
+0

ありがとう余分なステップは必要ありません。あなたがリメイクすると、includeディレクティブのターゲットは、 ".dependをインクルード"すると、 ".depend"という名前のターゲットを探し、その命令を実行することを意味しますか? – Thenewstockton

+0

@Thenewstockton正確には、ファイル自体をインクルードした後でのみ、makefileに自身をリメイクするためのルールを含めることができます。 makeが最初に呼び出されたときに '.depend'が存在しないので、明らかにこれはうまくいきません。 – user657267

関連する問題