簡體   English   中英

在Makefile中創建依賴文件

[英]Create dependency files in Makefile

我正在使用包含規則的Makefile來創建依賴文件。 編譯器是GCC。

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

我在Makefile技術方面還很陌生,我發現很難理解由多個選項組成的規則。
有人可以簡單解釋一下該規則如何運作嗎? 提前致謝。

%.d: %.c

只要存在一個.c文件,且該文件的目錄和主目錄相對於當前目錄或vpath之一,則可以使用此規則來創建所有以.d結尾的文件。

mkdir -p $(@D)

$(@D)創建最頂層和所有中間目錄,這是一個自動的make變量,它會擴展到當前目標的目錄部分。

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

在第一個前提條件( whatever.c )上調用C編譯器,並告訴其將make依賴項列表輸出到標准輸出。 將此輸出通過管道傳輸到

sed 's,\\($(notdir $*)\\.o\\) *:,$(dir $@)\\1 $@: ,' > $@.tmp

SED。 輸出中的規則將與源文件具有相同的路徑,但是編寫此規則的人都希望對象文件位於不同的目錄中,因此我們需要使用sed來替換路徑。

Sed捕獲目標以.o結尾且與$(notdir $*)匹配的任何規則。 $*是另一個自動變量,它會擴展為與當前規則中的%匹配的模式, notdir會刪除所有目錄部分,因此您將留下沒有擴展名的文件notdir干。

然后,Sed將$(dir $@)附加到目標文件目標中,這與我們在上面看到的$(@D)相同,並添加依賴文件本身( $@ )作為相同先決條件的目標。 此輸出將重定向到名稱為當前目標+ .tmp

mv $@.tmp $@

將上一個文件移動到規則的實際目標。


旁注:如果您不介意在與目標文件相同的目錄中生成依賴文件,則這些配方已過時,您可以使用以下方法實現相同的目的:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM