这个目标用来检索package和target,再tmp下面生成索引和配置信息。
定义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
生成并包含 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。