PHNOY伪目标
.PHONY:clean all
clean:
-rm -rf $(TARGETS)
先简单理解为预防有以clean为文件名的
makefile维护的变量(通常大写,自己可以修改)
CC:cc(即gcc)
APPFLAGS:预处理使用的选项
CFLAGS:编译的时候使用的选项
LDFLAGS:链接库使用的选项
自动变量
$< : 规则中的第一个依赖
$@:规则中的目标
$^: 规则中所有的依赖
赋值运算符
= 是基本的赋值方式
:= 覆盖之前的值
?=如果没有赋值就赋予等号后面的值
+= 添加后面的值,并不覆盖原有的值
函数
foreach函数
foreach作为makefile中的函数,相当于一个循环函数。
一、作用
循环处理文件列表。
二、格式
$(foreach var text commond)
var:局部变量
text:文件列表,空格隔开,每一次取一个值赋值为变量var
commond:对var变量进行操作(一般会使用var变量,不然没意义),每次操作结果都会以空格隔开,最后返回空格隔开的列表。
filter函数
$(filter PATTERN…,TEXT)
函数名称:过滤函数—filter。
函数功能:过滤掉字串“TEXT”中所有不符合模式“PATTERN”的单词,保留所
有符合此模式的单词。可以使用多个模式。模式中一般需要包含模式字
符“%”。存在多个模式时,模式表达式之间使用空格分割。
返回值:空格分割的“TEXT”字串中所有符合模式“PATTERN”的字串。
函数说明:“filter”函数可以用来去除一个变量中的某些字符串,我们下边的例子中
就是用到了此函数。
示例:
sources := foo.c bar.c baz.s ugh.h
foo: $(sources)
cc $(filter %.c %.s,$(sources)) -o foo
使用“$(filter %.c %.s,$(sources))”的返回值给 cc 来编译生成目标“foo”,函数返回
值为“foo.c bar.c baz.s”
strip函数
$(strip
名称:去空格函数——strip。
功能:去掉
返回:返回被去掉空格的字符串值。
说明: 空字符包括 空格,tab等不可显示的字符
eval函数
函数原型 $(eval text)
它的意思是 text 的内容将作为makefile的一部分而被make解析和执行。
比如这样一个makefile:
$(eval xd:xd.c a.c)
将会产生一个这样的编译
cc xd.c a.c -o xd
这样一个makefile:
define MA
aa:aa.c
gcc -g -o aa aa.c
endef
$(eval $(call MA) )
会产生一个这样的编译:
gcc -g -o aa aa.c
call函数
call函数是唯一一个可以用来创建新的参数化的函数。你可以写一个非常复杂的表达式,这个表达式中,你可以定义许多参数,然后你可以用call函数来向这个表达式传递参数。其语法是:
$(call
当make执行这个函数时,
$(call CompLib_Map, FEATURE_MQTT_COMM_ENABLED, src/mqtt)
define CompLib_Map $(eval \ COMP_LIB_COMPONENTS += \ $(if \ $(filter y,$($(strip $(1)))),$(foreach M,$(strip $(2)),$(if $(filter $(strip $(M)),$(COMP_LIB_COMPONENTS)),,$(strip $(M)))) \ ) \ ) endef
wildcard 函数
查找当前目录下所有.c文件,返回值给src
src=$(wildcard ./.c)
patsubst 替换所有.c文件为.o文件
obj=$(patsubst ./%.c, ./%.o, $(src))
*origin 函数的作用是告诉你变量是哪里来的,其出生状况如何,他并不改变变量
$(origin )
例:如果该变量为环境变量,那么返回 “enviroment” 。如下面的 Makefile 代码:
all:
@echo $(origin USER)