簡體   English   中英

理解具有自動依賴性的Makefile:'sed'部分的問題

[英]Understanding a Makefile with automatic dependencies: Problems with 'sed' part

我已經按照本教程 它解釋了Makefile的制作,它負責依賴。 我制作了以下Makefile,它按照以下目錄結構工作:

folder--|Makefile
    |src----|(all .c and .h files here)
    |obj----|(all objects file are made here)
    |bin----|(target is made here)

Makefile是:

TARGET  =   exec

CC      =   gcc
CFLAGS  =   -g -I.
LINKER  =   gcc -o
LFLAGS  =   -I. -lm -lpthread

BINDIR  =   bin
OBJDIR  =   obj
SRCDIR  =   src
INTERFACE = interface
STD =   -std=c99

PROGRAMSOURCES  :=  $(wildcard $(SRCDIR)/*.c)
PROGRAMINTERFACE:=  $(wildcard $(INTERFACE)/*.h)
OBJECTS     :=  $(PROGRAMSOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)

$(BINDIR)/$(TARGET) :   $(OBJECTS)
    $(LINKER) $@ $(LFLAGS) $(OBJECTS) $(STD)

#pull the dependencies to the .o files
-include $(OBJECTS:.o=.d)

#the -o $@ says to put the output of the compilation in the file named on the left side of the :.
#the $< is the first item in the dependencies list. Basically the name of the .c file which is to be compiled.
$(OBJECTS)      :   $(OBJDIR)/%.o :$(SRCDIR)/%.c
    $(CC) $(CFLAGS) -c $< -o $@ $(STD)
    $(CC) $(CFLAGS) -MM $< > $*.d
    @mv -f $*.d $*.d.tmp             #changes file name
    @sed -e 's|.*:|$*.o:|' < $*.d.tmp > $*.d    #Unable to understand
    @sed -e 's/.*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | \
     sed -e 's/^ *//' -e 's/$$/:/' >> $*.d      #Unable to understand
    @rm -f $*.d.tmp

.PHONY  :   run
run     :
    ./$(BINDIR)/$(TARGET) ${TYPE} ${INP_FILE}

print:
    @echo $(OBJECTS)

我已經明白它正在嘗試預處理臨時文件以生成自動依賴。 我無法理解的是它是如何完成的。 以下是我想解釋的兩行:

@sed -e 's|.*:|$*.o:|' < $*.d.tmp > $*.d    #Unable to understand
@sed -e 's/.*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | \
 sed -e 's/^ *//' -e 's/$$/:/' >> $*.d      #Unable to understand

我之前從未使用過sed ,所以我遇到了問題。

任何幫助贊賞。

假設您正在從src/foo.c構建obj/foo.o ,因此文件foo.d.tmp包含:

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

現在第一個sed聲明:

@sed -e 's|.*:|$*.o:|' < $*.d.tmp > $*.d

“閱讀foo.d.tmp ,把所有東西都拿到冒號並改成'foo.o',並將結果寫入foo.d 所以現在foo.d包含:

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

(在這種情況下沒有變化。)現在下一個命令:

@sed -e 's/.*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $*.d

“讀取foo.d.tmp ,刪除所有內容(包括冒號),刪除尾隨\\如果有的話。取結果並將每個單詞(即每個先決條件)放在自己的行上。然后對於每一行,刪除前導空格,在末尾添加冒號,並將結果追加到foo.d 所以現在foo.d包含:

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

這個想法是為每個先決條件創建一個空規則,這樣如果代碼已經改變並且不再需要某個先決條件 - 並且不再存在 - 但它仍然列在舊的foo.d ,Make將不會因無法建造它而感到恐慌。

暫無
暫無

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

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