Linux之Makefile(變數高階用法)

2021-06-27 11:13:48 字數 2227 閱讀 5090

我們可以替換變數中的共有的部分,其格式是「$(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級別的檔案系統監控技術,是一種強大的 細粒度的 非同步的機制,它滿足各種各樣的檔案監控需要,不僅限於安全和效...