看懂makefile 常见各种函数使用
本次涉及函数有 :info 、abspath(同realpath)、lastword 、 dir。
- $(MAKEFILE_LIST) : 当前文件,包括是谁include它的文件。
- info : makefile的打印函数。
- abspath(同realpath):makefile的获取当前文件所在的绝对路径。
- lastword :以空格为结束符的最后一个字符
- dir : 获取文件所在目录
- wildcard: 匹配当前文件所在路径下关于某字符串,可以是文件名也可是文件夹名
- filter 和 filter-out :过滤和反过滤 可参考博客
- strip: 除去某变量中字符串的空格
DEMO:
Makefile:
$(info ========= ·hello Makefile· ===========)
$(info )
include ./test.mk
all:
@echo ""
@echo -e "\033[;33;7m========= ·hello Makefile· ===========\033[0m"
test.mk:
$(info "当前文件是:$(MAKEFILE_LIST)")
$(info "当前文件的最后一个文件:$(lastword $(MAKEFILE_LIST))")
$(info "当前文件所在路径:$(dir $(MAKEFILE_LIST))")
$(info "当前文件所在绝对路径加文件名:$(realpath $(MAKEFILE_LIST))")
$(info "当前文件所在绝对路径:$(dir $(realpath $(MAKEFILE_LIST)))")
$(info "当前文件的最后一个文件所在绝对路径加文件名:$(realpath $(lastword $(MAKEFILE_LIST)))")
$(info "当前文件的最后一个文件所在绝对路径:$(dir $(realpath $(lastword $(MAKEFILE_LIST))))")
输出结果:
关于patsubst 用法:
加前缀:
$(patsubst %, _dir_%, $(SUBDIRS))在所有的名字前面加上_dir_
加前缀和后缀:
$(patsubst %,$(PREFIX)%$(SUFFIX),$(COMPILE_MODULES)) 在所有的名字前加$(PREFIX)并且在所有的名字后加$(SUFFIX)
正常使用方法:
$(patsubst %.c, %.o, $(wildcard *.c)) 将文件名后缀为.c 的 替换为 .o
$(patsubst %/, %, $(dir $(mkfile_path))) 将字符串中后缀为 “/” 替换为空
Makefile不显示输出错误提示
-$(MAKE) -C .....
Makefile中的 = := ?= +=
- = :这个会综合全局情况
- := :就是简单的等于,与我们平常的等号理解一样,当前赋值什么就是什么
- ?= :没有定义过就赋值
- += :在原来的基础上追加