Прежде всего
Я работаю над созданием пользовательской сборки linux с помощью yocto.
В этой работе я часто получаю запросы типа
- Мне нужен список файлов, которые наследуются от определенного bbclass (например, core-image.bbclass).
- Мне нужно перечислить переменные (например, PE, PV, PR) для всех пакетов.
- Мне нужно перечислить файлы bbappend для определенного пакета (например, gcc).
Разве это не боль в заднице? Я не хочу искать в grep, и я не хочу собирать, потому что это занимает слишком много времени…
Давайте воспользуемся Bitbake из python.
Я думаю, что это боль в заднице, поэтому давайте изучим, как с этим что-то сделать. Прежде всего, механизм сборки командой bitbake выглядит примерно так.
Этот Tinfoil немного сложен, поэтому его нелегко использовать. Фактический код находится здесь. С другой стороны, IF между server_client определено довольно красиво здесь. Учитывая эти обстоятельства, кажется, что я должен сделать так, как показано ниже.
Если я сделаю этот bbclient на python, его будет легко использовать с языкового сервера и так далее.
Что я сделал
Основываясь на результатах проведенного исследования, bbclient, который я сделал, показан ниже.
https://pypi.org/project/bbclient/
Я также подготовил некоторую документацию.
- Спецификации IF
- Конкретный пример использования
Что вы можете сделать
Существует так много IF, что я не могу показать вам их все, но пока давайте попробуем реализовать пример использования, о котором я говорил в начале этой статьи.
Прежде всего, способ инициализации экземпляра bbclient показан ниже.
import bbclient
# Initialize bbclient instance
project_path: str = "/PATH/TO/POKY"
init_command: str = ". oe-init-build-env"
client: BBClient = BBClient(project_path, init_command)
# launch server
server_adder: str = "localhost"
server_port: int = 8081
client.start_server(server_adder, server_port)
# set event filter
ui_handler: int = client.get_uihandler_num()
client.set_event_mask(ui_handler, logging.DEBUG, {}, ["*"])
# paser recipes and create caches
ret = client.parse_files()
client.wait_done_async()
Вы можете использовать этот клиент для реализации каждого из следующих сценариев использования.
Мне нужен список файлов рецептов, которые наследуют определенный bbclass (например, core-image.bbclass).
ret: List[GetRecipeInheritsResult] = client.get_recipe_inherits()
recipes_inherit = [i for i in ret if "/PATH/TO/core-image.bbclass" in i.inherit_file_paths]
for i in recipes_inherit:
print(i.recipe_file_path)
Мне нужно, чтобы вы перечислили переменные (например, PE, PV, PR) со всеми пакетами.
ret: List[GetRecipesResult] = client.get_recipes()
for i in ret:
data_store_index: int = client.parse_recipe_file(i.recipe_files)
pe: Any = client.data_store_connector_cmd(data_store_index, "getVar", "PE")
pv: Any = client.data_store_connector_cmd(data_store_index, "getVar", "PE")
pr: Any = client.data_store_connector_cmd(data_store_index, "getVar", "PE")
print(pe, pv, pr)
Мне нужно, чтобы вы перечислили файлы bbappend для определенного пакета (например, gcc).
ret: List[str] = client.find_best_provider("gcc")
target_recipe_file_path: str = ret[3]
ret: List[str] = client.get_file_appends(target_recipe_file_path)
print(ret)
Вы также можете собирать образы из этого клиента и генерировать файлы taskdepends зависимостей.
Наконец, .
Если вы хотите попробовать, пожалуйста, используйте его!