2013-03-14 5 views
5

GCCで-MMフラグを使用してオブジェクトのメイクファイル依存関係を生成します。メークファイルは簡単に次のようになります。GCC makefile依存関係生成パス

-include autodep 
... 
$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 
    $(CC) -MM $(SOURCES) > autodep 

ソースは、フォルダsrcにあります。しかし、autodepファイルは、それらの相対的なパスなしでオブジェクトのターゲットが含まれています:

foo.o: src/foo.c src/foo.h 
bar.o: src/bar.c src/bar.h src/baz.h 

どのように私はこれにそれらを有効にする必要があります

src/foo.o: src/foo.c src/foo.h 
src/bar.o: src/bar.c src/bar.h src/baz.h 

フラグ-MTを使用しようとしましたが、オブジェクトのターゲットをすべて破棄しているようです。

答えて

6

-MTは、ターゲット名全体を設定します。あなたは、各ソースごとに異なるターゲットが必要な場合は、コンパイラとforeachループの複数の呼び出しを意味し、各ソースごとに異なる-MT引数、必要があります。

$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 
    rm autodep 
    $(foreach SRC,$(SOURCES),$(CC) -MM -MT $(SRC:.c=.o) $(SRC) >> autodep;) 

代わりに、あなたは出力をマッサージするのsedを使用することができます

$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 
    $(CC) -MM $(SOURCES) | sed 's|^|src/|' > autodep 

まだそれ自身の.dファイルに各ソースファイルの依存関係を入れて、あなたは、ソースファイルのコンパイル時に生成すること-MMDフラグを使用することで簡単:

-include $(SOURCES:.c=.d) 
CFLAGS += -MMD 

$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 
を0
+0

ありがとう!私は 'foreach'ループを使い、' autodep'の内容は今正しいものです。しかし実際には動作していないようです。質問の例を使って、 'src/bar.h'を変更して' make'を実行すると 'make:\' src/foo.o 'が最新のものになります。 –

+0

'all:'の後ろに '-include'を置いて解決しました。 –

関連する問題