在Bitbake配置中使用PREMIRRORS

Dar*_*ien 4 openembedded bitbake yocto

如何PREMIRRORS在Bitbake本地配置或配方中使用?

我想为一些速度较慢或无法访问的第三方URL提供自己的下载位置,但是官方PREMIRRORS文档含糊不清,没有示例。

Dar*_*ien 7

注意:这些结果是基于对Yocto 2.3的实验,但也可能适用于2.5。

一个简单的例子

假设您的配方文件包含以下目标URL:

SRC_URI = "http://download.example.com:8080/foo/bar/baz-1.0.tar.gz"
Run Code Online (Sandbox Code Playgroud)

然后在中local.conf,您可以将自定义下载位置定义为:

PREMIRRORS_prepend = "http://download\.example\.com:8080/.* http://my-mirror.example.com/copies/\n"
Run Code Online (Sandbox Code Playgroud)

在这种情况下,默认情况下(没有特殊的占位符)BitBake的并没有包括附加/foo/bar路径元素,而是试图从刚刚下载的文件名http://my-mirror.example.com/copies/baz-1.0.tar.gz

进阶范例

这些样本使用特殊的预定义占位符,下一部分将对此进行详细说明。

具有相同文件结构的HTTP / HTTPS

  • 食谱: SRC_URI = "https://example.com:1234/foo/bar.zip"
  • 设置: PREMIRRORS_prepend = "http(s)?://example\.com(:\d+)?/.* http://mirror.local/PATH\n"
  • 尝试次数: http://mirror.local/foo/bar.zip

扁平结构的HTTP / HTTPS

  • 食谱: SRC_URI = "https://example.com:1234/foo/bar.zip"
  • 设置: PREMIRRORS_prepend = "http(s)?://example\.com(:\d+)?/.* http://mirror.local/MIRRORNAME\n"
  • 尝试次数: http://mirror.local/example.com.1234.foo.bar.zip

只需切换主机名

  • 食谱: SRC_URI = "ftp://example.com:1234/foo/bar.zip"
  • 设置: PREMIRRORS_prepend = "(\w+)://example\.com(:\d+)?/.* TYPE://mirror.local/PATH\n"
  • 尝试次数: ftp://mirrors.local/foo/bar.zip

替换URI中的占位符

PREMIRRORS解析所有匹配的URI,并在目标URI中提供五个特殊的占位符值。假设匹配的URI为http://host.example.com:1234/foo/bar/baz.txt

TYPE          https
HOST          host.example.com%3A1234
PATH          foo/bar/baz.txt
BASENAME      baz.txt
MIRRORNAME    host.example.com.1234.foo.bar.baz.txt
Run Code Online (Sandbox Code Playgroud)

改变PREMIRRORS变量

PREMIRRORS变量由一系列行(由分隔\n)组成,每行都有一个正则表达式以匹配URI,然后是替换字符串,两部分之间用空格分隔。

Bitbake按出现的顺序尝试它们,并且您通常希望您的私有镜像具有优先权,因此请添加到PREMIRRORS,例如:

PREMIRRORS_prepend = "http://original/location/.* http://alternate/location/\n"
Run Code Online (Sandbox Code Playgroud)

我应该编辑什么文件?

您可以PREMIRRORS在烘烤食谱的内部添加条目,但不建议这样做,因为的主要用途PREMIRRORS是人们在其他环境或位置重用您的食谱。

相反,您可以将其放在local.conf现有构建目录中的文件中。或者,local.conf在新的构建目录中创建新模板时,编辑Poky脚本使用的源模板。

其他问题

SOURCE_MIRROR_URL

SOURCE_MIRROR_URLPREMIRROR为所有支持的协议添加一系列条目的快速方法。例如,此设置:

INHERIT += "own-mirrors"    
SOURCE_MIRROR_URL = "TYPE://mirror.local/PATH"
Run Code Online (Sandbox Code Playgroud)

与写作相同:

PREMIRRORS_prepend = "\
cvs://.*/.*     TYPE://mirror.local/PATH \
svn://.*/.*     TYPE://mirror.local/PATH \
git://.*/.*     TYPE://mirror.local/PATH \
gitsm://.*/.*   TYPE://mirror.local/PATH \
hg://.*/.*      TYPE://mirror.local/PATH \ 
bzr://.*/.*     TYPE://mirror.local/PATH \
p4://.*/.*      TYPE://mirror.local/PATH \
osc://.*/.*     TYPE://mirror.local/PATH \ 
https?$://.*/.* TYPE://mirror.local/PATH \
ftp://.*/.*     TYPE://mirror.local/PATH \
npm://.*/?.*    TYPE://mirror.local/PATH \
"
Run Code Online (Sandbox Code Playgroud)

如果在您的命令中使用了INHERIT+ SOURCE_MIRROR_URL指令,它似乎仍然可以工作local.conf(相对于特定的配方)。但是,Bitbake会发出警告,因此它可能不是预期的用例。例如:

WARNING: Invalid protocol in PREMIRRORS: ('cvs://.*/.*', 'TYPE://mirror.local/PATH')
Run Code Online (Sandbox Code Playgroud)

如何检查和调试设置?

-D调试标志将导致bitbake发出什么网址,它试图从下载信息。您也可以使用-C do_fetch,这将迫使它尝试获取步骤并重新下载给定配方所需的任何内容。

bitbake -D -C do_fetch software-recipe-name-here
Run Code Online (Sandbox Code Playgroud)

这是一些调试输出示例,显示了PREMIRROR它尝试访问的URL:

DEBUG: some-software-1.0 do_fetch: Trying PREMIRRORS
DEBUG: some-software-1.0 do_fetch: Fetcher accessed the network with the command /usr/bin/env wget -t 2 -T 30 -nv --passive-ftp --no-check-certificate -P /home/user/build_foo/DL_DIR 'http://mirror.local/path/to/the/filename.ext
Run Code Online (Sandbox Code Playgroud)

如果您需要进行bitbake多次实验并运行PREMIRRORS_prepend,相对于修改,将新指令临时放入特定的测试食谱会更快local.conf。这是因为只要更改Bitbake,就无需重新解析所有其他配方。

如果我想隔离端口号http://host:123/foo怎么办?

显然,没有简单的方法可以单独获得123它。尽管PREMIRRORS允许您与正则表达式进行匹配,但它似乎不支持使用替换URI中的匹配中捕获的文本。

端口号位于HOST和中MIRRORNAME,但是没有标准机制可以将这些值分开。