一些常用符号的定义,解析了一段,觉得太费劲,还是等遇到再一个个解析吧。
comma := ,
squote := '
empty :=
space := $(empty) $(empty)
将目标文件名前加"."
dot-target = $(dir $@).$(notdir $@)
将文件名变为.$(文件名).d之后,将其中的",“换为”_",主要用来生成临时文件名。
depfile = $(subst $(comma),_,$(dot-target).d)
将目标去掉路径和后缀名。
basetarget = $(basename $(notdir $@))
将单引号加上转义字符,subst为替换,将第三参数中的第一参数替换为第二参数。$1为调用者传入的第一个参数
escsq = $(subst $(squote),'\$(squote)',$1)
define用来定义makefile中的函数,fileckh用来检查对应的文件是否是最新的。
$ @目标文件,$ ^所有的依赖文件,$ <第一个依赖文件
-r file 用户可读为真
-w file 用户可写为真
-x file 用户可执行为真
-f file 文件为正规文件为真
-d file 文件为目录为真
-c file 文件为字符特殊文件为真
-b file 文件为块特殊文件为真
-s file 文件大小非0时为真
-t file 当文件描述符(默认为1)指定的设备为终端时为真
cmp为比较两个文件内容
define filechk
#如果过程中出现错误,立即退出
$(Q)set -e; \
echo ' CHK $@'; \
mkdir -p $(dir $@); \
#这一行不太理解,感觉像是,把依赖项的内容作为输入交给filechk_$(1)处理之后,输出到$@.tmp中。
$(filechk_$(1)) < $< > $@.tmp; \
if [ -r $@ ] && cmp -s $@ $@.tmp; then \
rm -f $@.tmp; \
else \
echo ' UPD $@'; \
mv -f $@.tmp $@; \
fi
endef
获取列表中第一个找到的C编译器,2>&1为错误输出也等效为标准输出,而标准输出已经重定向到null,也就是不显示所有内容,只注重结果。如果程序执行成功,则返回找到的第一个C编译器
cc-cross-prefix = \
$(word 1, $(foreach c,$(1), \
$(shell set -e; \
if (which $(strip $(c))$(CC)) > /dev/null 2>&1 ; then \
echo $(c); \
fi)))
# output directory for tests below
TMPOUT := $(if $(KBUILD_