一、错误出现点
错误出现在package-ipkg.mk CheckDependencies函数,这个函数的作用是通过gen-dependencies.sh脚本查找模块的依赖关系并将缺失的依赖库文件的路径记录在.missing文件中。并返回错误。
define CheckDependencies
@( \
rm -f $(PKG_INFO_DIR)/$(1).missing; \
( \
export \
READELF=$(TARGET_CROSS)readelf \
OBJCOPY=$(TARGET_CROSS)objcopy \
XARGS="$(XARGS)"; \
$(SCRIPT_DIR)/gen-dependencies.sh "$$(IDIR_$(1))"; \
) | while read FILE; do \
grep -qxF "$$$$FILE" $(PKG_INFO_DIR)/$(1).provides || \
echo "$$$$FILE" >> $(PKG_INFO_DIR)/$(1).missing; \
done; \
if [ -f "$(PKG_INFO_DIR)/$(1).missing" ]; then \
echo "Package $(1) is missing dependencies for the following libraries:" >&2; \
cat "$(PKG_INFO_DIR)/$(1).missing" >&2; \
false; \
fi; \
)
endef
二、.provides文件生成
同样在package-ipk.mk定义
其中IDIR_$(1):build_dir/targrt-xxx/ipkg-xxx/
@( \
find $$(IDIR_$(1)) -name lib\*.so\* -or -name \*.ko | awk -F/ '{ print $$$$NF }'; \
for file in $$(patsubst %,$(PKG_INFO_DIR)/%.provides,$$(IDEPEND_$(1))); do \
if [ -f "$$$$file" ]; then \
cat $$$$file; \
fi; \
done; $(Package/$(1)/extra_provides) \
) | sort -u > $(PKG_INFO_DIR)/$(1).provides
1、-name lib*.so* -or -name *.ko是find命令的选项,用于指定要匹配的文件名模式。这里查找以"lib"开头、以".so"结尾的文件,或者以".ko"结尾的文件。
2、|用于将find命令的输出作为输入传递给下一个命令。
3、awk -F/ '{ print $ $ $ $ NF }'是一个awk命令。它以/作为分隔符,将输入按字段拆分。$$$ $ NF表示通过将每个输入行的最后一个字段(文件名)打印出来。再次使用四个 $ 字符是为了转义$字符。
4、for file in …; do用于迭代一个列表中的每个元素,并将其赋值给变量file。
$ $( patsubst %, $ (PKG_INFO_DIR)/%.provides,$ $ (IDEPEND_$ (1)))是一个使用make函数patsubst的表达式。它将IDEPEND_$(1)中的每个元素,替换为 $ (PKG_INFO_DIR)/%.provides的形式,生成一个新列表。
$(…)表示在make中展开变量或执行命令。
简要说流程如下
1、IDEPEND_ $(1)这个文件列表转为xxx.provides这种类型。
2、并且会从staging_dir/target-xxx/pkginfo目录下读xxx.provides文件。
3、如果定义Package/ $(1)/extra_provides则运行。
4、排序输出的内容并生成目标provides。
总的来说这个函数会读staging_dir/target-xxx/pkginfo这个目录的.provides文件和IDEPEND_ $(1)这个文件列表的文件对比
三、
分析上面两个文件来说错误就显而易见了,在staging_dir/target-xxx/pkginfo目录下没有目标xxx.provides文件。
进一步原因是
1、目标模块未编译。
2、没有模块只依赖库
解决
1、编译目标模块。
2、定义Package/$(1)/extra_provides将需要的模块输出。