Python에서 bitbake 명령을 사용합시다!

9369 단어 showdevyoctopython

가장 먼저



저는 yocto를 사용하여 사용자 정의 Linux 빌드를 빌드하는 중입니다.
이 작업에서 종종 다음과 같은 요청을 받습니다.
  • 특정 bbclass(예: core-image.bbclass)에서 상속되는 파일 목록이 필요합니다.
  • 모든 패키지에 변수(예: PE, PV, PR)를 나열해야 합니다
  • .
  • 특정 패키지(예: gcc)에 대한 bbappend 파일을 나열해야 합니다.

  • 골치 아프지 않나요? 나는 grep하고 싶지 않고 너무 오래 걸리기 때문에 빌드하고 싶지 않습니다 ...

    파이썬에서 Bitbake를 사용해 봅시다.



    제 생각에는 골칫거리입니다. 그래서 그것에 대해 뭔가를 하는 방법을 조사해 봅시다. 먼저 bitbake 명령에 의한 빌드 메커니즘은 대략 이렇습니다.



    이 Tinfoil은 약간 복잡해서 사용하기 쉽지 않습니다. 실제 코드는 here 입니다. 반면에 server_client 간의 IF는 어느 정도 잘 정의되어 있습니다here. 이러한 상황을 고려하면 아래와 같이 해야 할 것 같습니다.



    이 bbclient를 Python으로 만들면 언어 서버 등에서 쉽게 사용할 수 있습니다.

    내가 만든 것



    지금까지의 연구 결과를 바탕으로 내가 만든 bbclient는 아래와 같다.

    https://pypi.org/project/bbclient/

    자료도 준비했습니다.
  • IF Specifications
  • Concrete use case

  • 할 수 있는 일



    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()
    


    이 클라이언트를 사용하여 다음 각 사용 사례를 구현할 수 있습니다.

    I need a list of recipe files that inherit a specific bbclass (like 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)
    


    I need you to list the variables (e.g. PE, PV, PR) with all packages



    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)
    


    I need you to list the bbappend files for a specific package (e.g. 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 파일을 생성할 수도 있습니다.

    드디어



    사용해보고 싶으신 분들은 꼭 이용해보세요!

    좋은 웹페이지 즐겨찾기