当前位置:网站首页>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中定义的执行命令的目标和工作目录下的实际文件出现名字冲突.
- 如果
Makefile
The same level directory hasclean
文件,当执行make clean
时,规则因为没有依赖文件,所以目标被认为是最新的,因此后面的命令也就不会执行. - 加了
.PHONY : clean
之后,make clean
The 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))
参考
边栏推荐
- MPLS实验
- 南瓜科学产品升级 开启益智探索新篇章
- CCF GLCC正式开营|九州云开源专家携丰厚奖金,助力高校开源推广
- php中的ceil和floo以及round函数「建议收藏」
- token 过期后,如何自动续期?
- idea permanent activation tutorial (new version)
- Button control switch 4017 digital circuit chip
- 解题-->在线OJ(十八)
- CCF GLCC officially opened | Kyushu Cloud open source experts bring generous bonuses to help universities promote open source
- 阴影初始化【5】
猜你喜欢
How to find the location of a pdf file in endnote literature
基于 Next.js实现在线Excel
MySQL【窗口函数】【共用表表达式】
浙江大学团队使用基于知识图谱的新方法,从空间分辨转录组数据中推断细胞间通信状况
橄榄枝大课堂APP正式启动上线
开放麒麟 openKylin 版本规划敲定:10 月发布 0.9 版并开启公测,12 月发布 1.0 版
Kyushu Cloud attended the Navigator Online Forum to discuss the current status, challenges and future of 5G MEC edge computing
idea permanent activation tutorial (new version)
基于 Next.js实现在线Excel
四平方和,激光炸弹
随机推荐
Rust 从入门到精通04-变量
F.金玉其外矩阵(构造)
数据库恢复
【HMS core】【Media】【视频编辑服务】 在线素材无法展示,一直Loading状态或是网络异常
oracle+RAC+linux5.1所需要安装的包
2546 饭卡(01背包,挺好的)
浙江大学团队使用基于知识图谱的新方法,从空间分辨转录组数据中推断细胞间通信状况
CCF GLCC officially opened | Kyushu Cloud open source experts bring generous bonuses to help universities promote open source
[Opportunity Enlightenment-60]: "Soldiers, Stupid Ways"-1- Opening: "Death" and "Life" are the way of heaven
How to Identify Asynchronous I/O Bottlenecks
相似文本聚类与调参
如何通过使用“缓存”相关技术,解决“高并发”的业务场景案例?
南瓜科学产品升级 开启益智探索新篇章
State security organs conduct criminal arrest and summons review on Yang Zhiyuan, a suspect suspected of endangering national security
小 P 周刊 Vol.13
Win11快速助手在哪里?Win11打开快速助手的方法
博途200/1500PLC多段曲线控温FB(支持40段控温曲线、段曲线搜索、暂停、跳段等功能)
物联网应用发展趋势
电子行业MES管理系统有哪些特殊功能
错误 AttributeError type object 'Callable' has no attribute '_abc_registry' 解决方案