在Linux内核的Yocto食谱中,我需要获取远程Linux内核git存储库中最新提交的标签。该标签将附加到Linux版本。我遇到的问题是(在保留标签的变量中)basehash值在构建过程中发生了变化,并且出现了bitbake错误:
(...) the basehash value changed from 24896f703509afcd913bc2d97fcff392 to 2d43ec8fdf53988554b77bef20c6fd88. The metadata is not deterministic and this needs to be fixed.
这是我在配方中使用的代码:
def get_git_tag(git_repo):
import subprocess
print(git_repo)
try:
subprocess.call("git fetch --tags", cwd=p, shell=True)
tag = subprocess.Popen("git describe --exact-match 2>/dev/null", cwd=p, shell=True, stdout=subprocess.PIPE, universal_newlines=True).communicate()[0].rstrip()
return tag
except OSError:
return ""
KERNEL_LOCALVERSION = "-${@get_git_tag('${S}')}"
KERNEL_LOCALVERSION[vardepvalue] = "${KERNEL_LOCALVERSION}"
do_configure[vardeps] += "KERNEL_LOCALVERSION"
新提交后,代码在首次构建时失败。第二代还可以。失败的原因是,basehash值首先在不再存在的旧本地克隆(S变量)上计算,然后在新克隆上计算,并且在构建过程中更改了basehash值。
在do_fetch任务之后,有没有办法告诉bitbucket计算basehash值?
设置为AUTOINC时,SRCREV如何处理?
答案 0 :(得分:0)
Bitbake要求在解析时计算哈希,并且不能更改。它们就是这样工作的,它们必须预先计算。
AUTOREV的工作方式是在解析时扩展PV,从而导致调用bitbake提取程序。能够使用“ git ls-remote”调用将AUTOREV解析为特定的修订版,该修订版将用于其余的bitbake构建。
您输入的代码根本无法使用,例如要在哪个目录中运行“ git fetch”?需要在WORKDIR不存在时的初始解析时设置哈希值。
如果您只是想更改输出版本(而不是配方中的一次烘烤),请查看PKGV变量。
答案 1 :(得分:0)
我使用不需要本地存储库的“ git ls-remote”对该功能进行了重新设计。
def get_git_tag(d):
import subprocess
try:
uri = d.getVar('SRC_URI').split()
branch = d.getVar('BRANCH')
http_url = ""
for u in uri:
if u[:3] == "git":
http_url = "http" + u.split(';')[0][3:]
break
cmd = " ".join(["git ls-remote --heads", http_url, "refs/heads/" + branch])
current_head = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, universal_newlines=True).communicate()[0].split()[0]
cmd = " ".join(["git ls-remote --tags", http_url, "| grep", current_head])
tag = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, universal_newlines=True).communicate()[0].split()[-1]
tag = tag.replace("refs/tags/", "")
tag = tag.replace("^{}", "")
except:
tag = ""
return tag
KERNEL_LOCALVERSION = "${@get_git_tag(d)}"
KERNEL_LOCALVERSION[vardepvalue] = "${KERNEL_LOCALVERSION}"