rsion_h)规则分析
接下来我们看规则$(call filechk,version.h):
#note:scripts/Kbuild.include
###
# filechk is used to check if the content of a generated file is updated.
# Sample usage:
# define filechk_sample
# echo $KERNELRELEASE
# endef
# version.h : Makefile
# $(call filechk,sample)
# The rule defined shall write to stdout the content of the new file.
# The existing file will be compared with the new one.
# - If no file exist it is created
# - If the content differ the new file is used
# - If they are equal no change, and no timestamp update
# - stdin is piped in from the first prerequisite ($<) so one has
# to specify a valid file as first prerequisite (often the kbuild file)
define filechk
$(Q)set -e; \
$(kecho) ' CHK $@'; \
mkdir -p $(dir $@); \
$(filechk_$(1)) < $< > $@.tmp; \
if [ -r $@ ] && cmp -s $@ $@.tmp; then \
rm -f $@.tmp; \
else \
$(kecho) ' UPD $@'; \
mv -f $@.tmp $@; \
fi
endef
上述代码中:
- ‘$@’ :目标include/generated/version_autogenerated.h;
- ‘$(1)’ :第一个参数version.h;
- ‘$ <’ :第一个依赖include/config/uboot.release;
- ‘filechk_$(1)’ :filechk_version.h;
filechk_version.h定义在顶层Makefile中:
#note:顶层Makefile
define filechk_version.h
(echo \#define PLAIN_VERSION \"$(UBOOTRELEASE)\"; \
echo \#define U_BOOT_VERSION \"U-Boot \" PLAIN_VERSION; \
echo \#define CC_VERSION_STRING \"$$(LC_ALL=C $(CC) --version | head -n 1)\"; \
echo \#define LD_VERSION_STRING \"$$(LC_ALL=C $(LD) --version | head -n 1)\"; )
endef
这上面主要时输出uboot版本和编译器版本。整个命令的流程如下:
(1)打印 ' CHK include/generated/version_autogenerated.h';
(2)创建include/generated/目录;
(3)输出指定信息到include/generated/version_autogenerated.h中;
(4)如果include/generated/version_autogenerated.h 文件存在,且与include/generated/version_autogenerated.h.tmp相同,则直接删除include/generated/version_autogenerated.h.tmp;
(5)如果4不成立,打印' UPD include/generated/version_autogenerated.h',并把include/generated/version_autogenerated.h.tmp更名为include/generated/version_autogenerated.h。
使用cmp命令比较include/generated/version_autogenerated.h include/generated/version_autogenerated.h.tmp两个文件(Linux中的cmp命令用于比较两个文件的不同,若发现两个文件有不同支出,则会标出来第一处不同的位置和列数编号;s或--quiet或--silent: 不显示错误信息)
全部展开,具体编译命令如下:
set -e; : ' CHK include/generated/version_autogenerated.h'; mkdir -p include/generated/; (echo \#define PLAIN_VERSION \"2018.03""\"; echo \#define U_BOOT_VERSION \"U-Boot \" PLAIN_VERSION; echo \#define CC_VERSION_STRING \"$(LC_ALL=C /home/h/my-work/03_toolchain/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc --version | head -n 1)\"; echo \#define LD_VERSION_STRING \"$(LC_ALL=C /home/h/my-work/03_toolchain/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ld.bfd --version | head -n 1)\"; ) < include/config/uboot.release > include/generated/version_autogenerated.h.tmp; if [ -r include/generated/version_autogenerated.h ] && cmp -s include/generated/version_autogenerated.h include/generated/version_autogenerated.h.tmp; then rm -f include/generated/version_autogenerated.h.tmp; else : ' UPD include/generated/version_autogenerated.h'; mv -f include/generated/version_autogenerated.h.tmp include/generated/version_autogenerated.h; fi
include/g