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"