设为首页 加入收藏

TOP

UBOOT编译--- UBOOT的$(version_h) $(timestamp_h)(七)(四)
2023-07-23 13:30:27 】 浏览:140
Tags:UBOOT 编译 --- version_h timestamp_h
enerated/version_autogenerated.h内容如下:
在这里插入图片描述

4. 目标$(timestamp_h)

# 顶层Makefile
$(timestamp_h): $(srctree)/Makefile FORCE
	$(call filechk,timestamp.h)

4.1 $(timestamp_h)依赖分析

目标 timestamp_h依赖$(srctree)/Makefile 和FORCE。假设直接在源目录编译,顶层Makefile存在,依赖FORCE见UBOOT编译--- make xxx_deconfig过程详解(一) 4.3小节 - 依赖 FORCE

4.2 $(timestamp_h)规则分析

接下来我们看规则$(call filechk,timestamp.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

上述代码中:

  • ‘$@’ :目标timestamp_h (include/generated/timestamp_autogenerated.h);
  • ‘$(1)’ :第一个参数timestamp.h;
  • ‘$ <’ :第一个依赖$(srctree)/Makefile ;
  • ‘filechk_$(1)’ :filechk_timestamp.h;

filechk_timestamp.h定义在顶层Makefile中:

#note:顶层Makefile
define filechk_timestamp.h
	(if test -n "$${SOURCE_DATE_EPOCH}"; then \
		SOURCE_DATE="@$${SOURCE_DATE_EPOCH}"; \
		DATE=""; \
		for date in gdate date.gnu date; do \
			$${date} -u -d "$${SOURCE_DATE}" >/dev/null 2>&1 && DATE="$${date}"; \
		done; \
		if test -n "$${DATE}"; then \
			LC_ALL=C $${DATE} -u -d "$${SOURCE_DATE}" +'#define U_BOOT_DATE "%b %d %C%y"'; \
			LC_ALL=C $${DATE} -u -d "$${SOURCE_DATE}" +'#define U_BOOT_TIME "%T"'; \
			LC_ALL=C $${DATE} -u -d "$${SOURCE_DATE}" +'#define U_BOOT_TZ "%z"'; \
			LC_ALL=C $${DATE} -u -d "$${SOURCE_DATE}" +'#define U_BOOT_DMI_DATE "%m/%d/%Y"'; \
			LC_ALL=C $${DATE} -u -d "$${SOURCE_DATE}" +'#define U_BOOT_BUILD_DATE 0x%Y%m%d'; \
		else \
			return 42; \
		fi; \
	else \
		LC_ALL=C date +'#define U_BOOT_DATE "%b %d %C%y"'; \
		LC_ALL=C date +'#define U_BOOT_TIME "%T"'; \
		LC_ALL=C date +'#define U_BOOT_TZ "%z"'; \
		LC_ALL=C date +'#define U_BOOT_DMI_DATE "%m/%d/%Y"'; \
		LC_ALL=C date +'#define U_BOOT_BUILD_DATE 0x%Y%m%d'; \
	fi)
endef

这上面首先判断在环境变量中是否定义了 SOURCE_DATE_EPOCH ,有则使用 SOURCE_DATE_EPOCH 生成时间戳,没有则使用当前时间。有些编译环境会设置,这个目前我所了解的作用是保证uboot二进制一致性会用到(有机会我们后面会针对镜像二进制一致性单独写一篇)。LC_ALL=C 是为了去除所有本地化的设置,让命令能正确执行。date命令的功能是显示和设置系统日期和时间,使用规则可以参见:linux date命令。在我所使用的的平台暂时没有定义,因此走else分支。整个命令的流程如下:
(1)打印 ' CHK include/generated/timestamp_autogenerated.h';
(2)创建include/generated/目录;
(3)通过date命令,定义几个宏定义,并输出到include/generated/timestamp_autogenerated.h.tmp中;
(4)如果include/generated/timestamp_autogenerated.h 文件存在,且与include/generated/timestamp_autogenerated.h.tmp相同,则直接删除include/generated/timestamp_autogenerated.h.tmp;
(5)如果4不成立

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Cache的相关知识(二) 下一篇PHY驱动调试之 --- PHY控制器驱动..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目