= 最基本的赋值方式,与变量在Makefile中的位置无关,变量自动推导为为最终被指定的值
# 示例1
var=aaa.c
target:
@echo $(var)
var=bbb.c
root@localhost:~ # make
bbb.c
root@localhost:~ #
# 示例2
var1=aaa
var2=$(var1).c
var1=bbb
target:
@echo $(var2)
root@localhost:~ # make
bbb.c
root@localhost:~ #
:= 覆盖式赋值,只能推导前面的值
# 示例1
var=aaa.c
var:=bbb.c
target:
@echo $(var)
root@localhost:~ # make
bbb.c
root@localhost:~ #
# 示例2
var1:=$(var2).c
var2=bbb
target:
@echo $(var1)
root@localhost:~ # make
.c
root@localhost:~ #
?= 会判断该变量在前面是否已经定义过,如果没有定义过才赋值
# 示例1
var=aaa.c
var?=bbb.c
target:
@echo $(var)
root@localhost:~ # make
aaa.c
root@localhost:~ #
# 示例2
var?=bbb.c
target:
@echo $(var)
root@localhost:~ # make
bbb.c
root@localhost:~ #
+= 追加赋值,自动以空格分隔
var=aaa.c
var+=bbb.c
target:
@echo $(var)
root@localhost:~ # make
aaa.c bbb.c
root@localhost:~ #
$@ 规则中的目标文件集
$^ 所有依赖文件
$< 第一个依赖文件
$? 所有比目标新的依赖文件集
https://blog.csdn.net/sunxiaopengsun/article/details/62218843
make -n, --just-print 只显示命令,不执行,用于调试Makefile
https://blog.csdn.net/oqqHuTu12345678/article/details/125641363
比如:$(OBJ): %.o: %.c
即OBJ都是以.o为后缀的目标,每个.o目标依赖文件名相同后缀为.c的文件
$(OBJ)可以省略,直接写%.o:%.c
$(wildcard pattern1 pattern2 ...) 展开通配符
SRC:=wildcard(*.c *.cc *.cpp *.cxx)
target:
$(info "source file: $(SRC)")
$(patsubst pattern,replacement,text) 模式替换
OBJ:=$(patsubst %.c, %.o, $(wildcard *.c))
target:
$(info "object file: $(OBJ)")
$(filter pattern..., text) 保留符合pattern的字符串
$(filter-out pattern..., text) 过滤掉符合pattern的字符串
SRC:=aaa.cc bbb.cc ccc.cpp ddd.cpp eee.hpp fff.cxx
target1:
@echo $(filter %.cc, $(SRC))
target2:
@echo $(filter-out %.hpp %.cxx, $(SRC))
root@localhost:~ # make target1
aaa.cc bbb.cc
root@localhost:~ # make target2
aaa.cc bbb.cc ccc.cpp ddd.cpp
root@localhost:~ #
$(info ...) 打印调试信息
$(warning ...) 打印警告信息
$(error ...) 打印错误信息,并终止Makefile的执行
1.定义
define MY_MAKEFILE_FUNC
@echo "my name is $(0)"
@echo "my name is $(1)"
@echo "my name is $(2)"
# ...
endef
$(0) 表示函数名
$(1) $(2) ...表示传递给函数的参数
1.调用
$(call MY_MAKEFILE_FUNC PARAM1 PARAM2)