在 Bitbake 配置中使用 PREMIRRORS
Using PREMIRRORS in Bitbake configuration
如何在 Bitbake 本地配置或配方中使用 PREMIRRORS
?
我想为一些慢速或无法访问的第三方 URL 提供我自己的下载位置,但 official PREMIRRORS
documentation 含糊不清且缺少示例。
注意:这些结果基于 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
路径元素,而是尝试仅从 [= 下载文件名21=]
高级示例
这些示例使用特殊的预定义占位符,将在下一节中详细介绍。
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 的正则表达式,然后是一个替换字符串,两部分由 [= 分隔151=].
Bitbake 按出现的顺序尝试它们,并且您通常希望您的私有镜像优先,因此在 PREMIRRORS
之前添加,例如:
PREMIRRORS_prepend = "http://original/location/.* http://alternate/location/\n"
我应该编辑什么文件?
您可以在 bitbake 食谱中向 PREMIRRORS
添加条目,但不推荐这样做,因为 PREMIRRORS
的主要用途是让人们在其他上下文或位置重复使用您的食谱。
相反,您可以将其放入现有构建目录中的 local.conf
文件中。或者,编辑 Poky 脚本在新构建目录中创建新 local.conf
时使用的源模板。
其他问题
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 \
"
如果在 local.conf
中使用 INHERIT
+SOURCE_MIRROR_URL
指令似乎仍然有效(与特定配方相反。)但是,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 内的匹配中捕获的文本。
端口号存在于 HOST
和 MIRRORNAME
中,但没有标准机制将这些值分开。
向上流动。如果我想隔离端口号怎么办,例如http://host:123/foo?
也许你可以使用捕获。
喜欢:
组织:“http://somewhere.org:1234/somedir1/somedir2/somefile_1.2.3.tar.gz”
reg: "http://somewhere.org(:\d+)?/.*"
子:“http://somewhere2.org/somedir3”
结果:“http://somewhere2.org:1234/somedir3/somefile_1.2.3.tar.gz”
如何在 Bitbake 本地配置或配方中使用 PREMIRRORS
?
我想为一些慢速或无法访问的第三方 URL 提供我自己的下载位置,但 official PREMIRRORS
documentation 含糊不清且缺少示例。
注意:这些结果基于 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
路径元素,而是尝试仅从 [= 下载文件名21=]
高级示例
这些示例使用特殊的预定义占位符,将在下一节中详细介绍。
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 的正则表达式,然后是一个替换字符串,两部分由 [= 分隔151=].
Bitbake 按出现的顺序尝试它们,并且您通常希望您的私有镜像优先,因此在 PREMIRRORS
之前添加,例如:
PREMIRRORS_prepend = "http://original/location/.* http://alternate/location/\n"
我应该编辑什么文件?
您可以在 bitbake 食谱中向 PREMIRRORS
添加条目,但不推荐这样做,因为 PREMIRRORS
的主要用途是让人们在其他上下文或位置重复使用您的食谱。
相反,您可以将其放入现有构建目录中的 local.conf
文件中。或者,编辑 Poky 脚本在新构建目录中创建新 local.conf
时使用的源模板。
其他问题
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 \
"
如果在 local.conf
中使用 INHERIT
+SOURCE_MIRROR_URL
指令似乎仍然有效(与特定配方相反。)但是,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 内的匹配中捕获的文本。
端口号存在于 HOST
和 MIRRORNAME
中,但没有标准机制将这些值分开。
向上流动。如果我想隔离端口号怎么办,例如http://host:123/foo? 也许你可以使用捕获。 喜欢:
组织:“http://somewhere.org:1234/somedir1/somedir2/somefile_1.2.3.tar.gz”
reg: "http://somewhere.org(:\d+)?/.*"
子:“http://somewhere2.org/somedir3”
结果:“http://somewhere2.org:1234/somedir3/somefile_1.2.3.tar.gz”