Makefile
函数:
wildcard 这是扩展通配符函数,功能是展开成一列所有符合由其参数描述的文 件名,文件间以空格间隔;比如:罗列出src下的所有.c文件:$(wildcard ${SRC}/*.c)
patsubst 这是匹配替换函数, patsubst ( 需要匹配的文件样式,匹配替换成什么文件,需要匹配的源文件)函数。比如:用src下的*.c替换成对应的 *.o文件存放到obj中:$(patsubst %.c, ${OBJ}/%.o, $(notdir $(SOURCE)))
notdir 这是去除路径函数,在上面patsubst函数中已经使用过,去除SOURCE中文件的所有目录,只留下文件名;
$@:表示目标文件;一般是在规则中这么用:gcc -o $@ $(object);
$^:表示所有依赖文件;一般是在规则中这么用:gcc -o $@ $^ ;用所有依赖文件链接成目的文件;
$<:表示第一个依赖文件;在规则中使用:gcc -o $@ -c $< ;其实这个时候就是每个依赖文件生成一个目的文件;
变量:
#把所有的目录做成变量,方便修改和移植 BIN = ./bin SRC = ./src INC = ./include OBJ = ./obj #提前所有源文件(即:*.c文件)和所有中间文件(即:*.o) SOURCE = $(wildcard ${SRC}/*.c) OBJECT = $(patsubst %.c,${OBJ}/%.o,$(notdir ${SOURCE})) #设置最后目标文件 TARGET = main BIN_TARGET = ${BIN}/${TARGET} CC = gcc CFLAGS = -g -Wall -I${INC} #用所有中间文件生成目的文件,规则中可以用 $^替换掉 ${OBJECT} ${BIN_TARGET}:${OBJECT} $(CC) -o $@ ${OBJECT} #生成各个中间文件 ${OBJ}/%.o:${SRC}/%.c $(CC) $(CFLAGS) -o $@ -c $< .PHONY:clean clean: find $(OBJ) -name *.o -exec rm -rf {} \; #这个是find命令,不懂的可以查下资料 rm -rf $(BIN_TARGET)
第二版makefile
这个makefile的好处就是通用性,里面不涉及到具体的文件名,当你往src目录中添加新文件时,可以不需要修改makefile,所以这是个非常好的工具
1、warning函数
$(warning string)函数可以放在makefile 中的任何地方,执行到该函数时,会将string输出,方便定位make执行到哪个位置。warning函数可以放在makefile 中的任何地方:开始的位置、工作目标或必要条件列表中以及命令脚本中。这让你能够在最方便查看变量的地方输出变量的值。例如:
|
$(warning A top-level warning)
FOO := $(warning Right-hand side of a simple variable)bar BAZ = $(warning Right-hand side of a recursive variable)boo
$(warning A target)target: $(warning In a prerequisite list)makefile $(BAZ) $(warning In a command script) ls $(BAZ): |
这会产生如下的输出:
|
$ make makefile:1: A top-level warning makefile:2: Right-hand side of a simple variable makefile:5: A target makefile:5: In a prerequisite list makefile:5: Right-hand side of a recursive variable makefile:8: Right-hand side of a recursive variable makefile:6: In a command script ls makefile |
注意,warning函数的求值方式是按照make标准的立即和延后求值算法。虽然对BAZ的赋值动作中包含了一个warning函数,但是直到BAZ在必要条件列表中被求值后,这个信息才会被输出来。
debug 变量名
https://www.cnblogs.com/lotgu/p/5936465.html
浙公网安备 33010602011771号