天天看點

makefile檔案中dash include的含義

Make mk makefile -include dash include dependence

今天有位同學拿着一個Android中的makefile檔案問我,"-include"是什麼意思?為什麼要加個減号? 歡迎轉載,但是請注明原出處:http://blog.csdn.net/howellzhu 我相信對經常配置開源工程進行autoconf的人一定非常熟悉,但是對于普通的Android開發工程師就不一定了解了。 在這裡我簡單說一下:

-include: 表示include的目标如果存在就包含進來,如果不存在就算了(不要報錯)。

這位同學非常富有探索精神,拿到了答案并沒有滿意,非常不高興的繼續問:啥時候會有這種需求?

好吧,我們從一個簡單的例子來看看-include的實際應用場景。 歡迎轉載,但是請注明原出處:http://blog.csdn.net/howellzhu 一般來說,如果比較簡單的依賴關系,可以手工進行維護。比如一個工程中有兩個源檔案:foo.c和bar.c。兩個頭檔案foo.h和bar.h,編譯成為一個程式prog。 我們的Make檔案一般這麼寫:

OBJS := foo.o bar.o

prog: $(OBJS)
     gcc $^ -o [email protected]

%.o: %.c
     gcc -c $^ -o [email protected]

clean:
     rm -f prog $(OBJS)
           

但是這裡有一個問題,依賴關系靠手工維護,并且隻維護到foo.o依賴于foo.c,bar.o依賴于bar.c。 為了簡化手工維護的工作,我們可以考慮用gcc -MM指令來幫我們維護依賴關系,加入foo.c中include了foo.h。那麼如下的指令 gcc -MM -c foo.c 将輸出如下的内容: foo.o: foo.c foo.h 這就是我們希望得到的依賴關系。我們在Makfile中進行-MM的處理并将該輸出行儲存到一個.d檔案,然後在Makefile檔案中将其include進來就ok了。

OBJS := foo.o bar.o

prog: $(OBJS)
     gcc $^ -o [email protected]

include foo.d

%.o: %.c
     gcc -c $*.c -o $*.o
     gcc -MM -c $*.c > $*.d

clean:
     rm -f prog $(OBJS) *.d
           

但是這裡有個問題,如果從來沒有編譯過,或者make clean以後,再build就會出錯,因為找不到foo.d。 這樣用-include就能實作,如果有就include,如果沒有就不要include。

這樣會不會有問題?仔細想想不會,因為如果沒有.d的時候就沒有.o,沒有.o就會發起重新編譯,是以不會因為dependency不對而導緻問題。

OBJS := foo.o bar.o

prog: $(OBJS)
     gcc $^ -o [email protected]

-include $(OBJS:.o=.d)

%.o: %.c
     gcc -c $*.c -o $*.o
     gcc -MM -c $*.c > $*.d

clean:
     rm -f prog $(OBJS) *.d
           

這裡使用了一個技巧(OBJS:.o=.d),即對OBJS中的所有變量,将.o替換成為.d。這樣避免手工編寫.d檔案目标清單。

-include和Android中 $(call inherit-product-if-exists, xxx) 這樣的文法作用很像。

為了便于喜歡研究的同學深究,我特意上傳makefile的寶典pdf檔案供大家下載下傳: http://download.csdn.net/detail/howellzhu/8392153

歡迎轉載,但是請注明原出處:http://blog.csdn.net/howellzhu