Makefile学习

一、变量

= := ?= +=的区别

= 最基本的赋值方式,与变量在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

四、静态模式 

<targets ...>: <target-pattern>: <prereq-patterns ...>
  <commands>

比如:$(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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值