Давайте использовать команды bitbake из python!


Прежде всего

Я работаю над созданием пользовательской сборки 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 зависимостей.

Наконец, .

Если вы хотите попробовать, пожалуйста, используйте его!

Оцените статью
devanswers.ru
Добавить комментарий