[yocto] Splitting a recipe into two for two kind of compilation
nbigaouette
nbigaouette at rogue-research.com
Thu Oct 6 13:05:19 PDT 2016
Thank you Khem, I was able to fix the conflict by adding multiple
SSTATE_DUPWHITELIST in my `.inc` file.
I couldn't find documentation for SSTATE_DUPWHITELIST, so I'm posting
the exact line I've used. The trick was to use STAGING_DIR_HOST to
specify the path to the file.
For example, for the conflicting file:
> /cache/tmp/sysroots/intel-corei7-64/lib/systemd/system/mypackage.service
I added:
> SSTATE_DUPWHITELIST +=
> "${STAGING_DIR_HOST}${systemd_unitdir}/system/mypackage.service"
I can now build both `-release` and `-debug` packages and include them
in two separate images. Once the distro is running on the hardware, I
can simply switch between the two (by removing the first and installing
the second).
Thanks!
Nicolas
On 2016-10-05 11:56, Khem Raj wrote:
> On Wed, Oct 5, 2016 at 7:20 AM, Nicolas Bigaouette
> <nbigaouette at rogue-research.com> wrote:
>> Hi all!
>>
>> I have an issue when trying to build two different images using
>> conflicting
>> packages.
>>
>> I need to package an application of mine (built using cmake) for our
>> Yocto
>> deployment. The recipe is already written and works well, except that
>> I now
>> need to build two different versions of that code.
>>
>> The code gets compiled to two different binaries (using `#ifdef`)
>> depending
>> on the cmake variable.
>>
>> Right now I can select which code path is compiled by adding either
>> `EXTRA_OECMAKE += " -DCMAKE_BUILD_TYPE=Debug"` or EXTRA_OECMAKE += "
>> -DCMAKE_BUILD_TYPE=Release" to my recipe.
>>
>> I believe I need a second recipe for a second package. I thus moved
>> everything that is common to an `.inc` file and created two new
>> recipes that
>> `require` that new include file. The two new recipes have a suffix to
>> identify which code path was compiled in (`mypackage-release` and
>> `mypackage-debug`). I also added an `RCONFLICTS_${PN}` line to both
>> recipes
>> to indicate conflict with the one another.
>>
>> I can now build both packages using bitbake, but I cannot build two
>> images
>> (say `myimage-release` and `myimage-debug`) that will include only one
>> of
>> the package. I want `myimage-release` to include `mypackage-release`
>> and
>> `myimage-debug` should include `mypackage-debug` but I get conflicts
>> between
>> the two packages in the sysroot. Here's the log:
>>
>>> ERROR: The recipe mypackage-release is trying to install files into a
>>> shared area when those files already exist. Those files and their
>>> manifest
>>> location are:
>>> /cache/tmp/sysroots/intel-corei7-64/lib/systemd/system/mypackage.service
>>> Matched in manifest-intel-corei7-64-mypackage-debug.populate_sysroot
>>> Please verify which recipe should provide the above files.
>>> The build has stopped as continuing in this scenario WILL break
>>> things, if
>>> not now, possibly in the future (we've seen builds fail several
>>> months
>>> later). If the system knew how to recover from this automatically it
>>> would
>>> however there are several different scenarios which can result in
>>> this and
>>> we don't know which one this is. It may be you have switched
>>> providers of
>>> something like virtual/kernel (e.g. from linux-yocto to
>>> linux-yocto-dev), in
>>> that case you need to execute the clean task for both recipes and it
>>> will
>>> resolve this error. It may be you changed DISTRO_FEATURES from
>>> systemd to
>>> udev or vice versa. Cleaning those recipes should again resolve this
>>> error
>>> however switching DISTRO_FEATURES on an existing build directory is
>>> not
>>> supported, you should really clean out tmp and rebuild (reusing
>>> sstate
>>> should be safe). It could be the overlapping files detected are
>>> harmless in
>>> which case adding them to SSTATE_DUPWHITELIST may be the correct
>>> solution.
>>> It could also be your build is including two different conflicting
>>> versions
>>> of things (e.g. bluez 4 and bluez 5 and the correct solution for that
>>> would
>>> be to resolve the conflict. If in doubt, please ask on the mailing
>>> list,
>>> sharing the error and filelist above.
>>> ERROR: If the above message is too much, the simpler version is
>>> you're
>>> advised to wipe out tmp and rebuild (reusing sstate is fine). That
>>> will
>>> likely fix things in most (but not all) cases.
>>> ERROR: Function failed: sstate_task_postfunc
>>> ERROR: Logfile of failure stored in:
>>> /cache/tmp/work/corei7-64-poky-linux/mypackage-release/1.4.99+gitAUTOINC+b34a28e86d+master-r0/temp/log.do_populate_sysroot.14559
>>> NOTE: recipe
>>> mypackage-release-1.4.99+gitAUTOINC+b34a28e86d+master-r0:
>>> task do_populate_sysroot: Failed
>>> ERROR: Task 810
>>> (/builds/yocto/poky/../meta-proj/recipes-proj/mypackage/mypackage-release_git.bb,
>>> do_populate_sysroot) failed with exit code '1'
>>
>>
>>
>> Am I approaching the problem the right way? Is doing what I do the
>> proper
>> way to achieve what I want?
>>
>
> There are couple of ways you can look at it. There is global flag
> DEBUG_BUILD
> to generate debuggable images. So you could utilize that flag in a
> single recipe
> to control enabling/disabling debugging features of your app. This
> will give better debugability to devs as well since you will have
> other packages with debug friendly information.
>
> Taking the approach you have described would work too, you have to
> ensure
> that two recipes i.e. debug and release dont provide same PACKAGES
> otherwise they end up with conflicts.
>
> The issue you are seeing is because of a file which is being installed
> into sysroot by both packages. so may be adding it to
> SSTATE_DUPWHITELIST would be fine here. just add it to
> SSTATE_DUPWHITELIST in recipe.
>
>> NOTE: I build the image using `bitbake myimage-release myimage-debug`.
>>
>> Thank you!
>> --
>> _______________________________________________
>> yocto mailing list
>> yocto at yoctoproject.org
>> https://lists.yoctoproject.org/listinfo/yocto
More information about the yocto
mailing list