Compile Commit
Compile Commit

Reputation: 443

Yocto: Overriding function in existing recipe

I am new to Yocto. I am trying to modify an existing function in a recipe. I am a little confused on how to override the function using a bbappend file.

I have the following code in an existing recipe:

fn_functionA () {
    pushd ${WORKDIR}/folder1
    git submodule update --init --recursive submodule1
    popd
}
do_unpack[postfuncs] += "fn_functionA"

I need to edit this function to the following:

fn_functionA () {
        pushd ${WORKDIR}/folder1
        git submodule update --init --recursive submodule1
        popd
        pushd ${WORKDIR}/folder1/submodule1
        git fetch "ssh link to project" refs/changes/99/68099/1 && git checkout FETCH_HEAD
        popd
    }
    do_unpack[postfuncs] += "fn_functionA"

Do I need to copy/paste the whole body of the edited function in the bbappend file, or do an addtask? A detailed answer would be appreciated.

Also, n00b question: Why can't we edit the bb file and modify the function directly instead of overriding the function in a bbappend file?

Upvotes: 1

Views: 3555

Answers (1)

Talel BELHAJSALEM
Talel BELHAJSALEM

Reputation: 4294

You can append to functions the same way as you append to recipe's tasks.

Here is an example:

  • meta-example/recipes-example/example/example_0.1.bb
LICENSE = "CLOSED"

func_example() {
    bbwarn "From func_example"
}

do_example() {
    bbwarn "From do_example"
}

do_example[postfuncs] += "func_example"
addtask do_example

Now when you run: bitbake example -c example you should see:

...
WARNING: example-0.1-r0 do_example: From do_example
WARNING: example-0.1-r0 do_example: From func_example
...

Now, let's create a bbappend file:

  • meta-example-2/recipes-example/example/example_%.bbappend
func_example:append() {
    bbwarn "From func_example_append"
}

Now, when you run bitbake example -c example again you should see:

...
WARNING: example-0.1-r0 do_example: From do_example
WARNING: example-0.1-r0 do_example: From func_example
WARNING: example-0.1-r0 do_example: From func_example_append
...

If you want to override the function, just redefine it without append or prepend, in my example it would be:

func_example() {
    bbwarn "From func_example_append"
}

And the output would be:

...
WARNING: example-0.1-r0 do_example: From do_example
WARNING: example-0.1-r0 do_example: From func_example_append
...

Why using bbappend ?

It is not recommended to change/edit something directly in a third party Yocto layer (Example: meta-raspberrypi, meta-qt5, ...), and here is why:

  • By time, you will forget what you changed.
  • No one can replicate your exact image unless you send them your modified layer
  • If you upgrade the layer to another release, you need to manually redo all modifications in the layer, hoping you did not forget them
  • It is not a way to work in a Yocto development team
  • Creating a bbappend in your custom layer gives clear idea of what you have changed. Also it will be easy to update the changes or to send the layer to someone, who just clones the third party by them self and then use your layer.

The most import point for me, is a respect for those who developed the layer and make it public for everyone. Keeping it clean as cloned is one of the best practices in Yocto development.

Upvotes: 5

Related Questions