2016-07-14 9 views
1

依存ファイルを作成するためのルールを含むMakefileを使用しています。コンパイラはGCCです。Makefileに依存ファイルを作成する

%.d: %.c 
    mkdir -p $(@D) 
    $(CC) $(CFLAGS) $(CPPFLAGS) -M $< | \ 
    sed 's,\($(notdir $*)\.o\) *:,$(dir [email protected])\1 [email protected]: ,' > [email protected] 
    mv [email protected] [email protected] 

私はMakefileの技術ではかなり新しいので、いくつかのオプションが混在するこのルールを理解するのは少し難解です。
誰かがこのルールの仕組みを簡単に説明できますか? ありがとうございます。

答えて

2

%.d: %.c

.dで終わるすべてのファイルは、限り同じディレクトリと.cファイルがあるとして、このルールを使用して作られた、現在のディレクトリまたはのvpathの1に相対幹ことができます。

mkdir -p $(@D)

現在のターゲットのディレクトリ部分に展開された自動メイク可変である、$(@D)ために一番上の、すべての中間ディレクトリを作成します。

$(CC) $(CFLAGS) $(CPPFLAGS) -M $< | \

最初の前提条件(whatever.c)上のCコンパイラを起動し、出力を標準出力へのmake依存関係のリストを、それを伝えます。パイプ

sed 's,\($(notdir $*)\.o\) *:,$(dir [email protected])\1 [email protected]: ,' > [email protected]

にこの出力はsedの。出力のルールはソースファイルと同じパスになりますが、このルールを書いた人はオブジェクトファイルを別のディレクトリに入れたいので、sedを使ってパスを置き換える必要があります。

Sedは、に一致する.oで終わるターゲットのルールをキャプチャします。 $*は、現在のルールで%と一致するパターンに展開される別の自動変数です。notdirはディレクトリ部分を削除し、拡張子のないファイル名の幹を残します。

Sedは、先に見た$(@D)と同じものであるオブジェクトファイルターゲットの先頭に$(dir [email protected])を追加し、同じ前提条件のターゲットとして依存ファイル自体([email protected])を追加します。この出力は、現在のターゲットの名前+ .tmpのファイルにリダイレクトされます。ルールの真のターゲットに、以前のファイルを移動し

mv [email protected] [email protected]


サイドノート:

sources := src/somefile1.c src/somefile2.c 
objects := $(sources:src/%.c=obj/%.o) 
deps := $(objects:.o=.d) 

CFLAGS := -MMD -MP 

.PHONY: all 
all $(objects) 

$(objects): obj/%.o: src/%.c 
    $(COMPILE.c) $(OUTPUT_OPTION) $< 

-include $(deps) 
:あなたは、これらのレシピが古いオブジェクトファイルと同じディレクトリに生成された依存関係ファイルを気にしないならば、あなたのようなものと同じことを達成することができます
+0

優れています。ありがとうございます! – Gaston

関連する問題