Как работает область видимости в BitBake - PullRequest
0 голосов
/ 04 апреля 2020

Я использую Yocto, и мне было интересно, как переменная область видимости работает в рецепте BitBake:

Мой рецепт выглядит так:

SRC_URI += "file://something"

python do_fetch_prepend() {
    d.appendVar("SRC_URI", "https://www.bla.com/resource.tar")
    bb.error("SRC_URI_1: %s " % d.getVar("SRC_URI"))
    d.setVar("TEST_VAR", "test")
}

python do_unpack_append() {
    bb.error("SRC_URI_2: %s " % d.getVar("SRC_URI"))
    bb.error("TEST_VAR: %s " % d.getVar("TEST_VAR"))
}

Я запускаю bitbake -v - c unpack myrecipe

SRC_URI_1 печатается, как и ожидалось: «файл: // что-то https://www.bla.com/resource.tar» SRC_URI_2 печатается как: «файл: // что-то» TEST_VAR печатается как: нет

Похоже, установка / изменение переменной в хранилище данных (d) выполняется только в рамках do_fetch. Это ожидаемое поведение, потому что я прочитал в документации, что 'd' - это глобальная переменная.

Если это ожидаемое поведение, можно ли изменить глобальные переменные в задаче рецепта?

Причина вопроса в том, что мне нужен еще один встроенный рецепт, прежде чем я смогу добавить дополнительный URI в SRC_URI. Сначала я попробовал Inline Python Variable Expansion, но парсер BitBake уже расширил переменную до того, как собственный рецепт был помещен в «native directory». Поэтому я пытаюсь изменить SRC_URI во время задачи извлечения и загружаю свой собственный рецепт следующим образом:

python () {
  d.appendVarFlag('do_parse', 'depends', 'my-recipe-native:do_populate_sysroot')
}

В do_fetch_prepend я использую этот собственный рецепт, который дает мне правильный URL, который я хотел добавить к SRC_URI. Так что загрузка, распаковка, очистка и т. Д. c работает. Похоже, что я получаю работает, но распаковка не потому, что SRC_URI не обновляется.

1 Ответ

0 голосов
/ 05 апреля 2020

С данной задачей изменения переменных являются только локальными. Это означает, что do_unpack не «видит» изменения, внесенные задачей do_fetch.

Это необходимо для того, чтобы некоторые задачи могли быть перезапущены, когда другие покрыты sstate, чтобы гарантировать, что все определено c.

Если вы действительно хотите сделать то, что вы описываете, вам понадобится что-то вроде префикса c для задач, где вам нужно изменить SRC_URI.

python myprefunc() {
    d.appendVar("SRC_URI", "https://www.bla.com/resource.tar")
}
do_fetch[prefuncs] += "myprefunc"
do_unpack[prefuncs] += "myprefunc"

Однако обратите внимание, что пока это будет делать некоторые из того, что вам нужно, исходные архивы, манифесты лицензий и контрольные суммы состояния могут работать некорректно, поскольку вы «скрываете» исходные данные от битбейка, и эти данные присутствуют только во время выполнения задачи, а не во время анализа.

...