ILD

feeds internal
作者:Yuan Jianpeng 邮箱:yuanjp89@163.com
发布时间:2019-5-23 站点:Inside Linux Development

前面的文章已经大致了解了feeds是啥,本文对里面具体的东西进行分析。


./scripts/feeds update

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。


./script/feeds install

每个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。


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