makefile中"=" , ":=" , " : " 的区别 patsubst 以及addprefix
Makefile有三个非常有用的变量。分别是$@,$^,$<代表的意义分别是:
$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。
1、“=” make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子: x = foo y = $(x) bar x = xyz 在上例中,y的值将会是 xyz bar ,而不是 foo bar 。 2、“:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。 x := foo y := $(x) bar x := xyz 在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。 ----------------------------------------------------------------------------------------------------- 模式字符串替换函数——patsubst。 ---------------------------------------------- 格式:$(patsubst <pattern>, <replacement>, <text> ) 功能: 查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>, 如果匹配的话,则以<replacement>替换。<pattern>可以包括通配符“%”,表示任意长度的字串。 如果<replacement>中也包含“%”,那么,<replacement>中的这个“%”将是<pattern>中的那个“%”所代表的字串。(可以用“\”来转义,以“\%”来表示真实含义的“%”字符) 返回:函数返回被替换过后的字符串。 示例: $(patsubst %.c,%.o,x.c.c bar.c) 把字串“x.c.c bar.c”符合模式[%.c]的单词替换成[%.o],返回结果是“x.c.o bar.o” -------------------------------------------------------------------------------------------------------------------------------- 变量替换 ------------ $(var:a=b),是将 var 变量中每一个单词后面的 a 替换为 b 等价于 $(patsubst %pattern, %replacement, $(var)) 等价于 $(patsubst pattern,replacement,$(var)) %, 其功能和 patsubst 等价 --------------------------------------------------------------------------------------------------------------------- 加前缀函数——addprefix。 ----------------------------------- 功能:把前缀加到中的每个单词后面。 返回:返回加过前缀的文件名序列。 示例:$(addprefix src/,foo bar)返回值是“src/foo src/bar”。 ---------------------------------------------------------------------------------------------------------------------- all: lib tools examples NONGEN_CXX_SRCS := $(shell find \ src/$(PROJECT) \ include/$(PROJECT) \ python/$(PROJECT) \ matlab/+$(PROJECT)/private \ examples \ tools \ -name "*.cpp" -or -name "*.hpp" -or -name "*.cu" -or -name "*.cuh") EXAMPLE_SRCS := $(shell find examples -name "*.cpp") EXAMPLE_OBJS := $(addprefix $(BUILD_DIR)/, ${EXAMPLE_SRCS:.cpp=.o}) EXAMPLE_BINS := ${EXAMPLE_OBJS:.o=.bin} examples: $(EXAMPLE_BINS) $(EXAMPLE_BINS): %.bin : %.o | $(DYNAMIC_NAME) @ echo CXX/LD -o $@ $(Q)$(CXX) $< -o $@ $(LINKFLAGS) -l$(LIBRARY_NAME) $(LDFLAGS) \ -Wl,-rpath,$(ORIGIN)/../../lib