前面的文章已经大致了解了feeds是啥,本文对里面具体的东西进行分析。
update分为两个阶段:第一个阶段是下载仓库,对于src-link就是建立一个链接;第二阶段是建立索引;
比如对于下述feeds:
1 2 | $ cat feeds.conf src-link luci ../../luci |
先创建feeds目录,然后第一步是创建luci链接到../../luci,这样下载就完成了。第二阶段搜集../../luci下面所有的包,建立索引,最终的产物如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | feeds ├── luci -> ../../luci ├── luci.index -> luci.tmp/.packageinfo ├── luci.targetindex -> luci.tmp/.targetinfo ├── luci.tmp │ ├── info │ │ ├── .files-packageinfo-26719 │ │ ├── .files-packageinfo.mk │ │ ├── .files-packageinfo.stamp │ │ ├── .files-packageinfo.stamp.b87ec84293ccb9d6001366de92bbd072 │ │ ├── .files-targetinfo-26719 │ │ ├── .files-targetinfo.mk │ │ ├── .files-targetinfo.stamp │ │ ├── .files-targetinfo.stamp.d41d8cd98f00b204e9800998ecf8427e │ │ ├── .overrides-packageinfo-26719 │ │ ├── .overrides-targetinfo-26719 │ │ ├── .packageinfo-applications_luci-app-adblock │ │ ├── .packageinfo-applications_luci-app-advanced-reboot │ │ ├── .packageinfo-applications_luci-app-ahcp │ ├── location │ ├── .packageinfo │ └── .targetinfo |
更新索引是执行下面的命令,由于scripts/feeds的update_index函数调用:
1 2 3 4 5 6 7 8 9 10 11 | make -s -f include/scan.mk IS_TTY=1 SCAN_TARGET=packageinfo \ SCAN_DIR=feeds/$name SCAN_NAME=package SCAN_DEPTH=5 \ SCAN_EXTRA="" TMP_DIR=${TOPDIR}/feeds/$name.tmp make -s -f include/scan.mk IS_TTY=1 SCAN_TARGET=targetinfo \ SCAN_DIR=feeds/$name SCAN_NAME=target SCAN_DEPTH=5 \ SCAN_EXTRA="" SCAN_MAKEOPTS="TARGET_BUILD=1" \ TMP_DIR=${TOPDIR}/feeds/$name.tmp ln -sf $name.tmp/.packageinfo ./feeds/$name.index ln -sf $name.tmp/.targetinfo ./feeds/$name.targetindex |
luci.tmp/.packageinfo 是所有包的详细信息。
luci.tmp/info/.files-packageinfo-26719 是所有包的路径列表
luci.tmp/info/.files-packageinfo.mk 每个包都有一条$(eval $(call PackageDir,applications_luci-app-dynapoint,applications/luci-app-dynapoint,))语句
luci.tmp/info/.packageinfo-protocols_luci-proto-pppossh 是单独每个每个包的详细信息。
对于target也是一样的。
理解了上面的知识我们就容易理解update的3个选项了:-a,-i,-f
-a 更新feeds.conf中所有的源。
-i 不执行第一步,只创建索引,如果我们已经执行过update了,且是src-link的方式,我们加了一个包,那么重新创建索引即可,这种情况可以使用-i选项。
-f是用在第一步的选项,比如源是git,如果工作区已经修改了,git pull执行update会失败,如果使用了-f选项,那么会尝试git reset --hard HEAD,然后再执行git pull。
每个package是一个目录,目录里面包含一个Makefile,当然一个Makefile里面可以定义多个Package,但是这里安装是针对目录来的,安装解析 feeds/luc.index文件。
比如下面是feeds/luci.index里面的一段,对于feeds/luci/applications/luci-app-adblock/Makefile
包的名字是Makefile所在的目录:luci-app-adblock,这里面可能有多个Package。对于某个feeds,不管每个包在feeds仓库中是几层路径,都安装在package/feeds/xxx/yyy,这里xxx是feeds.conf中的第二列,yyy就是Makefile所在的目录名。
比如luci-app-adblock在luci的二层,在applications下面,但是安装的时候,是直接安装在package/feeds/luci下面:
$ ls -l package/feeds/luci/luci-app-adblock
package/feeds/luci/luci-app-adblock -> ../../../feeds/luci/applications/luci-app-adblock
另外:安装任何包之前,get_installed函数会执行
make -s parepare-tmpinfo OPEN_BUILD=
来更新所有包的索引(包括已安装feeds),来获取已经安装的包,用来判断是否有同名包,是否替换。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | Source-Makefile: feeds/luci/applications/luci-app-adblock/Makefile Build-Depends: lua/host luci-base/host LUCI_CSSTIDY:csstidy/host Package: luci-app-adblock Submenu: 3. Applications Version: x-1 Depends: +libc +GCC_LIBSSP:libssp +USE_GLIBC:librt +USE_GLIBC:libpthread +adblock +luci-lib-jsonc Conflicts: Menu-Depends: Provides: Section: luci Category: LuCI Repository: base Title: LuCI support for Adblock Maintainer: Source: Type: ipkg Description: LuCI support for Adblock @@ Package: luci-i18n-adblock-es Default: LUCI_LANG_es||(ALL&&m) Version: x-1 Depends: +libc +GCC_LIBSSP:libssp +USE_GLIBC:librt +USE_GLIBC:libpthread luci-app-adblock Conflicts: Menu-Depends: Provides: Section: luci Category: LuCI Repository: base Title: luci-app-adblock - es translation Maintainer: Source: Type: ipkg Hidden: 1 Description: Translation for luci-app-adblock - Español (Spanish) |
从源码看-a只能安装package,不能安装target。