Makefile总结

Makefile总结

<目标文件> : <前置条件
【TAB键】 <commands>

第一行冒号前面的部分,叫做"目标"(target),冒号后面的部分叫做"前置条件"(prerequisites);第二行必须由一个tab键起首,后面跟着"命令"(commands)。"前置条件"和"命令"都是可选的,但是两者之中必须至少存在一个。

目标可以是一个文件名,也可以是多个文件名,之间用空格分隔。

目标还可以是某个操作的名字,这称为"伪目标"

不声明为伪目标.PHONY的情况下,如果当前目录正好有一个文件叫目标名字,那它的构建命令就不会执行

如果声明伪目标.PHONY,每次都会构建

前置条件

前置条件通常是一组文件名,指定了"目标"是否重新构建的判断标准:只要有一个前置文件不存在,或者有过更新(前置文件的last-modification时间戳比目标的时间戳新),"目标"就需要重新构建。

a.txt : b.txt c.txt
        cat b.txt c.txt > a.txt
b.txt :
        echo "test1" > b.txt
c.txt :
        echo "test2" > c.txt

上面代码中,构建a.txt 的前置条件是b.txt,c.txt 。如果当前目录中,a.txt 已经存在,那么make可以正常运行(默认读取当前目录的Makefile),否则必须再写一条规则,来生成 b.txt,c.txt

其中的b和c的前置条件没有,只要这个条件不存在就会构建,存在会生成,虽然b,c的位置在后面,测试结果是与顺序无关

命令

命令(commands)表示如何更新目标文件,由一行或多行的Shell命令组成。它是构建"目标"的具体指令,它的运行结果通常就是生成目标文件。
每行命令之前要有tab,每行命令都在单独的shell中执行。这些Shell之间没有继承关系。

.RECIPEPREFIX = >
# 设置 > 替换掉tab键
var-lost:
>export var1=1
>echo "var1=[$$foo]"
# 执行这个命令后var1变量取不到,因为每一行都是单独的shell


# 解决方法是:
# 1.需要把命令写到一行中  
var-lost:
>export var1=1;echo "var1=[$$foo]"
# 2.或者使用\对换行转义
var-lost:
>export var1=1 \
>echo "var1=[$$foo]"
# 3.加上.ONESHELL:命令
.ONESHELL:
var-lost2:
>export var1=1
>echo "var1=[$$foo]"

语法

注释

#号表示注释

回声

make会打印每条命令,然后再执行(会把其中的注释也打印出来),关闭回声只要在命令前加@

通配符和Bash一致

模式匹配

使用匹配符,可以将大量同类型的文件用一条规则构建

%.o:%.c
#和下面的命令保持一致
#如果目录中有1.c,2.c文件
f1.o:f1.c
f2.o:f2.c

变量和赋值符

允许使用等号定义变量

txt=Hello World
test:
	@echo $(txt)
	@echo $$txt

make命令会对 进 行 转 义 , 所 以 需 要 两 个 进行转义,所以需要两个 $匹配变量

Makefile的四种赋值方式=、:=、?=、+=

VARIABLE = value
# 在执行时扩展,允许递归扩展。

VARIABLE := value
# 在定义时扩展。

VARIABLE ?= value
# 只有在该变量为空时才设置值。

VARIABLE += value
# 将值追加到变量的尾端。

内置变量

$(CC) 指向当前使用的编译器,$(MAKE) 指向当前使用的Make工具。
output:
	$(CC) -o output input.c

自动变量

$@当前构建的目标

$<当前的第一个前置条件(只有第一个)

.txt: b.txt c.txt
    cp $< $@ 
等于
a.txt: b.txt c.txt
    cp b.txt a.txt 

$? 指代比目标更新的所有前置条件(如果时间戳比目标新的前置条件)

指 代 所 有 前 置 条 件 , 之 间 以 空 格 分 隔 。 与 ^ 指代所有前置条件,之间以空格分隔。与 < 多

$* 匹配通配符%匹配到的部分,例如上面的例子中表示f1和f2

$(@D) 和 ( @ F ) 分 别 指 向 (@F)分别指向 (@F)@的目录名和文件名

循环和判断

使用的是Bash语法

函数

内置函数参考:
[函数参考]: https://www.gnu.org/software/make/manual/html_node/Functions.html
支持调用shell函数

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值