传统的Linux操作系统在编译某一个软件的时候,会检查其依赖软件及头文件是否存在,如果没有安装,则会报缺少头文件或缺少链接库等错误,编译将退出。这种机制使得开发者在编译一个软件之前,需要查找该软件所需的依赖库及头文件,并手动去安装这些软件。有时候碰到比较娇贵的软件时,嵌套式的安装依赖文件,会使得开发者头昏脑胀。OpenWrt通过引入feeds机制,很好地解决了这个问题。

feeds是OpenWrt开发所需要的软件包套件的工具及更新地址集合,这些软件包通过一个统一的接口地址进行访问。这样用户可以不用关心扩展包的存储位置,可以减少扩展软件包和核心代码部分的耦合。它由两部分组成,即扩展包位置配置文件feeds.conf.default和脚本工具feeds。目前在配置文件中保存最重要的扩展软件包集合有以下4个。

  • ‘LuCI’OpenWrt默认的Web浏览器图形用户接口。
  • ‘routing’一些额外的基础路由器特性软件,包含动态路由Quagga等。
  • ‘telephony’IP电话相关的软件包,例如freeswitch和Asterisk等。
  • ‘management’TR069等各种管理软件包。
    当我们下载了OpenWrt对应源码之后,进行如下操作:
    ./scripts/feeds update –a
    ./scripts/feeds install -a
    上述操作,就是利用feeds提供的接口将OpenWrt所需的全部扩展软件包进行下载并安装。在更新时,需要能够访问互联网。在下载之前可以通过查看“feeds.conf.default”文件,来检查哪些文件需要包含在编译环境中。feeds工具用法如下:
hzlarm@thingoo:~/chaos_calmer/scripts$ ./feeds
Usage: ./feeds <command> [options]

Commands:
        list [options]: List feeds, their content and revisions (if installed)
        Options:
            -n :            List of feed names.
            -s :            List of feed names and their URL.
            -r <feedname>:  List packages of specified feed.
            -d <delimiter>: Use specified delimiter to distinguish rows (default: spaces)

        install [options] <package>: Install a package
        Options:
            -a :           Install all packages from all feeds or from the specified feed using the -p option.
            -p <feedname>: Prefer this feed when installing packages.
            -d <y|m|n>:    Set default for newly installed packages.
            -f :           Install will be forced even if the package exists in core OpenWrt (override)

        search [options] <substring>: Search for a package
        Options:
            -r <feedname>: Only search in this feed

        uninstall -a|<package>: Uninstall a package
        Options:
            -a :           Uninstalls all packages.

        update -a|<feedname(s)>: Update packages and lists of feeds in feeds.conf .
        Options:
            -a :           Update all feeds listed within feeds.conf. Otherwise the specified feeds will be updated.
            -i :           Recreate the index only. No feed update from repository is performed.

        clean:             Remove downloaded/generated files.

update:下载在feeds.conf或feeds.conf.default文件中的软件包列表并创建索引。-a表示更新所有的软件包。只有更新后才能进行后面的操作。

list:从创建的索引文件“feed.index”中读取列表并显示。只有进行更新之后才能查看列表。

install:安装软件包以及它所依赖的软件包,从feeds目录安装到package目录,即在“package/feeds”目录创建软件包的软链接。只有安装之后,在后面执行“make menuconfig”时,才可以对相关软件包是否编译进行选择。
search:按照给定的字符串来查找软件包,需要传入一个字符串参数。
uninstall:卸载软件包,但它没有处理依赖关系,仅仅删除本软件包的软链接。
clean:删除update命令下载和生成的索引文件,但不会删除install创建的链接。

feeds代码处理过程是这样的:这个命令首先读取并解析feeds.conf配置文件,然后执行相应的命令,例如install时,将安装应用程序包和它所有直接或间接依赖的所有软件包。安装时将创建一个符号链接,从packages/feeds/$feed_name/$package_name指向feeds/$feed_name/$package_name, 这样在“make menuconfig”时,feeds的软件包就可以被处理到,就可以选择编译了。

用一句话来说,编译扩展安装过程就是将feeds目录下的软件包链接到packages/feeds对应目录下。可使用的feeds列表配置为feeds.conf或者feeds.conf.default。优先选择feeds.conf文件,这个文件包含了扩展安装源列表,每一行由3部分组成,包含feed方法、feed 名字和feed源。

下面是一个扩展安装源配置文件feeds.conf.default的内容。
1src-git packages https://github.com/openwrt/packages.git;for-15.05
2 src-git luci https://github.com/openwrt/luci.git;for-15.05
3 src-git routing https://github.com/openwrt-routing/packages.git;for-15.05
4 src-git telephony https://github.com/openwrt/telephony.git;for-15.05
5 src-git management https://github.com/openwrt-management/packages.git;for-15 .05
6 #src-git targets https://github.com/openwrt/targets.git
7 #src-git oldpackages http://git.openwrt.org/packages.git
8 #src-svn xwrt http://x-wrt.googlecode.com/svn/trunk/package
9 #src-svn phone svn://svn.openwrt.org/openwrt/feeds/phone
10 #src-svn efl svn://svn.openwrt.org/openwrt/feeds/efl
11 #src-svn xorg svn://svn.openwrt.org/openwrt/feeds/xorg
12 #src-svn desktop svn://svn.openwrt.org/openwrt/feeds/desktop
13 #src-svn xfce svn://svn.openwrt.org/openwrt/feeds/xfce
14 #src-svn lxde svn://svn.openwrt.org/openwrt/feeds/lxde
15 #src-link custom /usr/src/openwrt/custom-feed

我们可以修改该文件使编译时从自己指定的位置进行下载。主要支持feed方法的类型有以下3种:
src-cpy通过从数据源path拷贝数据
src-git通过使用Git从代码仓库地址下载代码数据。
src-svn通过使用SVN从代码仓库地址下载代码数据。
还有:
src-bzr通过使用bzr从数据源的path/URL下载数据
src-darcs通过使用darcs从数据源path/URL下载数据
src-hg通过使用hg从数据源path/URL下载数据
src-link创建一个数据源path的symlink

Logo

更多推荐