【Kbuild隐式规则】为什么没有 Makefile 规则却能生成 `.dtb` 文件?

解释如何通过隐式规则生成设备树文件,以及验证过程。对Linux内核的编译系统不太熟悉,特别是Kbuild的隐式规则。

首先,问题核心是:
使用命令生成tlimx8-evm.dtb时,为什么相关的Makefile中没有显式的规则,但编译却能成功。想知道背后的机制,以及如何验证这一点。

已经执行了source环境变量和make命令,并且删除了现有的dtb文件后重新编译,发现确实生成了文件,但Makefile中没有对应的条目。这引出了隐式规则的概念。需要解释Kbuild系统如何处理这种情况,特别是隐式规则如何自动触发。

接下来,我在scripts/Makefile.lib中寻找隐式规则,但直接grep可能没找到,因为规则可能使用了变量或更复杂的路径定义。需要说明预处理步骤和实际调用的dtc命令,以及如何通过V=1参数查看详细输出,确认隐式规则的存在。

然后,对比了有无V=1参数的区别,这显示了详细的编译步骤,证明隐式规则的存在。需要总结这些步骤,并解释每个步骤的作用,特别是预处理和dtc编译的过程。

最后,可能仍然困惑为什么Makefile中没有显式规则,但编译却能成功,需要强调隐式规则的工作原理,以及为何这种设计能简化Makefile的维护,同时允许灵活编译。

为什么没有 Makefile 规则却能生成 .dtb 文件?


1. 问题背景

我的操作
执行了 source /home/tronlong/SDK/environment-setup-aarch64-poky-linux(设置交叉编译环境)和 make freescale/tlimx8-evm.dtb(编译设备树文件)。
我的疑问
明明 arch/arm64/boot/dts/freescale/Makefile 中没有

# # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # include $(TOPDIR)/rules.mk -include $(TOPDIR)/.config ARCH:=$(CONFIG_ARCH) BOARD:=AX615 BOARDNAME:=AX615 ref boards FEATURES:=squashfs CFLAGS:=$(subst ",,$(CONFIG_DEFAULT_TARGET_OPTIMIZATION)) SUBTARGETS:=AX615 LINUX_VERSION:=4.19.125 CROSS_COMPILE=$(CONFIG_TOOLCHAIN_PREFIX) # 芯片方案的默认串口设备,用于inittab TARGET_CONSOLE:=ttyS0 include $(INCLUDE_DIR)/target.mk T_DTS_CONFIG_DIR := $(T_PRODUCT_CONFIG_DIR)/$(PR_NAME)/dts KERNEL_DIR_NAME_ := linux-4.19.125 HOME_PATH_ := $(LINUX_DIR)/.. BUILD_PATH_ := $(HOME_PATH_)/build PROJECT_ := $(CONFIG_AX_PROJECT) PROJECT := $(PROJECT_) CONFIG_ARCH_AXERA := y CONFIG_ := axera_$(PROJECT_)_defconfig KBUILD_OUTDIR_ := $(BUILD_PATH_)/out/$(PROJECT_)/objs/kernel/linux/$(KERNEL_DIR_NAME_) KBUILD_OUTKODIR_ := $(BUILD_PATH_)/out/$(PROJECT_)/objs/kernel/linux/ko IMAGE_OUTDIR := $(BUILD_PATH_)/out/$(PROJECT_)/images TARGET_BOARD := $(subst ",,$(CONFIG_TARGET_BOARD)) -include $(T_PRODUCT_CONFIG_DIR)/$(PR_NAME)/build/projects/$(PROJECT_)/project.mak DTS_RESERVE_MEM_FILE := AX620E_reserve_mem_define.h DTS_RESERVE_MEM_PATH := $(LINUX_DIR)/include/dt-bindings/memory AXERA_SCRIPT_PATH := $(LINUX_DIR)/scripts/axera PATCH_RESERVE_MEM_SCRIPT := $(AXERA_SCRIPT_PATH)/patch_reserve_mem.sh IS_ATF_FIRMWARE := ATF ATF_RES_START := $(ATF_IMG_ADDR) ATF_RES_SIZE := $(ATF_IMG_PKG_SIZE) #EXT_FLAG := O=$(KBUILD_OUTDIR_) HOME_PATH=$(HOME_PATH_) PROJECT=$(PROJECT_) EXT_FLAG := PROJECT=$(PROJECT_) #EXT_FLAG := export CONFIG_ARCH_AXERA export PROJECT SIGN_DIR := $(KERNEL_BUILD_DIR)/imgsign SIGN_SCRIPT := $(SIGN_DIR)/sec_boot_AX620E_sign.py IMAGE_UNCOMPRESSED := Image IMAGE_COMPRESSED_UNSIGNED := $(IMAGE_UNCOMPRESSED).lzma IMAGE_COMPRESSED_SIGNED := $(IMAGE_COMPRESSED_UNSIGNED)_signed PUB_KEY := $(SIGN_DIR)/public.pem PRIV_KEY := $(SIGN_DIR)/private.pem SIGN_PARAMS := -cap 0x54FAFE -key_bit 2048 define Kernel/Prepare/Default @echo -e "Kernel/Prepare/Default" mkdir -p $(KBUILD_OUTDIR_) endef define Kernel/Configure/Default @echo -e "Kernel/Configure/Default" $(info xmhc here: LINUX_DIR: $(LINUX_DIR)) if [ ! -e $(LINUX_DIR)/Makefile ];then rm -rf $(LINUX_DIR)/* && $(CP) $(CONFIG_EXTERNAL_KERNEL_TREE)/. $(LINUX_DIR)/; fi @$(CP) $(TOPDIR)/product_config/$(PR_NAME)/kernel.config $(LINUX_DIR)/.config @grep "^IMG_" $(TOPDIR)/product_config/$(PR_NAME)/device_info.config | sed -e "s/IMG_/CONFIG_IMG_/g" -e "s/ //g" >> $(LINUX_DIR)/.config @$(CP) $(T_PRODUCT_CONFIG_DIR)/$(PR_NAME)/build/projects $(LINUX_DIR)/ @$(CP) $(T_DTS_CONFIG_DIR)/* $(LINUX_DIR)/ if [ -d $(SIGN_DIR) ]; then rm -rf $(SIGN_DIR); fi @mkdir -p $(SIGN_DIR) @$(CP) $(TOPDIR)/../sdk/soc/$(CONFIG_TARGET_BOARD)/build/tools/imgsign/* $(SIGN_DIR)/ -rf @$(CP) $(TOPDIR)/../sdk/soc/$(CONFIG_TARGET_BOARD)/tools/imgsign/* $(SIGN_DIR)/ -rf if [ ! -d $(LINUX_DIR)/transplant/include ]; then mkdir -p $(LINUX_DIR)/transplant/include/; fi @$(CP) $(TOPDIR)/../sdk/soc/$(CONFIG_TARGET_BOARD)/mpp/ax620q/include/* $(LINUX_DIR)/transplant/include/ -rf @touch $(LINUX_DIR)/.configured # @touch $(LINUX_DIR)/.image endef define Kernel/CompileModules/Default @echo -e "Kernel/CompileModules/Default" @rm -f $(LINUX_DIR)/.configured @$(CP) $(DTS_RESERVE_MEM_PATH)/$(DTS_RESERVE_MEM_FILE) $(DTS_RESERVE_MEM_PATH)/$(DTS_RESERVE_MEM_FILE)_bak if [ "$(strip $(SUPPORT_ATF))" == "TRUE" ]; then bash $(PATCH_RESERVE_MEM_SCRIPT) -o $(DTS_RESERVE_MEM_PATH)/$(DTS_RESERVE_MEM_FILE) -a $(ATF_RES_START) -s $(ATF_RES_SIZE) -t $(IS_ATF_FIRMWARE); fi @bash $(PATCH_RESERVE_MEM_SCRIPT) -o $(DTS_RESERVE_MEM_PATH)/$(DTS_RESERVE_MEM_FILE) -p $(SUPPORT_ATF) if [ "$(strip $(SUPPORT_KERNEL_BOOTARGS))" == "TRUE" ]; then bash $(PATCH_RESERVE_MEM_SCRIPT) -o $(DTS_RESERVE_MEM_PATH)/$(DTS_RESERVE_MEM_FILE) -b $(KERNEL_BOOTARGS) -t DTB; fi @bash $(PATCH_RESERVE_MEM_SCRIPT) -o $(DTS_RESERVE_MEM_PATH)/$(DTS_RESERVE_MEM_FILE) -c $(CMM_POOL_PARAM) -t CMM if [ "$(strip $(SUPPORT_RECYCLE_CMM))" == "TRUE" ]; then bash $(PATCH_RESERVE_MEM_SCRIPT) -o $(DTS_RESERVE_MEM_PATH)/$(DTS_RESERVE_MEM_FILE) -a $(CMM_RECYCLE_START) -s $(CMM_RECYCLE_SIZE) -t RECYCLE_CMM; fi @$(MAKE) -C $(LINUX_DIR) ARCH=$(ARCH) CROSS_COMPILE=$(KERNEL_CROSS) $(EXT_FLAG) dtbs @$(CP) $(LINUX_DIR)/arch/$(ARCH)/boot/dts/axera/$(PROJECT_).dtb $(KERNEL_BUILD_DIR)/ @$(LINUX_DIR)/ax_gzip -9 $(KERNEL_BUILD_DIR)/$(PROJECT_).dtb @ rm -f $(KERNEL_BUILD_DIR)/$(PROJECT_).dtb @python3 $(SIGN_SCRIPT) -i $(KERNEL_BUILD_DIR)/$(PROJECT_).dtb.axgzip -pub $(PUB_KEY) -prv $(PRIV_KEY) -o $(KERNEL_BUILD_DIR)/$(PROJECT_).dtb $(SIGN_PARAMS) @mv $(KERNEL_BUILD_DIR)/$(PROJECT_).dtb $(KERNEL_BUILD_DIR)/_my_$(PROJECT_).dtb @$(CP) $(KERNEL_BUILD_DIR)/_my_$(PROJECT_).dtb $(KERNEL_BUILD_DIR)/my_$(PROJECT_).dtb # @$(LINUX_DIR)/myfill $(KERNEL_BUILD_DIR)/my_$(PROJECT_).dtb 512K @$(LINUX_DIR)/myfill $(KERNEL_BUILD_DIR)/my_$(PROJECT_).dtb $(DTB_PARTITION_SIZE) @$(CP) $(DTS_RESERVE_MEM_PATH)/$(DTS_RESERVE_MEM_FILE)_bak $(DTS_RESERVE_MEM_PATH)/$(DTS_RESERVE_MEM_FILE) @$(RM) $(DTS_RESERVE_MEM_PATH)/$(DTS_RESERVE_MEM_FILE)_bak @$(MAKE) -C $(LINUX_DIR) ARCH=$(ARCH) CROSS_COMPILE=$(KERNEL_CROSS) $(EXT_FLAG) $(IMAGE_UNCOMPRESSED) -j8 @$(MAKE) -C $(LINUX_DIR) ARCH=$(ARCH) CROSS_COMPILE=$(KERNEL_CROSS) M= modules $(EXT_FLAG) @$(KERNEL_CROSS)objcopy -O binary $(OBJCOPY_STRIP) -S $(LINUX_DIR)/vmlinux $(LINUX_KERNEL) @$(KERNEL_CROSS)objcopy $(OBJCOPY_STRIP) -S $(LINUX_DIR)/vmlinux $(KERNEL_BUILD_DIR)/vmlinux.elf @$(CP) $(LINUX_DIR)/arch/$(ARCH)/boot/$(IMAGE_UNCOMPRESSED) $(KERNEL_BUILD_DIR)/ # @$(LINUX_DIR)/ax_gzip -9 $(KERNEL_BUILD_DIR)/$(IMAGE_UNCOMPRESSED) @$(RM) $(KERNEL_BUILD_DIR)/$(IMAGE_COMPRESSED_UNSIGNED) @/usr/bin/lzma -k $(KERNEL_BUILD_DIR)/$(IMAGE_UNCOMPRESSED) @python3 $(SIGN_SCRIPT) -i $(KERNEL_BUILD_DIR)/$(IMAGE_COMPRESSED_UNSIGNED) -pub $(PUB_KEY) -prv $(PRIV_KEY) -o $(KERNEL_BUILD_DIR)/$(IMAGE_COMPRESSED_SIGNED) $(SIGN_PARAMS) @$(CP) $(KERNEL_BUILD_DIR)/$(IMAGE_COMPRESSED_SIGNED) $(LINUX_DIR)/../_uImage.xz @$(LINUX_DIR)/myfill $(KERNEL_BUILD_DIR)/$(IMAGE_COMPRESSED_SIGNED) $(KERNEL_IMAGE_SIZE) @cat $(KERNEL_BUILD_DIR)/my_$(PROJECT_).dtb $(KERNEL_BUILD_DIR)/$(IMAGE_COMPRESSED_SIGNED) > $(LINUX_DIR)/../uImage.xz @$(CP) $(LINUX_DIR)/myfill $(KERNEL_BUILD_DIR)/ endef define Kernel/Clean @echo "Kernel/Clean" @rm -rf $(KBUILD_OUTDIR_)/arch/$(ARCH)/boot/dts/axera/*.dtb @$(MAKE) -C $(LINUX_DIR)/ clean $(EXT_FLAG) @$(MAKE) -C $(LINUX_DIR)/ mrproper $(EXT_FLAG) @rm -rf $(KBUILD_OUTDIR_) endef define Kernel/CompileImage @echo "Kernel/CompileImage" endef # DEFAULT_PACKAGES += define Target/Description Build firmware images for AX615 based boards. endef $(eval $(call BuildTarget)) LINUX_DIR是哪里定义的
09-25
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值