跟我學Makefile(三)

2022-07-16 09:06:13 字數 2564 閱讀 5922

緊接著跟我學makefile(二)繼續學習:變數高階用法

(1)變數值的替換 :替換變數中的共有的部分,其格式是「$(var:a=b)」或是「$」,把變數「var」中所有以「a」字串「結尾」的「a」替換成「b」字串。這裡的「結尾」意思是「空格」或是「結束符」。

foo :=a.o b.o c.o

bar := $(foo:.o=.c)

第二行:把「$(foo)」中所有以「.o」字串「結尾」全部替換成「.c」,所以我們的「$(bar)」的值就是「a.c b.c c.c」。

(2)把變數的值再當成變數

x =y

y =z

a := $($(x))

$(x)的值是「y」,所以$($(x))就是$(y),於是$(a)的值就是「z」。(注意,是「x=y」,而不是「x=$(y)」) 。

x =variable1

variable2 :=hello

y = $(subst 1,2

,$(x))

z =y

a := $($($(z)))

$(x)的值是「variable1」, subst 函式把「variable1」中的所有「1」字串替換成「2」字串,於是,「variable1」變成「variable2」,再取其值。

追加變數的值:「+=」操作符給變數追加值

objects =main.o foo.o bar.o utils.o

objects += another.o

如果變數之前沒有定義過,那麼,「+=」會自動變成「=」,如果前面有變數定義,那麼「+=」會繼承於前次操作的賦值符。如果前一次的是「:=」,那麼「+=」會以「:=」作為其賦值符。

當 make 巢狀呼叫時(參見前面的「巢狀呼叫」章節),上層 makefile 中定義的變數會以系統環境變數的方式傳遞到下層的 makefile 中。當然,預設情況下,只有通過命令列設定的變數會被傳遞。而定義在檔案中的變數,如果要向下層 makefile 傳遞,則需要使用

exprot 關鍵字來宣告。

條件判斷語句:

if-true>endif

if-true>

else

if-false>endif

其中表示條件關鍵字,如「ifeq」。

ifeq ($(strip $(foo)),)

if-empty>endif

這 個 示 例 中 使 用 了 「strip 」 函 數 , 如 果 這 個 函 數 的 返 回 值 是 空 (empty ), 那 麼就生效。

1關鍵字:「ifeq」:引數「arg1」和「arg2」的值是否相同,如果相同,則為真。 

ifeq(, )

ifeq ''

''ifeq ""

""ifeq ""

''ifeq ''

""

如果引數兩個引數相同就執行後續指令。

2關鍵字:ifneq,引數「arg1」和「arg2」的值是否相同,如果不同,則為真。 

ifneq (, )

ifneq ''

''ifneq ""

""ifneq ""

''ifneq ''

""

3關鍵字:ifdef

ifdef

變數的值非空,那到表示式為真。否則,表示式為假。當然,同樣可以是乙個函式的返回值。注意,ifdef只是測試乙個變數是否有值,其並不會把變數擴充套件到當前位置

在這一行上,多餘的空格是被允許的,但是不能以[tab]鍵做為開始(不然就被認為是命令)。而注釋符「#」同樣也是安全的。else」和「endif」也一樣,只要不是以[tab]鍵開始就行了

例子1:

bar =foo =$(bar)

ifdef foo

frobozz =yes

else

frobozz =no

endif

例子2:

foo =ifdef foo

frobozz =yes

else

frobozz =no

endif

結果:第乙個例子中,「$(frobozz)」值是「yes」,第二個則是「no」。

跟我學Makefile(七)

定義模式規則 使用模式規則來定義乙個隱含規則。乙個模式規則就好像乙個一般的規則,只是在規則中,目標的定義需要有 字元。的意思是表示乙個或多個任意字元。在依賴目標中同樣可以使用 只是依賴目標中的 的取值,取決於其目標。有一點需要注意的是,的展開發生在變數和函式的展開之後,變數和函式的展開發生在make...

跟我學Makefile(五)

檔名操作函式 每個函式的引數字串都會被當做乙個或是一系列的檔名來對待。dir 名稱 取目錄函式 dir。功能 從檔名序列 中取出目錄部分。目錄部分是指最後乙個反斜槓 之前的部分。如果沒有反斜槓,那麼返回 返回 返回檔名序列 的目錄部分。示例 dir src foo.c hacks 返回值是 src ...

跟我學XSL(三)

經過前幾日的學習,我們學習了xhtml文件的編寫和以及三個xsl元素,已能編寫相當靈活的xsl文件,今天將學習的是xsl模板的編寫。我們都知道,短的文件 程式十分好讀,但當規模增大後,其複雜性也以更快的速度增加。前面我們學了 xsl for each xsl value of 等,可以用它們對xml...