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 $@

%.o: %.c
     gcc -c $^ -o $@

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 $@

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 $@

-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://blog.csdn.net/howellzhu
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章