'How can I save local changes that have been done in Yocto repository?
I'm working on some Linux embedded system at the moment and using Yocto to build Linux distribution for a board.
I've followed Yocto build flow:
- download layers sources
- build image
- flash image into the board or generate SDK.
Everything works great. However I was required to add some changes to local.conf, probably add some *.bbapend files, systemd services and so forth. So, I'm wondering how can save that local changes in case if I'll want to setup a new build machine or current one will be corrupted.
Should I create a custom image or layer that will inherit everything from a board manufacturer one and add changes and functionalities that are needed to me? Or something else?
Solution 1:[1]
Generally when working on a custom project with Yocto, here is what possibly you will need:
First of all, you need to create your custom layer
bitbake-layers create-layer meta-custom
and add it:
bitbake-layers add-layer <path/to/meta-custom>
After that, here are some ideas:
Official recipes modification:
When you have to modify some official recipe that exist in other official layer, you need to create a .bbappend file into your custom layer and make your changes there.
meta-official/recipes-example/example/example_1.0.bb
your modifications must be made under:
meta-custom/recipes-example/example/example_1.0.bbappend
or to match all versions of that recipe:
meta-custom/recipes-example/example/example_%.bbappend
Distro modification:
If you changed DISTRO_FEATURES in local.conf you may need to create a new distro in your new custom layer:
meta-custom/conf/distro/custom-distro.conf
in custom-distro.conf:
includeorrequireyour current used distro- Add your custom configuration
DISTRO_FEATURES
Then, when creating new build, set (in local.conf):
DISTRO = "custom-distro"
Examples for distro changes:
- Select the init manager:
INIT_MANAGER = "systemd"for example. - Add some distro features
- Set some preferred recipes versions
PREFERRED_VERSION_recipe = "x" - Set some preferred providers
PREFERRED_PROVIDER_virtual/xx = "x"
Machine modification:
If your board presents a permanent hardware components that, by default, are not activated in Yocto, then I suggest to create a new custom machine as well:
meta-custom/conf/machine/custom-machine.conf
In that, include or require your current machine configuration file and you may:
- Select your preferred virtual/kernel provider
- Select your preferred virtual/bootloader provider
- Select your custom kernel and bootloader device tree files
- etc.
and then, set it (in local.conf):
MACHINE = "custom-machine"
Image modification:
This is the most probable modification one may have, which is adding some packages to the image with IMAGE_INSTALL, so you may need to create a custom image:
meta-custom/recipes-core/images/custom-image.bb
in that require or include other image and:
- Add packages with
IMAGE_INSTALL
NOTES
If you have
bbappendthat append to an officialbbappendthen you consider making your layer more priority to the official one inmeta-custom/conf/layer.confIf your new custom layer depends on your manufacturer layer than you may consider making it depends on it in the layer conf file:
LAYERDEPENDS_meta-custom = "meta-official"
- I recommend using
kaswhich you can setup an automatic layers configuration with your custom layer and create the build automatically, this is also useful for DevOps pipelines automation.
This is what I can think of right now :))
EDIT
You can then create a custom repository for your custom layer.
If you are using repo for your manufacturer provided initialization, then you can use this idea:
You can customize the manufacturer's manifest file to add your new custom repository, like the following:
Add remote block for your custom git server
<remote name="custom-git" fetch="ssh://[email protected]/<group>/"/>
If your custom layer is under the git server directly remove group or set it if it is the case.
Then, add your custom layer as a project:
<project path="<where/to/unpack>" name="<name/under/remote>" remote="custom-git" revision="<commit>" />
You can check for more repo details here.
Finally, you just use repo with your custom repository/manifest:
repo init -u <custom-git/manifest-project> -b <branch> -m custom-project.xml
repo sync
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |
