Makefile 自动产生依赖
代碼如下:
makefile 代碼:?
其實(shí)這里主要是為每個C文件建立一個同名的后綴為.d。該文件的作用是使用gcc的-M屬性來自動生成.o文件的頭文件依賴關(guān)系。
?
第1,2,4都好理解。
第2行解釋: 使用gcc -M 的屬性將? $<(第1行的第一個依賴文件,就是%.c。 查看靜態(tài)模式)的C文件的依賴關(guān)系輸出到一個臨時文件。? 這里有點(diǎn)疑惑。? 書里面說?? .$$$$是當(dāng)前進(jìn)程好。?? 然到Makefile這個腳本將$$$$當(dāng)成進(jìn)程號了。姑且這么認(rèn)為吧。
第4行解釋:將第2行產(chǎn)生的臨時文件刪除。
?
?
對于第3行, 我知道sed的s命令是一個替換命令。但是里面的用到了太多高深的匹配規(guī)則了。? sed命令果真如傳聞中的那么強(qiáng)大,對于現(xiàn)在的我來說還真的很陌生。不管咋樣, 要把它解決。
?
首先,我們先要知道sed是什么概念。
sed是一個非交互式的流編輯器。所謂非交互式,是指使用sed只能在命令行下輸入編輯命令來編輯文本,然后在屏幕上查看輸出;而流編輯器是指sed每次只從文件(或輸入)讀入一行,然后對該行進(jìn)行指定的處理,并將結(jié)果輸出到屏幕,接著讀入下一行。
?
為了簡化的闡述,下面將靜態(tài)模式用一個特例代替---main.c 。 通過第2行,針對main.c編譯器生成了如下的依賴關(guān)系:
main.o:main.c defs.h
?
而通過第三行將會被替換成main.o:main.d:main.c defs.h, 并且把這個依賴關(guān)系輸出到文件main.d中。
?
OK,大致知道了它的意思,接下在,就細(xì)細(xì)的分析第三行命令的整個執(zhí)行過程,如下:
1:將($@.$$$$)的臨時文件中的字符串信息(main.o:main.c defs.h)通過 “<” 輸送到sed命令中.
2:sed中的s符號告訴sed命令,這次要做一個替換的任務(wù)。s符號的格式為:[address[,address]] s/pattern-to-find/replacement-pattern/[g p w n]。?? 下面來匹配上面的示例:
??? [address[,address]]:是指要處理的行的范圍,在這次的操作中采用的是默認(rèn)值。
??? pattern-to-find等價于\($*\)\.o[ :]*
??? replacement-pattern等價于\1.o $@ :
3:Makefile使用%=main進(jìn)行替換后,命令變成了sed 's,\(main\)\.o[ :]*,\1.o main.d : ,g' < main.pid > main.d ;
????? 接下來就比較好分析了,主要是正則表達(dá)式的知識了。?? pattern-to-find使用到了4個正則表示式的知識點(diǎn)。
? ? ? ?第一: \(main\)為創(chuàng)建一個字符標(biāo)簽,即正則表達(dá)式中的“分組模式”,給后面的replacement-pattern使用。如\1.o 正則表達(dá)式“后向引用”,展開后就是main.o
? ? ? ?第二: \. 在正則表達(dá)式中‘.’作用是匹配一個字符。所以需要使用轉(zhuǎn)義元字符‘\’來轉(zhuǎn)義。
? ? ? ?第三: [ :] 匹配一組字符里的任意字符 。
? ? ? ?第四: *匹配0個或多個前一字符
4 : 通過sed的正則表達(dá)式,輸入的main.o:main.c defs.h被替換成了main.o main.d : main.c defs.h。
?
這里還有個有趣的東西,平時我們對命令s符號使用‘/’作為參數(shù)分割符,其實(shí)‘/’只是一種默認(rèn)的習(xí)慣罷了。你也可以使用','來作為分割符號,只要前后統(tǒng)一就OK。這里就是使用了','來作為分割符。
?
以上是個人的理解, 在一個復(fù)習(xí)了一下正則表達(dá)式與sed。
總結(jié)
以上是生活随笔為你收集整理的Makefile 自动产生依赖的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入理解JavaScript系列(3):
- 下一篇: LintCode_173 链表插入排序