Как заставить bitbake вычислить значение базового хэша переменной после конкретной задачи? - PullRequest
0 голосов
/ 30 апреля 2019

В рецепте Yocto для ядра Linux мне нужно получить тег для самого последнего коммита в удаленном git-репозитории ядра Linux.Тег добавляется в версию для 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 во время сборки.

Есть ли способ указать битбакету вычислятьзначение basehash после задачи do_fetch?

Как это делается для SRCREV, когда для него установлено значение AUTOINC?

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Я переделал функцию с помощью "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}"
0 голосов
/ 01 мая 2019

Bitbake требует, чтобы хэши вычислялись во время разбора, а не изменялись. Вот как они работают, они должны быть вычислимы заранее.

Способ работы AUTOREV заключается в том, что во время разбора PV расширяется, что приводит к вызову в сборщик битбэков. Он может использовать вызовы "git ls-remote" для преобразования AUTOREV в конкретную ревизию, которая используется для остальной части сборки битбейка.

Ваш код просто не будет работать, например в каком каталоге он будет запускать "git fetch"? Хеш должен быть установлен в начальный разбор, когда WORKDIR не существует.

Если вы просто пытаетесь изменить выходную версию (а не тот, который использует битбейк для рецепта), взгляните на переменную PKGV.

...