Makefile中的變數

2021-08-26 13:52:29 字數 2519 閱讀 5037

makefile中的變數

2023年03月25日

[b]makefile[/b][b]中的變數[/b]

[b][/b]

[b][/b]

[b]在makefile中,變數就是乙個名字(像是c語言中的巨集),代表乙個文字字串(變數的值)。在makefile的目標、依賴、命令中引用乙個變數的地方,變數會被它的值所取代(與c語言中巨集引用的方式相同,因此其他版本的make也把變數稱之為[/b][b]「[/b][b]巨集[/b][b]」[/b][b])。[/b]

[b][/b]

[b]當我們定義了乙個變數之後,就可以在makefile的很多地方使用這個變數。變數的引用方式是:使用[/b][b]「[/b][b]$[/b][b](variable_name)[/b][b]」[/b][b]或者[/b][b]「[/b][b]$[/b][b]」[/b][b]來引用乙個變數的定義。[/b]

[b][/b]

[b]美元符號[/b][b]「[/b][b]$[/b][b]」[/b][b]在makefile中有特殊的含義,所有在命令或者檔名中使用[/b][b]「[/b][b]$[/b][b]」[/b][b]時需要用兩個美元符號[/b][b]「[/b][b]$$[/b][b]」[/b][b]來表示。[/b]

[b][/b]

[b]對乙個變數的引用可以在makefile的任何上下文中,目標、依賴、命令、絕大多數指示符和新變數的賦值中。[/b]

[b][/b]

[b]變數引用的展開過程是嚴格的文字替換過程,就是說變數值的字串被精確的展開在此變數被引用的地方。[/b]

[b][/b]

[b]makefile[/b][b]中在對一些簡單變數的應用,我們也可以不使用[/b][b]「[/b][b]()[/b][b]」[/b][b]和[/b][b]「[/b][b]{}[/b][b]」[/b][b]來標記變數名,而直接使用[/b][b]「[/b][b]$x[/b][b]」[/b][b]的格式來實現,此種用法僅限於變數名為單字元的情況。另外自動化變數也使用這種格式。[/b]

[b]兩種變[/b][b]量定[/b][b]義[/b][b]([/b][b]賦值[/b][b]) [/b]

[b]變數的這兩種不同的風格的區別在於:1. 定義方式;2. 展開時機。[/b]

[b]一 遞迴展開式變數 [/b]

[b]這一型別的變數的定義是通過[/b][b]「[/b][b]=[/b][b]」[/b][b]或者使用指示符[/b][b]「[/b][b]define[/b][b]」[/b][b]定義的變數。[/b]

[b][/b]

[b]這種變數的引用,在引用的地方是嚴格的文字替換過程,此變數值的字串原模原樣的出現在引用它的地方。[/b]

[b][/b]

[b]如果此變數定義中存在對其他變數的引用,這些被引用的變數會在它被展開的同時被展開。就是說在變數定義時,變數值中對其他變數的引用不會被替換展開,而是,變數在引用它的地方進行替換展開的同時,它所引用的其它變數才會被替換展開。[/b]

[b]看乙個例子: [/b]

[b]foo = $(bar) [/b]

[b]bar = $(ugh) [/b]

[b]ugh = huh? [/b]

[b]all:;echo $(foo) [/b]

[b]執行[/b][b]「[/b][b]make[/b][b]」[/b][b]將會列印出[/b][b]「[/b][b]huh?[/b][b]」[/b][b]。整個變數的替換過程時這樣的:首先[/b][b]「[/b][b]$(foo)[/b][b]」[/b][b]被替換為[/b][b]「[/b][b]$(bar)[/b][b]」[/b][b],接下來[/b][b]「[/b][b]$(bar)[/b][b]」[/b][b]被替換為[/b][b]「[/b][b]$(ugh)[/b][b]」[/b][b],最後[/b][b]「[/b][b]$(ugh)[/b][b]」[/b][b]被替換為[/b][b]「[/b][b]hug?[/b][b]」[/b][b]。整個替換的過程是在執行[/b][b]「[/b][b]echo $(foo)[/b][b]」[/b][b]是進行的。[/b]

[b]其優點是: 這種型別變數的定義時,可以引用其它的之前沒有定義的變數(可能在後續部分定義,或者是通過make的命令列選項傳遞的變數)。看乙個這樣的例子: [/b]

[b]cflags = $(include_dirs) -o [/b]

[b]include_dirs = -ifoo -ibar [/b]

[b]「[/b][b]cflags[/b][b]」[/b][b]會在命令中被展開為[/b][b]「[/b][b]-ifoo -ibar -o[/b][b]」[/b][b]。我們可以看到在[/b][b]「[/b][b]cflags[/b][b]」[/b][b]定義中使用到了之後定義的變數[/b][b]「[/b][b]include_dirs[/b][b]」[/b][b]。[/b]

[b][/b]

[b]其缺點是: [/b]

[b](1). [/b][b]使用此風格的變數定義,可能會由於出現變數的遞迴定義而導致make陷入到無限的變數展開過程中,最終使make執行失敗。[/b]

[b]cflags = $(cflags) [/b][b][/b]

Makefile中變數的使用

表示所有的目標檔案。表示規則中的目標成員名。例如,如果乙個目標是 foo.a bar.o 那麼,就是 foo.a 如果目標不是函式庫檔案 unix下是 a windows下是 lib 其值為空。依賴目標 中的第一 個目標名 字。如果 依賴目標 是以模式 即 將是符合模式的一系列的檔案集。注意,其是乙...

makefile中的變數賦值

在makefile中賦值方式有 和 a a b b b all echo a 執行結果 echo a b a b 這種賦值方式是沒有先後順序的,但是這種賦值方式可能會出現問題,例如遞迴定義時 a a a a b b b all echo a 執行結果 echo a a 這種賦值方式有先後順序,只能使...

Makefile中的變數和shell變數

我們在寫makefile時 多多少少會用到shell指令碼,對於變數的在shell中的使用有一些要注意的細節。讓我們從乙個簡單的makefile來看看。注意makefile中一定要有乙個目標,且一定要有乙個終極目標,若想要有多個目標應該設立乙個偽目標。如下 all hello hello2 hell...