在Bitbake配置中使用PREMIRRORS

时间:2018-10-23 02:43:56

标签: yocto bitbake openembedded

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

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

2 个答案:

答案 0 :(得分:5)

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

一个简单的例子

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

SRC_URI = "http://download.example.com:8080/foo/bar/baz-1.0.tar.gz"

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

PREMIRRORS_prepend = "http://download\.example\.com:8080/.* http://my-mirror.example.com/copies/\n"

在这种默认情况下(没有特殊的占位符),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

更改PREMIRRORS变量

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

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

PREMIRRORS_prepend = "http://original/location/.* http://alternate/location/\n"

我应该编辑什么文件?

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

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

其他问题

SOURCE_MIRROR_URL呢?

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

INHERIT += "own-mirrors"    
SOURCE_MIRROR_URL = "TYPE://mirror.local/PATH"

与写作相同:

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 \
"

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

WARNING: Invalid protocol in PREMIRRORS: ('cvs://.*/.*', 'TYPE://mirror.local/PATH')

如何检查和调试设置?

-D调试标志将使bitbake发出有关其尝试从哪些URL下载的信息。您还可以使用-C do_fetch,这将迫使它尝试执行“获取”步骤并重新下载给定食谱所需的任何内容。

bitbake -D -C do_fetch software-recipe-name-here

以下是一些示例调试输出,显示了它尝试访问的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

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

如果我想隔离端口号,例如http://host:123/foo

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

端口号位于HOSTMIRRORNAME内部,但是没有标准的机制可以将这些值分开。

答案 1 :(得分:0)

浮起来。如果我想隔离端口号怎么办? http://host:123/foo? 也许您可以使用捕获的。 喜欢:

org:“ http://somewhere.org:1234/somedir1/somedir2/somefile_1.2.3.tar.gz

reg:“ http://somewhere.org(:\ d +)?/.*”

子:“ http://somewhere2.org\1/somedir3

结果:“ http://somewhere2.org:1234/somedir3/somefile_1.2.3.tar.gz