基础知识
目标:依赖
1 | # 先检查tb.sv和dut.sv是不是存在,以及是否有修改。如果依赖有修改或者是目标不存在得时候,就执行下面得命令 |
伪目标
1 |
|
.ONESHELL:
- 所有的指令就会在一个shell中执行了
1 | .ONESHELL: |
语句的回显问题
- 可以在语句前面用”@“就行了,但是不想每个前面都打的话,就用.SILENT
1 | .SILENT: main all # 后面是目标 |
条件判断
ifeq
- 判断一个变量是不是已经定义了
1 | OS = Linux |
ifndef
- 判断一个变量是不是没有定义
1 | version = 3.0 |
ifneq
- 判断两个值是不是不相等
1 | 和上面的一样用法 |
变量操作
=是二次展开, :=是立即展开
1 | #只需要修改文件开头就行了,":="表示变量决定于它在makefile中的位置(顺序执行的),而"="是makefile最后的位置 |
取消变量的定义
1 | undefine <变量名> |
环境变量
1 | $(USERNAME) |
shell运行赋值
- 使用!=,运行一个shell命令,返回值赋值给一个变量
1 | files != ls |
追加
1 | files += linzhiwen.cpp |
条件赋值
- 条件赋值的**?=**,变量如果已经赋值了,那么就保持原来的值,如果没有就把右边的赋值给左边
1 | var1 = 100 |
变量的替换引用
- 语法:$(var:a=b),意思是将变量var的值中每一项结尾的a替换为b
1 | var = main.cpp a.cpp b.cpp |
变量覆盖
- makefile中的所有的变量都可以通过终端传递,实现覆盖
1 | make GUI=xxx |
字符替换函数
subst
- 文本替换函数,返回替换后的文本
1 | $(subst target,replacement,text) |
patsubst
- 模式替换, 返回替换后的文本
1 | $(patsubst pattern,replacement,text) |
strip
- 去除字符串头部和尾部的空格,中间如果连续有多个空格,则用一个空格替换,返回去除空格后的文本
1 | $(strip string) |
findstring
- 查找字符串,如果找到了,则返回对应的字符串,如果没找到,则反回空串
1 | $(findstring find,string) |
filter
- 从文本中筛选出符合模式的内容并返回
1 | $(filter pattern…,text) |
filter-out
- 与filter相反,过滤掉符合模式的,返回剩下的内容
1 | $(filter-out pattern…,text) |
sort
- 将文本内的各项按字典顺序排列,并且移除重复项
1 | $(sort list) |
word
- 用于返回文本中第n个单词
1 | $(word n,text) |
wordlist
- 用于返回文本指定范围内的单词列表
1 | $(wordlist start,end,text) |
words
- 返回文本中单词数
1 | $(words text) |
firstword
- 返回第一个单词
1 | $(firstword text) |
lastword
- 返回最后一个单词
1 | $(lastword text) |
文件名处理函数
dir
- 返回文件目录
1 | $(dir files) |
notdir
- 返回除了目录部分的文件名
1 | $(notdir files) |
suffix
- 返回文件后缀名,如果没有后缀返回空
1 | $(suffix files) |
basename
- 返回除了文件名字后缀的部分
1 | $(basename files) |
addsuffix
- 给文件名字添加后缀
1 | $(addsuffix suffix,files) |
addprefix
- 给文件名字添加前缀
1 | $(addprefix prefix,files) |
join
- 将两个列表中的内容一对一连接,如果两个列表内容数量不相等,则多出来的部分原样返回
1 | $(join list1,list2) |
wildcard
- 返回符合通配符号的文件列表
1 | $(wildcard pattern) |
realpath
- 返回文件的绝对路径
1 | $(realpath files) |
abspath
- 返回绝对路径,用法同realpath,如果一个文件名不存在,realpath不会返回内容,abspath则会返回一个当前文件夹一下的绝对路径
1 | $(abspath files) |
条件函数
if
- 条件判断,如果条件展开不是空串,则反回真的部分,否则返回假的部分
1 | $(if condition,then-part[,else-part]) |
or
- 返回条件中第一个不为空的部分
1 | $(or condition1[,condition2[,condition3…]]) |
and
- 如果条件中有一个为空串,则返回空,如果全都不为空,则返回最后一个条件
1 | $(and condition1[,condition2[,condition3…]]) |
intcomp
- 比较两个整数大小,并返回对应操作结果(GNU make 4.4以上版本)
1 | $(intcmp lhs,rhs[,lt-part[,eq-part[,gt-part]]]) |
makefile常用函数
file
- 读写文件
1 | $(file op filename[,text]) |
foreach
- 对一列用空格隔开的字符序列中每一项进行处理,并返回处理后的列表
1 | $(foreach each,list,process) |
call
- 将一些复杂的表达式写成一个变量,用call可以像调用函数一样进行调用。类似于编程语言中的自定义函数。在函数中可以用$(n)来访问第n个参数
1 | $(call funcname,param1,param2,…) |
value
- 对于不是立即展开的变量,可以查看变量的原始定义;对于立即展开的变量,直接返回变量值
1 | $(value variable) |
origin
- 查看一个变量定义的来源
1 | $(origin variable) |
flavor
- 查看一个变量的赋值方式
1 | $(flavor variable) |
eval
- 可以将一段文本生成Makefile的内容
1 | $(eval text) |
shell
- 用来执行shell的命令的
1 | files = $(shell ls *.cpp) |
let
- 将一个字符串序列中的项拆开放入多个变量中,并对各个变量进行操作(GNU make 4.4以上版本)
1 | $(let var1 [var2 ...],[list],proc) |
信息提示函数
error
- 用来提示错误信息并终止make执行
1 | $(error text) |
warning
- 提示警告信息,make不会终止
1 | $(warning text) |
info
- 输出一些信息
1 | $(info text…) |
多个makefile文件
include
- 可以读入其他makefile文件的内容,效果就如同在include的位置用对应的文件内容替换一样。
1 | include mkf1 mkf2 # 可以引入多个文件,用空格隔开 |
- 如果找不到对应文件,则会报错,如果要忽略错误,可以在
include
前加-
1 | -include mkf1 mkf2 |
export
- 可以通过export指令向子项目传递变量
1 | export var # 传递var |
-C
- 去到另一个文件夹里面执行make命令
1 | $(MAKE) -C dir_name |
本文作者:
ICXNM-ZLin
本文链接: https://talent-tudou.github.io/2024/10/19/Programming/Makefile/
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!
本文链接: https://talent-tudou.github.io/2024/10/19/Programming/Makefile/
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!