当前位置:网站首页>Makefile syntax and usage notes
Makefile syntax and usage notes
2022-08-04 14:17:00 【丨 丨 anonymous users】
文章目录
1、Makefile规则格式
<目标> : <依赖文件集合>
命令 1
命令 2
示例:
# -c : Compile to generate an object file with the same name(xx.o),不链接
# -o : 链接生成可执行文件(target)
target : main.o hello.o world.o
gcc -o target main.o hello.o world.o
main.o: main.c
gcc -c main.c
hello.o: hello.c
gcc -c hello.c
world.o: world.c
gcc -c world.c
clean:
rm *.o
rm abc
2、Makefile变量
Makefile中的变量都是字符串,类似 C语言中的宏.
Variable related symbols:
| 符号 | 功能 | 描述 |
|---|---|---|
= | 赋值符 | 变量的真实值取决于它所引用的变量的最后一次有效值. |
:= | 赋值符 | 不会使用后面定义的变量,只能使用前面已经定义好的. |
?= | 赋值符 | 如果前面已经赋过值了,The previously assigned value is used;If the variable has not been assigned a value, the currently defined value is used. |
+= | 变量追加 | Add some variables to the previously defined variables. |
示例:
OBJ = main.o
OBJ += hello.o
OBJ += world.o
或者
OBJ = main.o hello.o world.o
target : $(OBJ)
gcc -o target $(OBJ)
main.o: main.c
gcc -c main.c
hello.o: hello.c
gcc -c hello.c
world.o: world.c
gcc -c world.c
clean:
rm *.o
rm abc
3、Makefile模式规则
% :表示长度任意的非空字符串.类似于通配符.
# `%.o`:所有的以 `.o` 结尾的文件
# `%.c`:所有的以 `.c` 结尾的文件
# 当“ “%”出现在目标中的时候,目标中 “%”所代表的值决定了依赖中的 “%”值
%.o: %.c
<命令>
4、Makefile自动化变量
| 自动化变量 | 描述 |
|---|---|
[email protected] | 规则中的目标集合,在模式规则中,如果有多个目标的话,“,“[email protected]”表示匹配模式中定义的目标集合. |
$% | 当目标是函数库的时候表示规则中的目标成员名,如果目标不是函数库文件,那么其值为空. |
$< | 依赖文件集合中的第一个文件,如果依赖文件是以模式(即“ “%””)定义的,那么““$<”就是符合模式的一系列的文件集合. |
$? | 所有比目标新的依赖目标集合,以空格分开. |
$^ | 所有依赖文件的集合,使用空格分开,如果在依赖文件中有多个重复的文件,““$^”会去除重复的依赖文件,只保留一份. |
$+ | 和““$^”类似,但是当依赖文件存在重复的话不会去除重复的依赖文件. |
$* | 这个变量表示目标模式中"%"及其之前的部分,如果目标 是 test/a.test.c,目标模式为 a.%.c,那么 “$*”就是 test/a.test. |
示例:
OBJ = main.o hello.o world.o
target : $(OBJ)
gcc -o target $(OBJ)
# %.o 代表 main.o hello.o world.o
# %.c 代表 main.c hello.c world.c
# $< : A set of dependent files that conform to the pattern.即 `%.c` 代表的 main.c hello.c world.c
%.o: %.c
gcc -c $<
clean:
rm *.o
rm abc
5、Makefile伪目标
- Pseudo targets do not represent real target names,在执行 make命令的时候通过指定这个伪目标来执行其所在规则的定义的命令.
- 使用伪目标主要是为了避免 Makefile中定义的执行命令的目标和工作目录下的实际文件出现名字冲突.
- 如果
MakefileThe same level directory hasclean文件,当执行make clean时,规则因为没有依赖文件,所以目标被认为是最新的,因此后面的命令也就不会执行. - 加了
.PHONY : clean之后,make cleanThe following commands will be executed.
示例:
.PHONY : clean
clean:
rm *.o
rm abc
6、Makefile条件判断
ifeq (<参数 1>, <参数 2>)
ifeq ‘<参数1>’ “<参数2>” # Use single quotes for parameters、双引号都是可以的
<语句>
else
<语句>
endif
ifdef <变量名 >
<语句>
else
<语句>
endif
7、Makefile函数使用
| 函数 | 功能 | 格式 | 示例 |
|---|---|---|---|
subst | 字符串替换 | $(subst <from>,<to>,<text>) | $(subst zzk,ZZK,my name is zzk) |
patsubst | 模式字符串替换 | $(patsubst <pattern>,<replacement>,<text>) | $(patsubst %.c,%.o,a.c b.c c.c) |
dir | Extract the directory section | $(dir <names……>) | $(dir </src/a.c>) |
notdir | Extract the filename part | $(notdir <names……>) | $(notdir </src/a.c>) |
foreach | 循环 | $(foreach <var>,<list>,<text>) | |
wildcard | Rules when defining variables | $(wildcard PATTERN……) | $(wildcard *.c) |
patsubst:此函数查找字符串<text>中的单词是否符合模式<pattern>,如果匹配就用<replacement>来替换掉,<pattern>可以使用通配符“ “%”,表示任意长度的字符串,函数返回值就是替换后的字符串.如果<replacement>中也包涵“ “%”,那么 中的“ “%”将是<pattern>中的那个““%”所代表的字符串.foreach:此函数的意思就是把参数<list>中的单词逐一取出来放到参数<var>中,然后再执行<text>所包含的表达式.每次<text>都会返回一个字符串,循环的过程中,<text>中所包含的每个字符串会以空格隔开,最后当整个循环结束时,<text>所返回的每个字符串所组成的整个字符串将会是函数 foreach 函数的返回值.
# 函数调用方式
$(函数名 参数集合 )
${函数名 参数集合 }
示例:
# 搜索当前目录下所有的 .c 后缀的源文件
SRC = $(wildcard *.c)
# 把 $(SRC) 里面所有的 .c 文件替换成 .o 文件
OBJ = $(patsubst %.c, %.o, $(SRC))
参考
边栏推荐
- leetcode 48. Rotate Image 旋转图像(Medium)
- idea permanent activation tutorial (new version)
- 基于 Next.js实现在线Excel
- 博途1200/1500PLC斜坡指令RAMP(带暂停功能)
- VBS函数应用–getobject的使用获得Automation对象
- 第四讲 SVN
- PAT甲级:1038 Recover the Smallest Number
- 【问题解决】QT更新组件出现 “要继续此操作,至少需要一个有效且已启用的储存库”
- How to play the Tower of Hanoi
- SMART S7-200PLC串行自由口通讯(耐压测试仪)
猜你喜欢

