ILD

prepare-tmpinfo详解
作者:Yuan Jianpeng 邮箱:yuanjp89@163.com
发布时间:2021-3-15 站点:Inside Linux Development

这个目标用来检索package和target,再tmp下面生成索引和配置信息。

include/toplevel.mk

定义SCAN_COOKIE:SCAN_COOKIE?=$(shell echo $$$$)。


首先它通过下面两个recipe来扫描所有的package和target:

make -f include/scan.mk SCAN_TARGET="packageinfo" SCAN_DIR="package" SCAN_NAME="package" SCAN_DEPTH=5 SCAN_EXTRA=""


make -f include/scan.mk SCAN_TARGET="targetinfo" SCAN_DIR="target/linux" SCAN_NAME="target" SCAN_DEPTH=2 SCAN_EXTRA="" SCAN_MAKEOPTS="TARGET_BUILD=1"


生成package的配置

scripts/package-metadata.pl config tmp/.packageinfo > tmp/.config-package.in


生成target的配置

scripts/target-metadata.pl config tmp/.targetinfo > tmp/.config-target.in


生成

scripts/feeds feed_config > tmp/.config-feeds.in


生成

scripts/package-metadata.pl mk tmp/.packageinfo > tmp/.packagedeps

scripts/package-metadata.pl pkgaux tmp/.packageinfo > tmp/.packageauxvars

scripts/package-metadata.pl usergroup tmp/.packageinfo  > tmp/.packageusergroup


最后

touch tmp/.build


include/scan.mk

生成并包含 tmp/info/.files-packageinfo.mk,这个文件依赖Makefile列表文件:

tmp/info/.overrides-packageinfo-625049

tmp/info/.files-packageinfo-625049


路径后面的数字是SCAN_COOKIE的值。在SCAN_DIR里面,使用find命令,查找最大SCAN_DEPTH深度的Makefile,如果其内容包含GREP_STRING,就认为是要找的Makefile,将查找结果输出到.files-packageinfo-625049。对于target,GREP_STRING是BuildTarget,对于package是Build/DefaultTargets | BuildPackage | KernelPackage。


.files-packageinfo-625049的内容:

1
2
3
4
5
6
7
8
base-files
boot/arm-trusted-firmware-mediatek
boot/arm-trusted-firmware-mvebu
boot/arm-trusted-firmware-rockchip
boot/arm-trusted-firmware-sunxi
boot/arm-trusted-firmware-tools
boot/at91bootstrap
。。。


生成的 tmp/info/.files-packageinfo.mk 内容:

1
2
3
4
5
6
7
8
9
DEPS_package/firmware/linux-firmware/Makefile=*.mk
DEPS_package/kernel/linux/Makefile=modules/*.mk $(TOPDIR)/target/linux/*/modules.mk $(TOPDIR)/include/netfilter.mk
$(eval $(call PackageDir,base-files,base-files,))
$(eval $(call PackageDir,boot_arm-trusted-firmware-mediatek,boot/arm-trusted-firmware-mediatek,))
$(eval $(call PackageDir,boot_arm-trusted-firmware-mvebu,boot/arm-trusted-firmware-mvebu,))
$(eval $(call PackageDir,boot_arm-trusted-firmware-rockchip,boot/arm-trusted-firmware-rockchip,))
$(eval $(call PackageDir,boot_arm-trusted-firmware-sunxi,boot/arm-trusted-firmware-sunxi,))
$(eval $(call PackageDir,boot_arm-trusted-firmware-tools,boot/arm-trusted-firmware-tools,))
。。。


