故不积跬步,无以至千里;不积小流,无以成江海。——《荀子》
例一:
slashfix = $(subst \,/,$(1))
功能:将windows文件目录改为Linux识别的目录 (windows下路径符为“\”Linux下的路径符为“/”)
讲解:subst 函数的语法如下
$(subst <from>,<to>,<text> )
在text中,用from 去替换 to
例二:
toprel = $(subst $(realpath $(ROOT_DIR))/,,$(abspath $(1)))
功能:将绝对路径转换为相对路径
讲解:realpath
返回为真实绝对的路径,abspath
返回的也是绝对路径
但是如果这个路径不存在时。realpath
将返回为空,而abspath
还能返回路径
例三:
export ROOT_DIR := $(realpath $(dir $(lastword $(MAKEFILE_LIST))))
功能: 返回(最近的)Makefile 真实绝对的路径
讲解:
- 首先
$(MAKEFILE_LIST)
会返回最近使用的Makefile文件(如果使用了include
包含了一个Makefile文件那么返回就是这个被include
包含的Makefile文件的路径,如果没有使用include
那么返回的是正在使用的Makefile文件所在的绝对路径) - lastword这个函数表示提取最后一个MAKEFILE_LIST列表里的最后一个元素。元素与元素之间是以空格符分开。
$(lastword $(MAKEFILE_LIST))
表示提取最后一个Makefile - 从文件名序列
<names>
中取出目录部分。目录部分是指最后一个反斜杠(“/”)之前的部分。如果没有反斜杠,那么返回“./”。 - 最后使用
realpath
返回绝对路径 - -
例四:
define SANITIZE_VAR
$(if $(filter-out undefined,$(origin $(1))),
$(info $(EMPTY) NOTE Sanitized $(2) variable '$(1)' from $(origin $(1)))
MAKEOVERRIDES = $(filter-out $(1)=%,$(MAKEOVERRIDES))
override $(1) :=
unexport $(1)
)
endef
功能: 这个工具集用于判断输入的变量是否是被定义。如果被定义则显示这个操作是不合法的
讲解:
filter-out
这个函数的功能为反过滤函数。符合条件的就丢弃。origin
函数用来判断变量的来源,返回值可以是undefined, deflaut, environment ,file ,comment-line, override, automatic 等- 第二句话的意思为:如果指令是除了 undefined 之外的都满足 if 的判断语句
- 第三句:显示这个变量的来源,并注明不合法
- -