Table of Contents

OpenWrt Feeds

在OpenWrt中,“feed”是一组共享相同位置的packages的集合。Feed可以位于远程服务器、版本控制系统、本地文件系统或任何其他通过支持的feed方法使用单个名称(路径/URL)寻址的位置。

Feed是OpenWrt Buildroot的额外预定义软件包构建配方。可以通过feed配置文件来配置它们,以支持自定义feed或非默认的feed软件包。

Feed Configuration

可用的feed列表是从存在的“feeds.conf”文件或者“feeds.conf.default”文件中进行配置。该文件包含一个feed列表,每个feed单独列在一行上。每个feed行由3个以空格分隔的组件组成:feed方法、feed名称和feed源。在解析过程中,空行、过多的空格/换行符和注释将被忽略。注释以“#“开头,延伸到行尾。

截至2018年12月15日的”master”分支上,“feeds.conf.default”中的默认配置如下所示。请注意,以“#“开头的行是注释行,为了方便配置而包含在内。

feeds.conf.default
src-git packages https://git.openwrt.org/feed/packages.git
src-git luci https://git.openwrt.org/project/luci.git
src-git routing https://git.openwrt.org/feed/routing.git
src-git telephony https://git.openwrt.org/feed/telephony.git
#src-git video https://github.com/openwrt/video.git
#src-git targets https://github.com/openwrt/targets.git
#src-git management https://github.com/openwrt-management/packages.git
#src-git oldpackages http://git.openwrt.org/packages.git
#src-link custom /usr/src/openwrt/custom-feed

git方法可以使用以下格式指定特定的分支或提交:

src-git local_feed_name https://example.com/repo_name/something.git;branch_name
src-git local_feed_name https://example.com/repo_name/something.git^commit_hash

截至目前,支持以下feed方法:

Method Function
src-bzr 数据使用”bzr”从源路径/URL下载。
src-cpy 数据从源路径复制。路径可以相对于OpenWrt存储库根目录或绝对路径来指定。
src-darcs 数据使用“darcs”从源路径/URL下载。
src-git 数据使用“git”作为浅层(深度为1)克隆从源路径/URL下载。
src-git-full 数据使用“git”作为完整克隆从源路径/URL下载。
src-gitsvn Subversion(SVN)仓库和Git之间的双向操作可以通过使用git-svn工具实现。
src-hg 数据使用“hg”从源路径/URL下载。
src-link 会创建一个指向源路径的符号链接。路径必须是绝对路径。
src-svn 数据使用“svn”从源路径/URL下载。

Feed名称用于标识feed,并作为创建用于保存有关feed信息的多个文件和目录名称的基础。Feed源是下载feed数据的位置。

对于上述依赖于支持“有限历史记录”选项的版本控制系统(例如git的“--depth=1”和bzr的“--lightweight”),将下载最小可用的历史记录。这是一个很好的默认设置,但是那些正在积极提交feed和/或使用提交历史记录的开发人员可能希望更改此行为。可以通过编辑“scripts/feeds”来使用“src-git-full”,或者在不使用“scripts/feeds”的情况下检出feed来完成此操作。可以通过使用“git fetch --unshallow”将浅层git克隆更新为“完整”克隆。

使用Feeds

截至2018年12月,feeds是由位于“openwrt/openwrt.git”存储库中的“scripts/feeds”脚本检索和管理的。“feeds”脚本将来自各种feed源的软件包整合到OpenWrt构建系统中。这是一个两步骤的过程,在构建镜像之前,开发人员通过更新feed,然后安装来自该feed的特定软件包。

在“update”步骤中,feeds从feed配置中列出的源获取,并复制到“feeds”目录中。成功更新后,每个feed中的每个软件包配方都在“feeds/<feed_name>/<package_name>/“文件夹中表示,但它们目前尚未包含在OpenWrt构建系统中,因为它们不在”package/“目录中。

在”install”步骤中,从“update”过程中获取的feeds中的软件包被链接到“package/feeds/<feed_name>“文件夹中,其中”<feed_name>“被替换为feed配置中的feed名称。完成此步骤后,可以通过在”package/“文件夹中使用软件包的路径来执行特定于软件包的make操作。例如:

make package/feeds/<feed_name>/<package_name>