一个包的Makefile可能依赖其它Makefile,在Makefile中使用SCAN_DEPS变量定义,比如package/firmware/linux-firmware/Makefile就有这个定义:SCAN_DEPS = *.mk,在生成的tmp/info/.files-packageinfo.mk中会定义一个DEPS_<package path>的变量等于SCAN_DEPS。


 tmp/info/.files-packageinfo.mk就是DEPS_XXX的定义,表示那个包依赖哪些Makefile。还有就是所有的包的生成信息的语句:$(eval $(call PackageDir, ... )。PackageDir定义在scan.mk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
define PackageDir
  $(TMP_DIR)/.$(SCAN_TARGET): $(TMP_DIR)/info/.$(SCAN_TARGET)-$(1)
  $(TMP_DIR)/info/.$(SCAN_TARGET)-$(1): $(SCAN_DIR)/$(2)/Makefile $(foreach DEP,$(DEPS_$(SCAN_DIR)/$(2)/Makefile) $(SCAN_DEPS),$(wildcard $(if $(filter /%,$(DEP)),$(DEP),$(SCAN_DIR)/$(2)/$(DEP))))
        { \
                $$(call progress,Collecting $(SCAN_NAME) info: $(SCAN_DIR)/$(2)) \
                echo Source-Makefile: $(SCAN_DIR)/$(2)/Makefile; \
                $(if $(3),echo Override: $(3),true); \
                $(NO_TRACE_MAKE) --no-print-dir -r DUMP=1 FEED="$(call feedname,$(2))" -C $(SCAN_DIR)/$(2) $(SCAN_MAKEOPTS) 2>/dev/null || { \
                        mkdir -p "$(TOPDIR)/logs/$(SCAN_DIR)/$(2)"; \
                        $(NO_TRACE_MAKE) --no-print-dir -r DUMP=1 FEED="$(call feedname,$(2))" -C $(SCAN_DIR)/$(2) $(SCAN_MAKEOPTS) > $(TOPDIR)/logs/$(SCAN_DIR)/$(2)/dump.txt 2>&1; \
                        $$(call progress,ERROR: please fix $(SCAN_DIR)/$(2)/Makefile - see logs/$(SCAN_DIR)/$(2)/dump.txt for details\n) \
                        rm -f $$@; \
                }; \
                echo; \
        } > $$@.tmp
        mv $$@.tmp $$@
endef


它定义了一些依赖,以及如何生成tmp/info/.packageinfo-xxx

1
2
3
tmp/.packageinfo: tmp/info/.packageinfo-boot_arm-trusted-firmware-rockchip
tmp/info/.packageinfo-boot_arm-trusted-firmware-rockchip:
     make V=ss --no-print-dir -r DUMP=1 FEED="" -C package/boot/arm-trusted-firmware-rockchip


.packageinfo是通过重定向下面命令的输出到.packageinfo文件得到的:

make V=ss --no-print-dir -r DUMP=1 FEED="" -C package/base-files/


其实我们可以单独执行查看.packageinfo信息,只要加上TOPDIR环境变量即可了。

TOPDIR=/work/openwrt make V=ss --no-print-dir -r DUMP=1 FEED="" -C package/base-files/


对于target,也可以类似的得到.targetinfo,但是多了个参数TARGET_BUILD=1,这个参数是toplevel.mk通过SCAN_MAKEOPTS传入的,比如:

TOPDIR=/work/openwrt make V=ss --no-print-dir -r DUMP=1 FEED="" -C target/linux/ramips TARGET_BUILD=1


生成的一个包的.packageinfo内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Source-Makefile: package/base-files/Makefile
Build-Depends: usign/host ucert/host
 
Package: base-files
Version: 0-r16087+1-1d412235a5
Depends: +libc +USE_GLIBC:librt +USE_GLIBC:libpthread +netifd +jsonfilter +SIGNED_PACKAGES:usign +SIGNED_PACKAGES:openwrt-keyring +NAND_SUPPORT:ubi-utils +fstools +fwtool
Conflicts:
Menu-Depends:
Provides:
Section: base
Category: Base system
Title: Base filesystem for OpenWrt
Maintainer:
Source:
License: GPL-2.0
Type: ipkg
Description:  This package contains a base filesystem and system scripts for OpenWrt.
http://openwrt.org/
 
@@


最终目标是tmp/.packageinfo,PackageDir中,tmp/.packageinfo依赖于每个包的.packageinfo文件,并依赖于STMP文件tmp/info/.files-packageinfo.stamp,所以先生成所有包的.packageinfo文件,然后根据列表文件生成stamp和校验文件:tmp/info/.files-packageinfo.stamp.9f3effc0f07721f7b26eca3d95cc2f4c。最后,将所有的包的.packageinfo合并成tmp/.packageinfo。


Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.