First of all
I'm working on building a custom linux build using yocto.
In this job, I often get requests like
- I need a list of files that inherit from a specific bbclass (like core-image.bbclass).
- I need to list the variables (e.g. PE, PV, PR) with all packages
- I need to list the bbappend files for a specific package (e.g. gcc).
Isn't that a pain in the ass? I don't want to grep, and I don't want to build because it takes too long...
Let's use Bitbake from python.
It's a pain in the ass I think, so let's investigate how to do something about it. First of all, the build mechanism by bitbake command is roughly like this.
This Tinfoil is a little bit complicated, so it's not easy to use. The actual code is here. On the other hand, IF between server_client is defined somewhat nicely here. Considering these circumstances, it seems like I should do like below.
If I make this bbclient in python, it will be easy to use from language server and so on.
What I made
Based on the results of the study so far, the bbclient I made is shown in below.
https://pypi.org/project/bbclient/
I've also prepared some documentation.
What you can do
There are so many IFs that I can't show you all of them, but for now, let's try to implement the use case I mentioned at the beginning of this article.
First of all, the way to initialize the bbclient instance is shown in below.
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()
You can use this client to implement each of the following use cases.
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)
You can also build images from this client and generate dependency taskdepends files.
Finally
If you would like to try it, please use it!
Top comments (0)