在特定任务之后,如何告诉bitbake计算变量的basehash值?

时间:2019-04-29 22:06:44

标签: git yocto bitbake git-tag

在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如何处理?

2 个答案:

答案 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}"