分類:
Makefile中使用$$的使用 在makefile中,會經常使用shell命令,也經常見到$var 和 $$var的情況,有什么區別呢,區別大了。不要認為在makefile的規則的命令行中使用$var就是將makefile的變量和shell共享了,這里僅僅是讀取makefile的變量然后擴展開,將其值作為參數傳給了一個shell命令。而$$var是在訪問一個shell命令內定義的變量,而非makefile的變量。此外,如果某規則有n個shell命令行構成,而相互之間沒有用';'和'/'連接起來的話,就是相互之間沒有關聯的shell命令,相互之間也不能變量共享。看如下例子:makefile代碼段1:VAR=3 target: PRerequsite1 prerequsite2 echo $VAR (1) VAR=4 (2) echo $VAR (3) echo $$VAR (4) 在代碼段1中,(1)的結果是3,顯然makefile利用自己的變量將$VAR擴展成3之后傳遞給這個echo這個shell命令。 (2)中,是一個獨立的shell命令自己第一了一個shell變量,名字也叫VAR,且其值為4,不會影響到makefile中的VAR。 (3)中,同(1),makefile中的變量VAR的值依然是3 (4)makefile將$$VAR先執行一次擴展得到如下shell命令: echo $VAR然后交給shell去解釋執行,可是對于這個shell命令來說VAR是一個為定義的變量,因此輸出的結果就是個空行。makefile代碼段2:VAR=3 target: prerequsite1 prerequsite2 echo $VAR;/ (1') VAR=4;/ (2') echo $VAR;/ (3') echo $$VAR (4') 在代碼段2中,所有的shell命令都被連接起來了,那么執行的結果就有變化了: (1')結果同(1),$VAR被替換成了3 (2')結果同(2) (3')輸出3,因為雖然shell中有VAR變量,可是makefile先要進行擴展,擴展的結果就是echo 3。 (4')輸出4,因為makefile擴展結果為echo $VAR,而shell中已經有了變量VAR,且其值為4. 類似的例子還有如下: makefile代碼片斷3: SUBDIRS=tools examples src target: prerequsite1 prerequsite2 for dir in $SUBDIRS; do $(MAKE) -C $$dir;done make首先將這個命令擴展成: for dir in tools examples src; do make -C $dir; done 然后交給shell解釋執行,可見dir就是一個shell中的變量。 總之,在makefile的shell命令中,黨要引用shell變量的時候,要使用$$VAR格式。 此外注意一點,在makefile中,$$還被用來做SECONDEXPANSION,即二次擴展,一般是作為prerequsites. 如: .SECONDEXPANSION (要使用這個feature就的加上這一行) main_objs := main.o try.o test.o lib_objs := lib.o api.o main lib: $$($$@_objs) $$($$@_objs)第一階段的擴展結果為$($@_objs),第2階段的擴展結果為:$@被替換為main lib,與_objs連接成main_objs lib_objs。加上外面$的擴展,就是$main_objs $lib_objs,最終結果為main.o try.o test.o lib.o api.o新聞熱點
疑難解答