Linux 環境下的程序員若是不會使用GNU make來構建和管理本身的工程,應該不能算是一個合格的專業程序員,至少不能稱得上是 Unix程序員。今天咱們來學習下makefile的經常使用函數。html
《GNU make》http://www.gnu.org/software/make/manual/make.html#Call-Function程序員
abspath 函數被用於將 names列表 中的各路徑名轉換成絕對路徑,並將轉換後的結果返回。 其形式是:ubuntu
$(abspath names…)
示例:函數
.PHONY: all ROOT := $(abspath /usr/../lib /etc/init.d/../) all: @echo $(ROOT)
執行結果學習
$ make /lib /etc
addprefix 函數被用於給名字列表 names 中的每個name增長前綴prefix, 並將增長了前綴的名字列表返回。 其形式是:spa
$(addprefix prefix,names…)
示例:code
.PHONY: all without_dir = foo.c bar.c main.o with_dir := $(addprefix src/, $(without_dir)) all: @echo $(with_dir)
執行結果htm
$ make -f makefile-addprefix src/foo.c src/bar.c src/main.o
addsuffix 函數被用於給名字列表 names... 中的每個名字增長後綴 suffix, 並將增長了後綴suffix的名字列表返回。 其形式是:ip
$(addsuffix suffix,names…)
示例:字符串
.PHONY: all without_suffix = foo bar main with_suffix = $(addsuffix .c, $(without_suffix)) all: @echo $(with_suffix)
執行結果
$ make foo.c bar.c main.c
call 函數用來構造新的帶參函數,其語法相似於C語言的 printf 函數。 其形式是:
$(call variable,param,param,…)
示例:
.PHONY: all reverse = $(2)$(1) foo = $(call reverse, a, b) all: @echo $(foo)
執行結果
$ make b a
函數 "value" 提供了一種在不對變量進行展開的狀況下獲取變量值的方法 其形式是:
$(value variable)
示例:
.PHONY: all P = bar foo = $PATH # $P 會被展開爲bar all: @echo $(foo) @echo $(value foo)
執行結果
$ make barATH /home/jerry/bin:/home/jerry/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/go/bin
eval 函數的存在使得 Makefile 具備動態語言的特性。eval 函數使得 make 將再一次解析 text 語句。eval 函數的返回值爲空字符串。 其形式是:
$(eval text)
示例:
pointer := pointer_value define foo arg := $1 $$($1) := oooo endef before: $(info $(call foo,pointer)) @echo arg = $(arg) pointer_value = $(pointer_value) end: $(eval $(call foo,pointer)) @echo arg = $(arg) pointer_value = $(pointer_value)
執行結果
$ make before -f makefile-eval arg := pointer $(pointer) := oooo arg = pointer_value = $ make end -f makefile-eval arg = pointer pointer_value = oooo jerry@ubuntu:~/makefile/file/demo4$
因爲在before中,函數foo並未執行,因此變量 arg 和 pointer_value 未被定義過,所以其值爲空。
filter 函數返回 text 中匹配任意一條 pattern 規則的單詞 其形式是:
$(filter pattern…,text)
示例:
.PHONY: all src = foo.c foo.h bar.c bar.h baz.s src := $(filter %.c %.s, $(src)) all: @echo $(src)
執行結果
$ make foo.c bar.c baz.s
filter-out 函數返回 text中被 pattern 過濾後剩下的單詞 其形式是:
$(filter-out pattern…,text)
示例:
.PHONY: all src = foo.c foo.h bar.c bar.h baz.s src := $(filter-out %.c %.s, $(src)) all: @echo $(src)
執行結果
$ make foo.h bar.h
notdir 函數被用來從路徑 names... 中抽取文件名並返回。 其形式是:
$(notdir names...)
示例:
.PHONY: all file_name := $(notdir code/foo/src/foo.c code/bar/src/bar.c baz.s) all: @echo $(file_name)
執行結果
$ make foo.c bar.c baz.s
patsubst 函數被用來將名字 text 中符合 pattern 模式的名字替換爲 replacement,並將替換後的名字列表返回。 其形式是:
$(patsubst pattern,replacement,text)
示例:
.PHONY: all src = foo.c bar.c baz.c obj = $(patsubst %.c, %.o, $(src)) all: @echo $(obj)
執行結果
$ make foo.o bar.o baz.o
realpath函數被用於獲取 names... 所對應的真實路徑名。 其形式是:
$(realpath names…)
示例:
.PHONY: all ROOT := $(realpath ./.. ./../..) all: @echo $(ROOT)
執行結果
make /home/jerry/makefile/file /home/jerry/makefile
strip 去掉string中的多餘空格並返回 其形式是:
$(strip string)
示例:
.PHONY: all string = 12 3 4 5 str_strip = $(strip $(string)) all: @echo $(str_strip)
執行結果
$ make 12 3 4 5
其形式是:
$(wildcard pattern)
示例:
.PHONY: all SRC = $(wildcard *.c) all: @echo $(SRC)
執行結果
$ ls foo.c foo.h bar.c bar.h $ make foo.c bar.c