Makefile阅读笔记
- IT业界
- 2025-09-01 13:51:01

author: hjjdebug date: 2025年 02月 18日 星期二 18:00:52 CST description: Makefile 阅读笔记
文章目录 1. vpath 指令2. 变量替换3. 变量模式替换4. define 指令4.1 定义一个多行字符串. resume4.2 定义一个函数 greet4.3:实战 5. 介绍几个内置函数.1. wildcard2. foreach3. eval4. call 看makefile 倍难阅读, 写几个难点帮助理解. 1. vpath 指令
指定某一类文件的搜索路径. 格式: vpath PATTERN DIRECTORY 例: vpath %.c $(SRC_PATH) vpath %.cpp $(SRC_PATH) vpath %.h $(SRC_PATH) vpath %.inc $(SRC_PATH) vpath %.S $(SRC_PATH) vpath %.asm $(SRC_PATH)
2. 变量替换
$(CHECKASMOBJS:.o=.d)
CHECKASMOBJS:是一个Makefile变量,它包含了一系列的文件名或者路径。 .o 是后缀为.o的文件 ‘=’ 赋值操作符,用于将匹配到的字符串按照右边的后缀进行替换。 .d 后缀为.d的文件 它会将变量CHECKASMOBJS中的每个.o文件扩展名替换为.d。 举例,如果CHECKASMOBJS的值为 foo.o bar.o 那么$(CHECKASMOBJS:.o=.d)的结果将是 foo.d bar.d
.d文件通常是依赖文件,包含了编译过程中生成的对象文件(.o文件)所依赖的头文件信息。 Makefile通过包含这些.d文件,可以自动获取到编译依赖关系, 从而在编译时能够正确地处理头文件的变更,避免重复编译不必要的源文件。
3. 变量模式替换
$(CHECKASMOBJS:%=tests/checkasm/%)
这是一种使用Make的模式替换功能(Pattern Substitution)的表达式 CHECKASMOBJS:这是一个Make变量,它包含了一系列的文件名或者路径。 %=tests/checkasm/%:这是一个模式替换规则。 ‘%’ 是模式,它代表匹配任意字符串的通配符。 ‘=’ 赋值操作符,用于将匹配到的字符串按照右边的模式进行替换。 tests/checkasm/%:这是替换后的模式,其中%会被CHECKASMOBJS中每个元素匹配到的字符串所替换。
举例: 如果CHECKASMOBJS的值为 foo.o bar.o 那么$(CHECKASMOBJS:%=tests/checkasm/%)的结果将会是 tests/checkasm/foo.o tests/checkasm/bar.o
这种模式替换功能在Makefile中非常有用,特别是当你需要对一系列文件名或路径进行批量修改时。 它可以让你以非常简洁的方式实现复杂的字符串替换操作。
练习: TESTTOOLS = audiogen videogen base64 audiomatch HOSTPROGS := $(TESTTOOLS:%=tests/%) 答案,就是把文件都添加了一个路径
4. define 指令
define 指令用来定义多行变量或函数
4.1 定义一个多行字符串. resume但你只能在一行中写,换行用\n隔开 因为后续的行,首个token都会认为是命令
define resume "my name is hjj.\nI like computer.\nI graduated in xxxx." endef all: @echo $(resume)执行 $ make my name is hjj. I like computer. I graduated in xxxx.
4.2 定义一个函数 greetdefine 被展开每行按命令执行,后续是命令参数
define greet hello $1! @echo hello define @echo hello function endef all: $(call greet, hjj)注意call 调用,函数名与参数,参数与参数用,分割而不是空格分割,向c靠拢而不向bash靠拢
4.3:实战 define RESET $(1) := $(1)-yes := endefRESET 函数是把传来的参数复位的意思
define DOSUBDIR $(foreach V,$(SUBDIR_VARS),$(eval $(call RESET,$(V)))) include $(SRC_PATH)/$(1)/Makefile endef其中SUBDIR_VARS如下, 还可以定义更多变量
SUBDIR_VARS=CLEANFILES TOOLS MMX-OBJS X86ASM-OBJS
DOSUBDIR 函数是对定义的变量进行枚举,对定义的变量进行复位,初始化为空 然后包含上第一参数作为目录下的Makefile, 还可以继续追加其它动作
FFLIBS=avformat avcodec avutil $(foreach D,$(FFLIBS),$(eval $(call DOSUBDIR,lib$(D))))该调用会对指定目录进行DOSUBDIR操作,其返回字符串继续用作命令执行
5. 介绍几个内置函数.
1. wildcard
格式:
‘$(wildcard PATTERN)’
功能: 输出匹配 PATTERN 的文件名 举例:$(wildcard *.c) 输出目录向所有.c 文件, 类似ls *.c输出
2. foreach函数调用格式:
$(foreach VAR,LIST,TEXT)
功能: 跟据列表LIST, 用枚举变量VAR, 来执行TEXT动作 举例: 展开指定目录下的所有文件 find_files = $(wildcard $(dir)/*) # 扩展为该目录下所有文件 dirs := a b c d files := ( f o r e a c h d i r , (foreach dir, (foreachdir,(dirs),$(find_files)) # 指定目录下的所有文件
替换文件扩展名 FILES := file1.c file2.c file3.c OBJS := $(foreach file, $(FILES), $(file:.c=.o))
复制库文件 LIBS := lib1 lib2 lib3 install: $(foreach lib, $(LIBS), cp ( l i b ) . s o / u s r / l o c a l / l i b / (lib).so /usr/local/lib/ (lib).so/usr/local/lib/(lib).so)
3. evaleval指令可以将参数中的字符串作为Makefile的一部分进行解析和执行 $(eval ) 把string 当命令来执行, 可以实现动态为变量赋值,为函数赋值,执行命令等
4. call$(call VARIABLE,PARAM,PARAM,…)
调用用户定义的函数VARIABLE并传递参数Makefile阅读笔记由讯客互联IT业界栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Makefile阅读笔记”