makefile 經常使用函數

Linux 環境下的程序員若是不會使用GNU make來構建和管理本身的工程,應該不能算是一個合格的專業程序員,至少不能稱得上是 Unix程序員。今天咱們來學習下makefile的經常使用函數。html

《GNU make》http://www.gnu.org/software/make/manual/make.html#Call-Function程序員

1. 絕對路徑 abspath 函數

abspath 函數被用於將 names列表 中的各路徑名轉換成絕對路徑,並將轉換後的結果返回。 其形式是:ubuntu

$(abspath names…)

示例:函數

.PHONY: all

ROOT := $(abspath /usr/../lib /etc/init.d/../)

all: 
	@echo $(ROOT)

執行結果學習

$ make
/lib /etc

2. 增長前綴 addprefix 函數

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

3. 增長後綴 addsuffix 函數

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

4. 建立定製化參數函數 call 函數

call 函數用來構造新的帶參函數,其語法相似於C語言的 printf 函數。 其形式是:

$(call variable,param,param,…)

示例:

.PHONY: all

reverse = $(2)$(1)
foo = $(call reverse, a, b)

all:
	@echo $(foo)

執行結果

$ make
b a

5. 非展開取值 value 函數

函數 "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

6. eval 函數

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 未被定義過,所以其值爲空。

7. 過濾 filter 函數

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

8. 過濾後 filter-out 函數

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

9. 去路徑 notdir 函數

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

10. 匹配替換 patsubst 函數

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

11. 真實路徑 realpath 函數

realpath函數被用於獲取 names... 所對應的真實路徑名。 其形式是:

$(realpath names…)

示例:

.PHONY: all

ROOT := $(realpath ./.. ./../..)

all:
	@echo $(ROOT)

執行結果

make
/home/jerry/makefile/file /home/jerry/makefile

12. 去空格 strip 函數

strip 去掉string中的多餘空格並返回 其形式是:

$(strip string)

示例:

.PHONY: all

string = 12 3   4    5
str_strip = $(strip $(string))

all:
	@echo $(str_strip)

執行結果

$ make
12 3 4 5

13. 通配符函數 wildcard 函數

其形式是:

$(wildcard pattern)

示例:

.PHONY: all
SRC = $(wildcard *.c)

all:
    @echo $(SRC)

執行結果

$ ls
foo.c foo.h bar.c bar.h
$ make
foo.c bar.c
相關文章
相關標籤/搜索