MEMORY | INTERRUPT | TIMER | 并发与同步 | 进程管理 | 调度 | uboot | DTB | ARMV8 | ATF | Kernel Data Structure | PHY | LINUX2.6 | 驱动合集 | UART子系统 | USB专题 |

UBOOT编译--- UBOOT顶层Makefile中目标_all和all的关系及背景(四)

@

1. 前言

 UBOOT版本:uboot2018.03,开发板myimx8mmek240。

2. 概述

当我们执行的命令是make命令时 ,由于后面没有带参数,因此makefile会编译默认遇到的第一个目标。

3. 老版本UBOOT(背景)

# 顶层Makefile
......

# dependency target in autoconf.mk.dep from being the default.
all:                                                         (1) //空命令
sinclude $(obj)include/autoconf.mk.dep
sinclude $(obj)include/autoconf.mk

......

all:            $(ALL)                                       (2)
	$(obj)u-boot.hex:       $(obj)u-boot
    $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@

1. 如果没有第一个all :
直接执行了sinclude。打开autoconf.mk.dep看到第一行就是include/autoconf.mk: include/common.h 。这就是makefile遇到的第一个目标include/autoconf.mk。因此将include/autoconf.mk当做终极目标执行了。此时的include/autoconf.mk是前一次刚产生的(make xxx_deconfig),所以是最新的,makefile认为没有必要重新执行,
因此什么都不做。最后输出了make: `include/autoconf.mk' is up to date。空命令(all:)的唯一作用是防止make在执行时,试图为重建这个目标去查找隐含命令,这个隐含的命令就是执行第一个遇到的目标。

2. 如果有第一个all :
makefile就知道需要执行的终极目标是 all。而不是include的autoconf.mk.dep里面的include/autoconf.mk。继续执行到遇到后面的all: 后面的all将覆盖前面的all。所以最终执行的是第二个all。

因此第一个all的含义就是 如果你执行make的时候没有带任何其他目标,单独的一个make,可以避免以autoconf.mk.dep里面的include/autoconf.mk作为错误目标

如果你执行make的时候带了目标,这个all:有不有都无所谓。

4. 新版本UBOOT

# 顶层Makefile
# If building an external module we do not care about the all: rule
# but instead _all depend on modules
PHONY += all                  //伪目标all
ifeq ($(KBUILD_EXTMOD),)      //假设未定义KBUILD_EXTMOD
_all: all                     //_all 是顶层Makefile第一个目标,依赖是all             (1)
else
_all: modules
endif

......

all:		$(ALL-y) cfg                                                          (2)
ifeq ($(CONFIG_DM_I2C_COMPAT)$(CONFIG_SANDBOX),y)
	@echo "===================== WARNING ======================"
	@echo "This board uses CONFIG_DM_I2C_COMPAT. Please remove"
	@echo "(possibly in a subsequent patch in your series)"
	@echo "before sending patches to the mailing list."
	@echo "===================================================="
endif
	@# Check that this build does not use CONFIG options that we do not
	@# know about unless they are in Kconfig. All the existing CONFIG
	@# options are whitelisted, so new ones should not be added.
	$(call cmd,cfgcheck,u-boot.cfg)

因此第一个all的含义就是 如果执行make的时候没有带任何其他目标,单独的一个make,那么_all作为顶层Makefile第一个目标,自然就成了默认执行的目标,而_all的依赖又是all,因此实际真正的执行的是上述代码中第(2)条

5. 参考

(1)uboot makefile里面的两个all:作用(伪目标,空命令)

posted on 2022-11-02 22:23  BSP-路人甲  阅读(292)  评论(0编辑  收藏  举报

导航