緊接著跟我學makefile(二)繼續學習:變數高階用法
(1)變數值的替換 :替換變數中的共有的部分,其格式是「$(var:a=b)」或是「$」,把變數「var」中所有以「a」字串「結尾」的「a」替換成「b」字串。這裡的「結尾」意思是「空格」或是「結束符」。
foo :=a.o b.o c.obar := $(foo:.o=.c)
第二行:把「$(foo)」中所有以「.o」字串「結尾」全部替換成「.c」,所以我們的「$(bar)」的值就是「a.c b.c c.c」。
(2)把變數的值再當成變數
x =yy =z
a := $($(x))
$(x)的值是「y」,所以$($(x))就是$(y),於是$(a)的值就是「z」。(注意,是「x=y」,而不是「x=$(y)」) 。
x =variable1variable2 :=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.oobjects += 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 foofrobozz =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...