if_changed函数

http://t.zoukankan.com/idyllcheung-p-11591962.html

# Execute command if command has changed or prerequisite(s) are updated.
#
if_changed = $(if $(strip $(any-prereq) $(arg-check)),                       \
    @set -e;                                                             \
    $(echo-cmd) $(cmd_$(1));                                             \
    printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd)
  • any-prereq变量
    作用:存储比目标还要新的依赖文件不存在的依赖文件
    any-prereq = $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^),$^)
    $(filter-out $(PHONY),$?):将 $? 中的所有伪目标去掉,不然可能会将 FORCE 这种目标也带进来,如果此时返回非空,那么说明有比目标还要新的依赖文件。
    $(filter-out $(PHONY) $(wildcard $^),$^):$(wildcard $^) 匹配当前目录下的所有依赖文件(已经存在的),然后再使用 $(filter-out $(PHONY) $(wildcard $^),$^) 将伪目标以及当前目录下匹配的文件列表从整个 $^ 列表中删除,如果返回不为空,那么说明某些依赖文件不存在,也就是说这些不存在的依赖文件还没生成 -- 这是因为某些依赖文件需要在编译时才会生成。

  • arg-check变量

    ifneq ($(KBUILD_NOCMDDEP),1)
    # Check if both arguments has same arguments. Result is empty string if equal.
    # User may override this check using make KBUILD_NOCMDDEP=1
    arg-check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \
                    $(filter-out $(cmd_$@),   $(cmd_$(1))) )
    else
    arg-check = $(if $(strip $(cmd_$@)),,1)
    endif

打印结果KBUILD_NOCMDDEP为空,所以上面的脚本走的if分支。

arg-check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \
                    $(filter-out $(cmd_$@),   $(cmd_$(1))) )

uboot为例:

u-boot: $(u-boot-init) $(u-boot-main) u-boot.lds FORCE
    +$(call if_changed,u-boot__)

传入的参数$(1)就是u-boot__,$@就是u-boot。然后arg-check会对cmd_u-boot__与cmd_u-boot变量进行处理。

u-boot-init

u-boot-init := $(head-y)
head-y是定义在include arch/$(ARCH)/Makefile中,head-y := arch/arm/cpu/$(CPU)/start.o

u-boot-main

u-boot-main := $(libs-y)

libs-y: arch/arm/cpu/built-in.o arch/arm/cpu/armv8/built-in.o arch/arm/lib/built-in.o arch/arm/mach-rockchip/built-in.o board/rockchip/evb_rk3588/built-in.o cmd/built-in.o common/built-in.o disk/built-in.o drivers/built-in.o drivers/cpu/built-in.o drivers/dma/built-in.o drivers/gpio/built-in.o drivers/i2c/built-in.o drivers/mtd/built-in.o drivers/mtd/onenand/built-in.o drivers/mtd/spi/built-in.o drivers/net/built-in.o drivers/net/phy/built-in.o drivers/pci/built-in.o drivers/power/built-in.o drivers/power/battery/built-in.o drivers/power/charge/built-in.o drivers/power/domain/built-in.o drivers/power/dvfs/built-in.o drivers/power/fuel_gauge/built-in.o drivers/power/io-domain/built-in.o drivers/power/mfd/built-in.o drivers/power/pmic/built-in.o drivers/power/regulator/built-in.o drivers/serial/built-in.o drivers/spi/built-in.o drivers/usb/cdns3/built-in.o drivers/usb/common/built-in.o drivers/usb/dwc3/built-in.o drivers/usb/emul/built-in.o drivers/usb/eth/built-in.o drivers/usb/gadget/built-in.o drivers/usb/gadget/udc/built-in.o drivers/usb/host/built-in.o drivers/usb/musb-new/built-in.o drivers/usb/musb/built-in.o drivers/usb/phy/built-in.o drivers/usb/ulpi/built-in.o env/built-in.o fs/built-in.o lib/built-in.o net/built-in.o test/built-in.o test/dm/built-in.o

