在makefile中常常要处理字符串, 掌握一些简单的函数可以极大简化这个过程.
1) 替换子串,删除子串:$(subst <from>,<to>,<text>)
C_SUFFIX := .c
OBJ_SUFFIX:= .o
SOURCE_NAMES := a.c b.c c.c
OBJECT_NAMES := $(subst $(C_SUFFIX),$(OBJ_SUFFIX),$(SOURCE_NAMES))
@echo OBJECT_NAMES is \"$(OBJECT_NAMES)\"
2) 模式替换子串,删除子串:$(patsubst <pattern>,<replacement>,<text>)
C_SUFFIX := .c
OBJ_SUFFIX:= .o
SOURCE_NAMES := a.c b.c c.c
PAT_OBJECT_NAMES := $(patsubst %.c, %.o, $(SOURCE_NAMES))
@echo PAT_OBJECT_NAMES is \"$(PAT_OBJECT_NAMES)\"
3) 字符串之间, 头尾最多只留下一个空格:$(strip <string>)
STRING_WITH_SPACE := " a b c "
#at most one space at head, mid, tail
STRING_STRIP_SPACE := $(strip $(STRING_WITH_SPACE))
@echo STRING_WITH_SPACE is \"$(STRING_WITH_SPACE)\"
@echo STRING_STRIP_SPACE is \"$(STRING_STRIP_SPACE)\"
4) 字符串查找:$(findstring <find>,<in>)
STRING_main := aaa bbb ccc ddd eee fff ggg
STRING_a := aaa
STRING_d := ddd
STRING_g := ggg
STRING_k := kkk
FIND_a := $(findstring $(STRING_a), $(STRING_main))
FIND_d := $(findstring $(STRING_d), $(STRING_main))
FIND_g := $(findstring $(STRING_g), $(STRING_main))
FIND_k := $(findstring $(STRING_k), $(STRING_main))
@echo STRING_main is \"$(STRING_main)\"
@echo STRING_a is \"$(STRING_a)\"
@echo STRING_d is \"$(STRING_d)\"
@echo STRING_g is \"$(STRING_g)\"
@echo FIND_a is \"$(FIND_a)\"
@echo FIND_d is \"$(FIND_d)\"
@echo FIND_g is \"$(FIND_g)\"
@echo FIND_k is \"$(FIND_k)\"
5) 按照模式过滤出来:$(filter <pattern...>,<text>)
CH_SOURCES := a.c b.c c.s d.h
SELECT_CS := $(filter %.c %.s,$(CH_SOURCES))
SELECT_H := $(filter %.h,$(CH_SOURCES))
@echo SELECT_CS is \"$(SELECT_CS)\"
@echo SELECT_H is \"$(SELECT_H)\"
6) 按照模式过滤掉:$(filter-out <pattern...>,<text>)
CH_SOURCES := a.c b.c c.s d.h
NO_SELECT_CS := $(filter-out %.c %.s,$(CH_SOURCES))
NO_SELECT_H := $(filter-out %.h,$(CH_SOURCES))
@echo NO_SELECT_CS is \"$(NO_SELECT_CS)\"
@echo NO_SELECT_H is \"$(NO_SELECT_H)\"
7) 单词排序去重:$(sort <list>)
UNSORT_DUP_FILE_LIST := 3.c 5.c 4.c 9.c 8.c 3.c 4.c 5.c
SORT_NODUP_FILE_LIST := $(sort $(UNSORT_DUP_FILE_LIST))
@echo SORT_NODUP_FILE_LIST is \"$(SORT_NODUP_FILE_LIST)\"
8) 取第一个单词:$(firstword <text>)
UNSORT_DUP_FILE_LIST := 3.c 5.c 4.c 9.c 8.c 3.c 4.c 5.c
SORT_NODUP_FILE_LIST := $(sort $(UNSORT_DUP_FILE_LIST))
FIRST_WORD := $(firstword $(SORT_NODUP_FILE_LIST))
@echo FIRST_WORD is \"$(FIRST_WORD)\"
9) 取出单词:$(word <n>,<text>),n>=1
UNSORT_DUP_FILE_LIST := 3.c 5.c 4.c 9.c 8.c 3.c 4.c 5.c
SORT_NODUP_FILE_LIST := $(sort $(UNSORT_DUP_FILE_LIST))
N_WORD := $(word 2, $(SORT_NODUP_FILE_LIST))
@echo N_WORD is \"$(N_WORD)\"
10) 取单词串:$(wordlist <ss>,<e>,<text>),1<=ss<=e
UNSORT_DUP_FILE_LIST := 3.c 5.c 4.c 9.c 8.c 3.c 4.c 5.c
SORT_NODUP_FILE_LIST := $(sort $(UNSORT_DUP_FILE_LIST))
WORD_LIST := $(wordlist 1,3, $(SORT_NODUP_FILE_LIST))
@echo WORD_LIST is \"$(WORD_LIST)\"
11) 单词个数统计:$(words <text>)
UNSORT_DUP_FILE_LIST := 3.c 5.c 4.c 9.c 8.c 3.c 4.c 5.c
SORT_NODUP_FILE_LIST := $(sort $(UNSORT_DUP_FILE_LIST))
WORD_COUNT := $(words $(SORT_NODUP_FILE_LIST))
@echo WORD_COUNT is \"$(WORD_COUNT)\"
12) 连接:$(join <list1>,<list2>)
STRING_SET_ch := aaa bbb
STRING_SET_num := 111 222 333
JOIN_SET_ch_num := $(join $(STRING_SET_ch), $(STRING_SET_num))
JOIN_SET_num_ch := $(join $(STRING_SET_num), $(STRING_SET_ch))
@echo JOIN_SET_ch_num is \"$(JOIN_SET_ch_num)\"
@echo JOIN_SET_num_ch is \"$(JOIN_SET_num_ch)\"