Я хотел бы динамически изменять некоторые переменные конфигурации относительно некоторых других. Для этого я добавил функцию Python (я не против использовать функцию оболочки, если так можно) в свой local.conf
файл:
# the variable I want to modify
PERSISTENT_BINDS += "${@add_persistent_binds(d)}"
def add_persistent_binds(d):
bb.plain("Path: edit persistent bind list")
binds = []
for entry in oe.data.typed_value("ENTRIES", d):
if not entry:
continue
ta, tb = line.split(None, 1)
binds.append("/data/sys/" + ta + " /" + tb + "\n")
return " ".join(binds)
К сожалению, Bitbake выдает ошибку при анализе строки определения функции:
bb.parse.ParseError: ParseError at /home/user/workspace/yocto/build/conf/local.conf:173: unparsed line: 'def add_persistent_binds(d):'
Например, ожидается, что следующий контент, установленный в ENTRIES
, создаст следующий контент, который будет добавлен в PERSISTENT_BINDS
:
ENTRIES ??= ""
ENTRIES[type] = "list"
ENTRIES[separator] = "\n"
ENTRIES = "\
foo bar\n\
dead beef\n\
"
PERSISTENT_BINDS = " \
...
/data/sys/foo /bar\n\
/data/sys/dead /beef\n\
"
ПРИМЕЧАНИЕ. Я не могу просто добавить это «как есть» в PERSISTENT_BINDS
, потому что переменная ENTRIES
используется в других местах для других целей.
Я не знаю, что именно вы пытаетесь сделать, но вот решение, как определить ваш новый собственный метод Python:
Если вы хотите добавить свою собственную библиотеку Python в Yocto, вы можете использовать новую функцию addpylib
: Ссылка
Пример:
meta-custom
└── lib
└── custom
└── __init__.py
Теперь в layer.conf
из meta-custom
вы добавляете:
addpylib ${LAYERDIR}/lib custom
Теперь в meta-custom/lib/custom/__init__.py
добавьте:
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
import bb
import oe
def add_persistent_binds(d):
bb.plain("Path: edit persistent bind list")
binds = []
for entry in oe.data.typed_value("ENTRIES", d):
if not entry:
continue
ta, tb = entry.split(None, 1)
binds.append("/data/sys/" + ta + " /" + tb + "\n")
return " ".join(binds)
В local.conf
сейчас:
ENTRIES ??= ""
ENTRIES[type] = "list"
ENTRIES[separator] = "\n"
ENTRIES = "\
foo bar\n\
dead beef\n\
"
# Call the custom function:
PERSISTENT_BINDS += "${@custom.add_persistent_binds(d)}"
Чтобы проверить это, запустите:
bitbake-getvar --value PERSISTENT_BINDS
Вы должны получить:
/data/sys/foo /bar
/data/sys/dead /beef
**** РЕДАКТИРОВАТЬ ****
Решение addpylib
работает только для версий >= 4.2.
Решение, которое приходит на ум, — создать класс и наследовать его глобально, чтобы local.conf
мог видеть пользовательскую функцию:
def add_persistent_binds(d):
bb.plain("Path: edit persistent bind list")
binds = []
for entry in oe.data.typed_value("ENTRIES", d):
if not entry:
continue
ta, tb = entry.split(None, 1)
binds.append("/data/sys/" + ta + " /" + tb + "\n")
return " ".join(binds)
Затем в свой local.conf
просто добавьте:
INHERIT += "custom"
PERSISTENT_BINDS += "${@add_persistent_binds(d)}"
ENTRIES ??= ""
ENTRIES[type] = "list"
ENTRIES[separator] = "\n"
ENTRIES = "\
foo bar\n\
dead beef\n\
"
И это должно сработать.
ПРИМЕЧАНИЕ. Помните, что INHERIT
inherit
s классы для всех рецептов, поэтому вы можете использовать метод add_persistent_binds
из любого рецепта.
Можете ли вы обновить ответ, чтобы указать, что поддержка addpylib
начинается с версии bitbake >= 2.4.0
Вы имеете в виду 4.2
? docs.yoctoproject.org/migration-guides/…
Возможно, Yocto 4.2, но исходный код Bitbake определенно 2.4.
Я добавил решение, смотрите EDIT
Большое спасибо, это работает как шарм! Я планирую перейти на scarthgap
, чтобы воспользоваться вашим оригинальным решением.
BitBake
просто анализирует переменные и определяет их тип: переменную или вызовPython
, затем извлекает вызов функции и использует функцию Pythoneval
для ее выполнения. Проверьте методbitbake/lib/bb/data_smart.py: def expandWithRefs(self, s, varname)
.