> On Nov 28, 2016, at 11:58 PM, Mike Looijmans <mike.looijm...@topic.nl> wrote:
> 
> On 29-11-16 03:03, Khem Raj wrote:
>> 
>>> On Nov 24, 2016, at 5:55 AM, Bruce Ashfield <bruce.ashfi...@gmail.com
>>> <mailto:bruce.ashfi...@gmail.com>> wrote:
>>> 
>>> 
>>> 
>>> On Thu, Nov 24, 2016 at 5:32 AM, Mike Looijmans <mike.looijm...@topic.nl
>>> <mailto:mike.looijm...@topic.nl>> wrote:
>>> 
>>>    On 24-11-16 11:10, Mike Looijmans wrote:
>>> 
>>>        I'm currently experiencing a problem with "defconfig" files and the
>>>        kernel.
>>> 
>>>        In short, when I make a change to the "defconfig" file, the kernel
>>>        is rebuilt
>>>        (which is correct), but the resulting kernel has been built using
>>>        the old
>>>        defconfig from a previous build, instead of the new one.
>>> 
>>>        The kernel recipe just contains "file://defconfig" in its SRC_URI. 
>>> The
>>>        defconfig file is in the project's overlay.
>>> 
>>>        For example, I have a kernel with "CONFIG_DEVMEM" disabled:
>>> 
>>>        # gunzip < /proc/config.gz | grep DEVMEM
>>>        # CONFIG_DEVMEM is not set
>>> 
>>>        Now, I change the defconfig to contain CONFIG_DEVMEM=y and build the
>>>        image.
>>>        The result:
>>> 
>>>        # gunzip < /proc/config.gz | grep DEVMEM
>>>        # CONFIG_DEVMEM is not set
>>> 
>>>        So the change did not make it into the actual kernel, even though
>>>        the kernel
>>>        was rebuild as a result of the change.
>>> 
>>>        I run "bitbake -c cleansstate virtual/kernel" and build the image 
>>> again:
>>> 
>>>        # gunzip < /proc/config.gz | grep DEVMEM
>>>        CONFIG_DEVMEM=y
>>> 
>>>        After cleaning, the result is correct and the new defconfig is 
>>> active.
>>> 
>>>        I'm trying to figure out how this can happen, any help is welcome...
>>> 
>>> 
>>>    What seems to be the problem is this code in kernel.bbclass:
>>> 
>>>            # Copy defconfig to .config if .config does not exist. This 
>>> allows
>>>            # recipes to manage the .config themselves in
>>>    do_configure_prepend().
>>>            if [ -f "${WORKDIR}/defconfig" ] && [ ! -f "${B}/.config" ]; then
>>>                    cp "${WORKDIR}/defconfig" "${B}/.config"
>>>            fi
>>> 
>>>    This keeps any existing ".config" file if it happens to still be in the
>>>    $B path, which is the case if you're rebuilding a kernel.
>>> 
>>>    I see two possible ways to fix this.
>>> 
>>>    1) During "cleanup" also remove the .config file in the build dir.
>>>    However, the build dir is probably kept alive for a reason? I also can't
>>>    figure out how that "cleanup" is being done.
>>> 
>>> 
>>>    2) Remove the second part of the "if" statement, so it becomes:
>>> 
>>>            # Copy defconfig to .config if "defconfig" exists. This allows
>>>            # recipes to manage the .config themselves in
>>>    do_configure_prepend().
>>>            if [ -f "${WORKDIR}/defconfig" ]; then
>>>                    cp "${WORKDIR}/defconfig" "${B}/.config"
>>>            fi
>>> 
>>>    I've tested that, and it solves my problem. However, it will probably
>>>    break other people's config mangling?
>>> 
>>> 
>>> Yep, in particular all the fragment processing which has the capability of
>>> starting
>>> with a defconfig and then apply fragments from any number of other places. 
>>> When
>>> that task completes, a full .config is in ${B}.  If that statement comes
>>> along and
>>> clobbers the .config …
>> 
>> so you either assume that .config is valid once generated or you dont. When a
>> configure task
>> is triggered it should recreate .config everytime.
> 
> The problem seems to be that the class "do_configure" does things that should 
> happen before and after things that the recipe would want to change.
> 
> Copying defconfig or whatever means to create a .config should be first.
> 
> Next, the specific kernel recipe would want to mangle that configuration to 
> suit its needs, like applying fragments and such.
> 
> Then the makeoldconfig (or whatever) task should run.



> 
> 
> The current system assumes that the kernel recipe creates a 
> do_configure_prepend to do the mangling, which is rather counterintuitive, 
> one would expect to "append" extra actions.
> 
> A structured approach would be to split the do_configure into two parts that 
> should run in sequence, and then kernel recipes can inject their actions by 
> appending to them as they see fit. The first task would create the .config 
> file by (forcibly) copying any defconfig or starting point. The second task 
> would call the kernel's make script to futher process it.
> 

it might just be enough to expect kernel.bbclass to error out if a given task 
is not implemented by inheriting recipes much like pure virtual functions in C++
and get rid of _append/_prepend sequencing expectations.


> But this too would break existing recipes.
> 
> 
> 
>>> 
>>> I'm actually working in the 2.3 release cycle to make the fragment 
>>> processing
>>> be available to all kernels, which will likely solve this problem .. but we
>>> can't
>>> wait for that.
>>> 
>>> So I'm hoping that there's a way to make the behaviour cover both use cases.
>>> 
>>> Maybe someone with more bitbake knowledge can point out a way that can
>>> detect if the task is being run due to a change in the task signature.
>>> 
>>> Since if you've modified the defconfig, the task is being re-run for that 
>>> change
>>> and at that point we could safely remove the .config (versus forcing it on 
>>> the
>>> clean step).
> 
> 
> 
> 
> Kind regards,
> 
> Mike Looijmans
> System Expert
> 
> TOPIC Products
> Materiaalweg 4, NL-5681 RJ Best
> Postbus 440, NL-5680 AK Best
> Telefoon: +31 (0) 499 33 69 79
> E-mail: mike.looijm...@topicproducts.com
> Website: www.topicproducts.com
> 
> Please consider the environment before printing this e-mail
> 
> 
> 
> 
> 

-- 
_______________________________________________
Openembedded-core mailing list
Openembedded-core@lists.openembedded.org
http://lists.openembedded.org/mailman/listinfo/openembedded-core

Reply via email to