[英]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.