Я использую 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 не обновляется.