我們可以替換變數中的共有的部分,其格式是「$(var:a=b)」或是「$」,其意思是,把變數「var」中所有以「a」字串「結尾」的「a」替換成「b」字串。這裡的「結尾」意思是「空格」或是「結束符」。
還是看乙個示例吧:
foo := a.o b.o c.o
bar := $(foo:.o=.c)
這個示例中,我們先定義了乙個「$(foo)」變數,而第二行的意思是把「$(foo)」中所有以「.o」字串「結尾」全部替換成「.c」,所以我們的「$(bar)」的值就是「a.c b.c c.c」。
另外一種變數替換的技術是以「靜態模式」(參見前面章節)定義的,如:
foo := a.o b.o c.o
bar := $(foo:%.o=%.c)
這依賴於被替換字串中的有相同的模式,模式中必須包含乙個「%」字元,這個例子同樣讓$(bar)變數的值為「a.c b.c c.c」。
第二種高階用法是——「把變數的值再當成變數」。先看乙個例子:
x = y
y = z
a := $($(x))
在這個例子中,$(x)的值是「y」,所以$($(x))就是$(y),於是$(a)的值就是「z」。(注意,是「x=y」,而不是「x=$(y)」)
我們還可以使用更多的層次:
x = y
y = z
z = u
a := $($($(x)))
這裡的$(a)的值是「u」,相關的推導留給讀者自己去做吧。
讓我們再複雜一點,使用上「在變數定義中使用變數」的第乙個方式,來看乙個例子:
x = $(y)
y = z
z = hello
a := $($(x))
這裡的$($(x))被替換成了$($(y)),因為$(y)值是「z」,所以,最終結果是:a:=$(z),也就是「hello」。
再複雜一點,我們再加上函式:
x = variable1
variable2 := hello
y = $(subst 1,2,$(x))
z = y
a := $($($(z)))
這個例子中,「$($($(z)))」擴充套件為「$($(y))」,而其再次被擴充套件為「$($(subst 1,2,$(x)))」。$(x)的值是「variable1」,subst函式把「variable1」中的所有「1」字串替換成「2」字串,於是,「variable1」變成「variable2」,再取其值,所以,最終,$(a)的值就是$(variable2)的值——「hello」。(喔,好不容易)
在這種方式中,或要可以使用多個變數來組成乙個變數的名字,然後再取其值:
first_second = hello
a = first
b = second
all = $($a_$b)
這裡的「$a_$b」組成了「first_second」,於是,$(all)的值就是「hello」。
再來看看結合第一種技術的例子:
a_objects := a.o b.o c.o
1_objects := 1.o 2.o 3.o
sources := $($(a1)_objects:.o=.c)
這個例子中,如果$(a1)的值是「a」的話,那麼,$(sources)的值就是「a.c b.c c.c」;如果$(a1)的值是「1」,那麼$(sources)的值是「1.c 2.c 3.c」。
再來看乙個這種技術和「函式」與「條件語句」一同使用的例子:
ifdef do_sort
func := sort
else
func := strip
endif
bar := a d b g q c
foo := $($(func) $(bar))
這個示例中,如果定義了「do_sort」,那麼:foo := $(sort a d b g q c),於是$(foo)的值就是「a b c d g q」,而如果沒有定義「do_sort」,那麼:foo := $(sort a d b g q c),呼叫的就是strip函式。
當然,「把變數的值再當成變數」這種技術,同樣可以用在操作符的左邊:
dir = foo
$(dir)_sources := $(wildcard $(dir)/*.c)
define $(dir)_print
lpr $($(dir)_sources)
endef
這個例子中定義了三個變數:「dir」,「foo_sources」和「foo_print」。
Linux之Makefile(自動化變數)
表示規則中的目標檔案集。在模式規則中,如果有多個目標,那麼,就是匹配於目標中模式定義的集合。僅當目標是函式庫檔案中,表示規則中的目標成員名。例如,如果乙個目標是 foo.a bar.o 那麼,就是 bar.o 就是 foo.a 如果目標不是函式庫檔案 unix下是 a windows下是 lib 那...
Linux之Makefile(併發執行命令)
gnu make 支援同時執行多條命令。通常情況下,同一時刻只有乙個命令在執行,下乙個命令只有在當前命令執行完成之後才能夠開始執行。不過可以通過 make的命令 行選項 j 或者 job 來告訴 make 在同一時刻可以允許多條命令同時被執行 注 意,在 ms dos中此選項無效,因為它是單任務作業...
Linux之了解inotify監聽檔案變化機制
在日常的運維過程中,經常需要備份某些檔案,或者對系統的某些檔案進行監控,比如重要的配置檔案等。如果需要作到實時同步或者監控,就需要使用核心的inotify機制 inotify 是基於inode級別的檔案系統監控技術,是一種強大的 細粒度的 非同步的機制,它滿足各種各樣的檔案監控需要,不僅限於安全和效...