yocto的文件下载支持介绍

bitbake的下载模块是一个独立的下载库。

主要是从各种源地址下载源码。

当前的主要版本你是fetch2.也就是第二个版本。以下所说的fetch都是指的这个版本的。


bitbake通过几步来获取源代码或者文件。主要按顺序处理两个不同的步骤。

1主要是先从某个地方(缓存或者其他地方)获取源码,2然后将源码解压到特定的位置或者指定的位置。

通常解压完毕后是打补丁。本部分不涉及到打补丁。

处理第1部分的代码类似如下

src_uri = (d.getVar('SRC_URI', True) or "").split()
fetcher = bb.fetch2.Fetch(src_uri, d)
fetcher.download()
从BB文件的SRC_URI变量获取具体的下载地址

使用SRC_URI变量 产生一个 下载器,调用fetcher实现下载

处理第2部分的代码类似如下

 rootdir = l.getVar('WORKDIR', True)
 fetcher.unpack(rootdir)
通常下载好的文件会指定解压到WORKDIR目录中取。


SRCURI和WORKDIR变量不是硬编码到fetcher里面的。因为fetcher的方式可能是多种多样的。

比如OE的共享状态代码(sstate 主要是指已经编译过的)使用fetch模块获取sstate文件

当download()方法调用的时候。bitbake尝试使用下面的搜索顺序来解决URL

1 pre-mirror sites 首先使用预镜像地址来取得源码。这些位置定义在PREMIRRORS变量中

类似于

PREMIRRORS ??= "\
bzr://.*/.*   http://downloads.yoctoproject.org/mirror/sources/ \n \
cvs://.*/.*   http://downloads.yoctoproject.org/mirror/sources/ \n \
git://.*/.*   http://downloads.yoctoproject.org/mirror/sources/ \n \
gitsm://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n \
hg://.*/.*    http://downloads.yoctoproject.org/mirror/sources/ \n \
osc://.*/.*   http://downloads.yoctoproject.org/mirror/sources/ \n \
p4://.*/.*    http://downloads.yoctoproject.org/mirror/sources/ \n \
svn://.*/.*   http://downloads.yoctoproject.org/mirror/sources/ \n"


2 如果pre-mirror sites下载失败

那么再使用 SRC_URI地址来下载


3如果下载还是失败。尝试使用镜像来下载。

MIRRORS =+ "\
ftp://.*/.*      http://downloads.yoctoproject.org/mirror/sources/ \n \
http://.*/.*     http://downloads.yoctoproject.org/mirror/sources/ \n \
https://.*/.*    http://downloads.yoctoproject.org/mirror/sources/ \n"


对于不同的URL,fetcher调用不同的子模块来处理。可能会遇到下列的问题。

比如

http://git.yoctoproject.org/git/poky;protocol=git
git://git.yoctoproject.org/git/poky;protocol=http
前一种情况下。http打头的会被传递给wget fetcher,但是wget不懂得proto=git怎么使用

因此。后一种才是正确的方式。后一种会被传递给git fetcher,git知道如何使用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是支持cross-url的。可以镜像一个git仓库到一个http服务器上作为一个压缩包。

bitbake维护了一系列从网络下载的文件的缓存,所有非本地的文件都被放置在了download directory。这个目录通过DL_DIR指定

同时文件的完整性是很有必要的。对于非本地的文档下载fetcher代码可以通过验证sha-256和MD5checksum来确定文档被准确下载了。

可以通过SRC_URI变量来指定合适的值。

比如

SRC_URI[md5sum] = "value"
SRC_URI[sha256sum] = "value"
 
  
也可以在SRC_URL的尾部指定校验值
 
  
SRC_URI = "http://example.com/foobar.tar.bz2;md5sum=4a8e0f237e961fd7785d19d07fdb994d"
如果存在多个下载URL,可以通过上面直接在末尾指定md5sum的方式,也可以命名这个url,然后指定名字的md5。如下
 
  
     SRC_URI = "http://example.com/foobar.tar.bz2;name=foo"

SRC_URI[foo.md5sum] = 4a8e0f237e961fd7785d19d07fdb994d

一旦下载校验完毕。bitbake就会使用这个.done标记放在DL_DIR里面。bitbake用这个标记来识别,避免后续重新下载或者计算checksum

如果BB_STRICT_CHECKSUM标识设置了。任何没有checksum的下载都会触发一个错误。BB_NO_NETWORK变量能够使得任何访问网络的行为造成错误,在检查镜像以及其他东西的完整性方面是很有帮助的。

可以在local.conf中指定

 BB_NO_NETWORK = "1" 

4.2

解压部分。对于非GIT的url。bitbake使用通用的解压方式。

可以在URL中指定大量的参数来管理解压步骤的行为。

unpack标记 。控制这个URL组件是否被解压。默认设置为1 如果设置为1这个组件被解压。如果设置为0,这个组件不解压,如果你想拷贝这个文档而且不解压的时候是比较有用的。

dos标记 应用到.zip和.jar文件上指定是否在文本文件上使用DOS形式的结尾,(应该是换行的时候使用\r\n或者\n这样的)

basepath标记 在解压的时候指定排除掉某个目录(是否准确?有待验证研究)

subdir 指定解压这个包到root目录下的子目录

解压过程会自动调用解压后缀名为.Z.z.gz.xz.zip.jar.ipk.rpm等等已知的压缩包

gitfetcher有自己的优化解压方式来处理git tree。基本上是通过克隆这个树到最终的目录。这个方式使用引用的方式,因此只有一个源码树的拷贝。

4.3 fetchers

前面提到了源码包的URL前缀决定了使用哪个fetcher模块。每个模块可以支持不同的URL参数类型。

4.3.1 本地文件获取器(file://)

本模块处理以file://开头的URLs.文件名指定的URL可以是一个相对或者绝对路径。如果文件名是相对的。那么FILESPATH变量和系统PATH变量都会用来查找这个文件。

如果FILESPATH和PATH没有找到,那么FILESDIR被用来查找这个合适的相对文件,由于FILESDIR将被遗弃了,所以不要使用)

如果这个文件不能找到。那么假定在变量DL_DIR指定的目录中。

如果你指定的是一个目录。那么整个目录都将被被解压缩。

以下是两个例子

SRC_URI = "file://relativefile.patch"
SRC_URI = "file:///Users/ich/very_important_software"




你可能感兴趣的:(yocto)