4文件下载支持
目录
4.3.2 HTTP/FTP wget fetcher ( http://, ftp://, https://)
4.3.4 Subversion (SVN) Fetcher ( svn://)
4.3.7 ClearCase Fetcher ( ccrc://)
4.3.8 Perforce Fetcher ( p4://)
BitBake 的 fetch 模块是一段独立的库代码,用于处理从远程系统下载源代码和文件的复杂性。获取源代码是构建软件的基石之一。因此,该模块构成了 BitBake 的重要组成部分。
当前的 fetch 模块称为“fetch2”,指的是它是 API 的第二个主要版本。原始版本已过时并已从代码库中删除。因此,在所有情况下,“fetch”在本手册中均指“fetch2”。
4.1下载(Fetch)
BitBake 在获取源代码或文件时需要执行几个步骤。fetcher 代码库按顺序处理两个不同的过程:从某处(缓存或其他方式)获取文件,然后将这些文件解压缩到特定位置,也许以特定方式。获取和解压文件后通常可选地进行修补。但是,此模块不包括修补。
执行这个过程的第一部分的代码,一个 fetch,看起来像下面这样:
src_uri = (d.getVar('SRC_URI') or "").split()
fetcher = bb.fetch2.Fetch(src_uri, d)
fetcher.download()
此代码设置 fetch 类的实例。该实例使用来自SRC_URI 变量的以空格分隔的 URL 列表,然后调用该download
方法来下载文件。
fetch 类的实例化后通常是:
rootdir = l.getVar('WORKDIR')
fetcher.unpack(rootdir)
此代码将下载的文件解压缩到指定的WORKDIR
.
注意
为方便起见,这些示例中的命名与 OpenEmbedded 使用的变量相匹配。如果您想查看上述代码的实际效果,请检查 OpenEmbedded 类文件base.bbclass
。
该SRC_URI和WORKDIR
变量没有硬编码到取出器,因为这些提取器的方法可以(是)调用不同的变量名。例如,在 OpenEmbedded 中,共享状态 (sstate) 代码使用 fetch 模块来获取 sstate 文件。
download()
调用该方法时,BitBake 尝试通过按特定搜索顺序查找源文件来解析 URL:
-
预镜像站点: BitBake 首先使用预镜像来尝试查找源文件。这些位置是使用PREMIRRORS变量定义的 。
-
源 URI:如果预镜像失败,BitBake 使用原始 URL(例如来自SRC_URI)。
-
镜像站点:如果发生获取失败,BitBake 接下来使用由MIRRORS变量定义的镜像位置。
对于传递给 fetcher 的每个 URL,fetcher 调用处理该特定 URL 类型的子模块。当您为SRC_URI变量提供 URL 时,这种行为可能会导致一些混乱。考虑以下两个 URL:
http://git.yoctoproject.org/git/poky;protocol=git
git://git.yoctoproject.org/git/poky;protocol=http
在前一种情况下,URL 被传递给wget
不理解“git”的fetcher。因此,后一种情况是正确的形式,因为 Git fetcher 确实知道如何使用 HTTP 作为传输。
以下是一些显示常用镜像定义的示例:
PREMIRRORS ?= "\
bzr://.*/.\* http://somemirror.org/sources/ \\n \
cvs://.*/.\* http://somemirror.org/sources/ \\n \
git://.*/.\* http://somemirror.org/sources/ \\n \
hg://.*/.\* http://somemirror.org/sources/ \\n \
osc://.*/.\* http://somemirror.org/sources/ \\n \
p4://.*/.\* http://somemirror.org/sources/ \\n \
svn://.*/.\* http://somemirror.org/sources/ \\n"
MIRRORS =+ "\
ftp://.*/.\* http://somemirror.org/sources/ \\n \
http://.*/.\* http://somemirror.org/sources/ \\n \
https://.*/.\* http://somemirror.org/sources/ \\n"
值得注意的是,BitBake 支持跨 URL。可以将 HTTP 服务器上的 Git 存储库镜像为 tarball。这就是git://
前面示例中的映射所做的。
由于网络访问速度较慢,BitBake 维护了从网络下载的文件的缓存。任何非本地源文件(即从 Internet 下载)都放置在下载目录中,该目录由DL_DIR变量指定。
文件完整性对于复制构建至关重要。对于非本地存档下载,fetcher 代码可以验证 SHA-256 和 MD5 校验和,以确保存档已正确下载。您可以通过使用带有适当 varflags的SRC_URI变量来指定这些校验和,如下所示:
SRC_URI[md5sum] = "value"
SRC_URI[sha256sum] = "value"
您还可以将校验和指定为SRC_URI上的参数,如下所示:
SRC_URI = "http://example.com/foobar.tar.bz2;md5sum=4a8e0f237e961fd7785d19d07fdb994d"
如果存在多个 URI,您可以像前面的示例一样直接指定校验和,也可以命名 URL。以下语法显示了如何命名 URI:
SRC_URI = "http://example.com/foobar.tar.bz2;name=foo"
SRC_URI[foo.md5sum] = 4a8e0f237e961fd7785d19d07fdb994d
下载文件并检查其校验和后,将在DL_DIR 中放置一个“.done”标记。BitBake 在后续构建期间使用此戳记,以避免再次下载或比较文件的校验和。
注意
假设本地存储不会损坏数据。如果不是这种情况,就会有更大的问题需要担心。
如果设置了BB_STRICT_CHECKSUM,则任何没有校验和的下载都会触发错误消息。该