arg-check变量的值:/home/xinyi/android/code/Task1-debian/rk3588_source/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-ld.bfd -pie --gc-sections -Bstatic --no-dynamic-linker -Ttext 0x00200000 -o u-boot -T u-boot.lds arch/arm/cpu/armv8/start.o --start-group arch/arm/cpu/built-in.o arch/arm/cpu/armv8/built-in.o arch/arm/lib/built-in.o arch/arm/mach-rockchip/built-in.o board/rockchip/evb_rk3588/built-in.o cmd/built-in.o common/built-in.o disk/built-in.o drivers/built-in.o drivers/cpu/built-in.o drivers/dma/built-in.o drivers/gpio/built-in.o drivers/i2c/built-in.o drivers/mtd/built-in.o drivers/mtd/onenand/built-in.o drivers/mtd/spi/built-in.o drivers/net/built-in.o drivers/net/phy/built-in.o drivers/pci/built-in.o drivers/power/built-in.o drivers/power/battery/built-in.o drivers/power/charge/built-in.o drivers/power/domain/built-in.o drivers/power/dvfs/built-in.o drivers/power/fuel_gauge/built-in.o drivers/power/io-domain/built-in.o drivers/power/mfd/built-in.o drivers/power/pmic/built-in.o drivers/power/regulator/built-in.o drivers/serial/built-in.o drivers/spi/built-in.o drivers/usb/cdns3/built-in.o drivers/usb/common/built-in.o drivers/usb/dwc3/built-in.o drivers/usb/emul/built-in.o drivers/usb/eth/built-in.o drivers/usb/gadget/built-in.o drivers/usb/gadget/udc/built-in.o drivers/usb/host/built-in.o drivers/usb/musb-new/built-in.o drivers/usb/musb/built-in.o drivers/usb/phy/built-in.o drivers/usb/ulpi/built-in.o env/built-in.o fs/built-in.o lib/built-in.o net/built-in.o test/built-in.o test/dm/built-in.o --end-group -L /home/xinyi/android/code/Task1-debian/rk3588_source/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.3.1 -lgcc -Map u-boot.map; true

any-prereq变量的值:arch/arm/cpu/armv8/start.o arch/arm/cpu/built-in.o arch/arm/cpu/armv8/built-in.o arch/arm/lib/built-in.o arch/arm/mach-rockchip/built-in.o board/rockchip/evb_rk3588/built-in.o cmd/built-in.o common/built-in.o disk/built-in.o drivers/built-in.o drivers/cpu/built-in.o drivers/dma/built-in.o drivers/gpio/built-in.o drivers/i2c/built-in.o drivers/mtd/built-in.o drivers/mtd/onenand/built-in.o drivers/mtd/spi/built-in.o drivers/net/built-in.o drivers/net/phy/built-in.o drivers/pci/built-in.o drivers/power/built-in.o drivers/power/battery/built-in.o drivers/power/charge/built-in.o drivers/power/domain/built-in.o drivers/power/dvfs/built-in.o drivers/power/fuel_gauge/built-in.o drivers/power/io-domain/built-in.o drivers/power/mfd/built-in.o drivers/power/pmic/built-in.o drivers/power/regulator/built-in.o drivers/serial/built-in.o drivers/spi/built-in.o drivers/usb/cdns3/built-in.o drivers/usb/common/built-in.o drivers/usb/dwc3/built-in.o drivers/usb/emul/built-in.o drivers/usb/eth/built-in.o drivers/usb/gadget/built-in.o drivers/usb/gadget/udc/built-in.o drivers/usb/host/built-in.o drivers/usb/musb-new/built-in.o drivers/usb/musb/built-in.o drivers/usb/phy/built-in.o drivers/usb/ulpi/built-in.o env/built-in.o fs/built-in.o lib/built-in.o net/built-in.o test/built-in.o test/dm/built-in.o u-boot.lds

分类: rk3588_bmc

0 条评论

发表回复

您的电子邮箱地址不会被公开。