$ ./scripts/feeds 
Usage: ./scripts/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)
	    -f :            List feeds in feeds.conf compatible format (when using -s).

	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.
	    -f :           Force updating feeds even if there are changed, uncommitted files.

	clean:             Remove downloaded/generated files.

Feed命令

可以通过”scripts/feeds”脚本来使用Feeds。调用“scripts/feeds”而不带任何参数会生成可用命令的列表。大多数命令需要本地可用的feed信息,因此通常需要先运行update命令。在下面的讨论中,术语“适用的软件包”通常指的是命令行上给出的软件包名称,或者在使用-a选项时指的是feed中的所有软件包。

Clean

clean命令会删除本地存储的feed数据,包括feed索引和feed中所有软件包的数据(但不会删除install命令创建的符号链接,这些链接将在update命令重新下载feed之前处于悬空状态)。这是通过删除“feeds”目录及其所有子目录来完成的。

安装

install命令安装适用的软件包以及适用软件包所依赖的任何软件包(包括直接依赖和构建依赖)。安装过程包括将“package/feeds/$feed_name/$package_name”创建为到“feeds/$feed_name/$package_name”的符号链接,以便在搜索“packages”目录层次结构时将软件包包含在配置过程中。

命令 描述
./scripts/feeds install -a 安装所有软件包(非必需;可以根据需要为构建速度较慢的机器逐个安装软件包)
./scripts/feeds install luci 仅安装LuCI软件包
./scripts/feeds install -a -p luci 通过从首选feed(-p)luci安装所有(-a)软件包来安装完整的LuCI WebUI

有关默认可用的feeds列表,请参阅上面的部分。

请注意,这取代了创建符号链接的旧方法,这个旧方法仍然可以在许多旧的论坛和用户组条目中找到。

列表

list命令从适用的feeds的索引文件中读取并显示每个feed中的软件包列表。索引文件存储在“feeds”目录中,文件名以feed的名称为后缀,后跟“.index”。该文件由update命令生成。

搜索

search命令通过读取feed元数据并列出与给定搜索条件匹配的软件包。

卸载

uninstall命令与install命令相反(尽管它不以任何方式处理依赖软件包)。它只是从“package/feeds”的子目录中删除对软件包的任何符号链接。

更新

当调用“scripts/feeds update”时,会将每个适用的feed从其源位置下载到“feeds”目录的子目录中,子目录的名称与feed名称相对应。然后,它会将feed中的软件包信息解析到由list和search命令使用的索引文件中。

命令 描述
./scripts/feeds update packages luci 检出packages和luci feeds。

请注意,update还会将feed的配置位置存储在“feeds/$feed_name.tmp/location”中,以便可以检测和适当处理配置的更改。

在检索后,下载的软件包需要进行“安装”。只有在安装后,它们才会在配置界面中可用!

自定义Feeds

好的,您已经开发了自己的软件包,现在您想通过make menuconfig来使用它,或者您正在开发一个软件包,并希望在尝试将其包含在OpenWrt之前在构建中进行测试。

解决方案是创建一个自定义feed。您可以创建一个全新的feed,或者使用一个标准feed的修改版本。

创建软件包目录

在本示例中,我们假设您的基本目录是“/home/user/openwrt”。

将您的软件包添加到现有的feed中

FIXME

将您的软件包添加到自己的feed中

在本示例中,我们假设您将您的feed命名为“custom”,您的项目名为“helloworld”,其OpenWrt的Makefile位于“/usr/src/openwrt/custom-feed/helloworld/Makefile”。

  1. 编辑 /home/user/openwrt/feeds.conf.default
  2. Add a new line for your feed.
    src-link custom /usr/src/openwrt/custom-feed/
  1. Update the feed: from the <buildroot dir> (e.g. /home/user/openwrt) do:
    ./scripts/feeds update custom
  2. And then install it
    ./scripts/feeds install -a -p custom

使用feed

  1. 现在,当您执行
    make menuconfig

    时,您的软件包应该可用。

解释

下载的源代码(在软件包的Makefile中引用)不在那里... 下载的文件首先以.gz文件的形式存储在<buildroot>/dl目录中。然后它们被解压到/build_dir目录中。例如,可以在<buildroot>/build_dir/target-*/目录下找到每个软件包源代码的子目录。

文档

  1. OpenWrt Buildroot – Feeds
  2. OpenWrt Buildroot – 技术参考 这篇文章需要您的关注。

链接