CCF GLCC officially opened | Kyushu Cloud open source experts bring generous bonuses to help universities promote open source

Rust 从入门到精通04-变量

基于 Next.js实现在线Excel

手搓一个“七夕限定”,用3D Engine 5分钟实现烟花绽放效果

考研上岸又转行软件测试,从5k到13k完美逆袭,杭州校区小哥哥拒绝平庸终圆梦!

Fuse bit of AVR study notes

Win11勒索软件防护怎么打开?Win11安全中心勒索软件防护如何设置

ICML 2022 | 图神经网络的局部增强

metaRTC5.0新版本支持mbedtls(PolarSSL)

CCF GLCC正式开营|九州云开源专家携丰厚奖金,助力高校开源推广
随机推荐
四平方和,激光炸弹
How to Identify Asynchronous I/O Bottlenecks
vcl啥意思_oval
南瓜科学产品升级 开启益智探索新篇章
Map常见的遍历方式-keySet 和 entrySet
阿里老鸟终于把测试用例怎么写说的明明白白了,小鸟必看
基于 Next.js实现在线Excel
七夕邂逅爱,那人一定在
异步编程概览
数据库恢复
《社会企业开展应聘文职人员培训规范》团体标准在新华书店上架
解题-->在线OJ(十八)
【无标题】
【硬件架构的艺术】学习笔记(1)亚稳态的世界
LCP 06. 拿硬币-遍历
MySQL性能指标TPS\QPS\IOPS如何压测?
MySQL【窗口函数】【共用表表达式】
博途200/1500PLC多段曲线控温FB(支持40段控温曲线、段曲线搜索、暂停、跳段等功能)
职场漫谈:为什么越是内卷的行业越有人争着抢着往里冲?好奇怪的说...
G.登山小分队(暴力&dfs)