[PATCH] crossvars.bbclass: use d.appendVar instead of d.setVar for SDK_TOOLCHAIN variable

41 views
Skip to first unread message

Srinuvasan Arjunan

unread,
May 22, 2023, 12:41:41 AM5/22/23
to isar-...@googlegroups.com, jan.k...@siemens.com, ami...@ilbers.de, Srinuvasan A
From: Srinuvasan A <srinuv...@siemens.com>

In downstream layer we may override the sdk_toolchain, but this not works as
expected in latest ISAR, the reason behind this as they moved toolchain
selection into python Anonymous function.

Anonymous Python functions always run at the end of parsing, regardless of where they are defined
even when we do override in our recipe, always wins the Anonymous Python
functions variable settings, hence change to d.appendVar instead of
d.setVar in sdk toolchain selection, so downstream layer they can modify the
SDK_TOOLCHAIN list if needed (append/remove).

Signed-off-by: Srinuvasan A <srinuv...@siemens.com>
---
meta/classes/crossvars.bbclass | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/meta/classes/crossvars.bbclass b/meta/classes/crossvars.bbclass
index 201d460..5a3edc4 100644
--- a/meta/classes/crossvars.bbclass
+++ b/meta/classes/crossvars.bbclass
@@ -17,7 +17,7 @@ python __anonymous() {
sbuild_dep = "sbuild-chroot-target:do_build"
buildchroot_dir = d.getVar('BUILDCHROOT_TARGET_DIR', False)
buildchroot_dep = "buildchroot-target:do_build"
- sdk_toolchain = "build-essential"
+ sdk_toolchain = " build-essential"
else:
d.setVar('BUILD_HOST_ARCH', d.getVar('HOST_ARCH'))
schroot_dir = d.getVar('SCHROOT_HOST_DIR', False)
@@ -31,5 +31,5 @@ python __anonymous() {
d.setVar('BUILDCHROOT_DEP', buildchroot_dep)
if isar_can_build_compat(d):
sdk_toolchain += " crossbuild-essential-" + d.getVar('COMPAT_DISTRO_ARCH')
- d.setVar('SDK_TOOLCHAIN', sdk_toolchain)
+ d.appendVar('SDK_TOOLCHAIN', sdk_toolchain)
}
--
2.34.1

Jan Kiszka

unread,
May 22, 2023, 1:16:20 AM5/22/23
to Srinuvasan Arjunan, isar-...@googlegroups.com, ami...@ilbers.de, Srinuvasan A
On 22.05.23 06:41, Srinuvasan Arjunan wrote:
> From: Srinuvasan A <srinuv...@siemens.com>
>
> In downstream layer we may override the sdk_toolchain, but this not works as
> expected in latest ISAR, the reason behind this as they moved toolchain
> selection into python Anonymous function.

Dod you want to append or do you want to replac SDK_TOOLCHAIN in
downstream? In the latter case, we likely rather want to make our
assignment in isar weak, no?

if not d.getVar('SDK_TOOLCHAIN'):
...

Jan
Siemens AG, Technology
Competence Center Embedded Linux

Jan Kiszka

unread,
May 22, 2023, 1:54:53 AM5/22/23
to Srinuvasan Arjunan, isar-...@googlegroups.com, ami...@ilbers.de, Srinuvasan A
On 22.05.23 07:16, 'Jan Kiszka' via isar-users wrote:
> On 22.05.23 06:41, Srinuvasan Arjunan wrote:
>> From: Srinuvasan A <srinuv...@siemens.com>
>>
>> In downstream layer we may override the sdk_toolchain, but this not works as
>> expected in latest ISAR, the reason behind this as they moved toolchain
>> selection into python Anonymous function.
>
> Dod you want to append or do you want to replac SDK_TOOLCHAIN in
> downstream? In the latter case, we likely rather want to make our
> assignment in isar weak, no?
>
> if not d.getVar('SDK_TOOLCHAIN'):
> ...
>

Also to answer: Why is SDK_PREINSTALL insufficient for your customization?

Jan

Srinuvasan Arjunan

unread,
May 25, 2023, 12:53:50 AM5/25/23
to isar-users
    yes we can append our toolchain via SDK_PREINSTALL, but i need to replace with the "crossbuild-essential-${COMPAT_DISTRO_ARCH}" , this one comes via SDK_TOOLCHAIN variable, if i append " gcc-multilib g++-multilib" without removing the crossbuild-essential am facing broken package problem.
Logs:

 Broken gcc-multilib:amd64 Conflicts on gcc-10-i686-linux-gnu:amd64 < none -> 10.2.1-6cross1 @un puN Ib >
 |   Considering gcc-10-i686-linux-gnu:amd64 1 as a solution to gcc-multilib:amd64 10001
 | Investigating (0) gcc-10-i686-linux-gnu:amd64 < none -> 10.2.1-6cross1 @un puN Ib >

Eventually I need to remove crossbuild-essential, but this one will do via SDK_TOOLCHAIN remove override , but this does not work in the downstream layer, because always ISAR's python anonymous function wins and set its value.

Thanks,
Srinu 

Jan Kiszka

unread,
May 25, 2023, 6:20:49 AM5/25/23
to Srinuvasan Arjunan, isar-users
Ok, then we should actually implement a weak (?=) assignment in the
Python block, so that you can define your own SDK_TOOLCHAIN in such
scenarios.

Srinuvasan Arjunan

unread,
May 26, 2023, 5:03:51 AM5/26/23
to isar-users
 we can't do soft assignment inside pyhton anonymous function, it throws syntax error.

Suppose if we want any parameter to override that should not be in python anonymous function, upstream layer should follow this one.
we could write an python anonymous function in downstream layer to set the proper one, but in this case no use to inherit that functionality
from upstream (duplication)
In ISAR, this commit c8371018 moves the cross selection part into one place, here obviously we are not overriding the chroot (builchroot/sbuildchroot) part,
but we may do override for toolchain selection, I hope we can pull out this toolchain selection from python function and keep it outside,
hence this can be override from other layer.

Thanks,
Srinu. 

Srinuvasan Arjunan

unread,
Jun 4, 2023, 5:32:40 AM6/4/23
to isar-...@googlegroups.com, jan.k...@siemens.com, ami...@ilbers.de, Srinuvasan A
From: Srinuvasan A <srinuv...@siemens.com>

In the present implementation we are not able to override the SDK
toolchain from downstream layer, this is due to the SDK toolchain
selection part in anonymous python function.

Anonymous python functions always run at the end of parsing, regardless of where they are defined
even when we do override in our recipe, always wins the Anonymous Python
functions variable settings, hence we are not able to override our
downstream toolchain.

Move the SDK toolchian selection from python block, now we can able to
override from downstream layer.

Signed-off-by: Srinuvasan A <srinuv...@siemens.com>
---
meta/classes/crossvars.bbclass | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/meta/classes/crossvars.bbclass b/meta/classes/crossvars.bbclass
index 201d460..120e6d1 100644
--- a/meta/classes/crossvars.bbclass
+++ b/meta/classes/crossvars.bbclass
@@ -5,6 +5,10 @@ ISAR_CROSS_COMPILE ??= "0"

inherit compat

+SDK_TOOLCHAIN = "${@'build-essential' if d.getVar('ISAR_CROSS_COMPILE') == '0' or d.getVar('HOST_ARCH') == d.getVar('DISTRO_ARCH') or d.getVar('DISTRO_ARCH') == None else 'crossbuild-essential-${DISTRO_ARCH}'}"
+
+SDK_TOOLCHAIN:append = "${@' crossbuild-essential-${COMPAT_DISTRO_ARCH}' if isar_can_build_compat(d) else ''}"
+
python __anonymous() {
import pwd
d.setVar('SCHROOT_USER', pwd.getpwuid(os.geteuid()).pw_name)
@@ -17,19 +21,14 @@ python __anonymous() {
sbuild_dep = "sbuild-chroot-target:do_build"
buildchroot_dir = d.getVar('BUILDCHROOT_TARGET_DIR', False)
buildchroot_dep = "buildchroot-target:do_build"
- sdk_toolchain = "build-essential"
else:
d.setVar('BUILD_HOST_ARCH', d.getVar('HOST_ARCH'))
schroot_dir = d.getVar('SCHROOT_HOST_DIR', False)
sbuild_dep = "sbuild-chroot-host:do_build"
buildchroot_dir = d.getVar('BUILDCHROOT_HOST_DIR', False)
buildchroot_dep = "buildchroot-host:do_build"
- sdk_toolchain = "crossbuild-essential-" + distro_arch
d.setVar('SCHROOT_DIR', schroot_dir)
d.setVar('SCHROOT_DEP', sbuild_dep)
d.setVar('BUILDCHROOT_DIR', buildchroot_dir)
d.setVar('BUILDCHROOT_DEP', buildchroot_dep)
- if isar_can_build_compat(d):
- sdk_toolchain += " crossbuild-essential-" + d.getVar('COMPAT_DISTRO_ARCH')
- d.setVar('SDK_TOOLCHAIN', sdk_toolchain)
}
--
2.34.1

Jan Kiszka

unread,
Jun 5, 2023, 3:01:01 AM6/5/23
to Srinuvasan Arjunan, isar-...@googlegroups.com, ami...@ilbers.de, Srinuvasan A
This is still no weak assignment which you will need for overrides. Did
you actually test this? And, again, can't we implement the weak
assignment in python below?

Jan

> python __anonymous() {
> import pwd
> d.setVar('SCHROOT_USER', pwd.getpwuid(os.geteuid()).pw_name)
> @@ -17,19 +21,14 @@ python __anonymous() {
> sbuild_dep = "sbuild-chroot-target:do_build"
> buildchroot_dir = d.getVar('BUILDCHROOT_TARGET_DIR', False)
> buildchroot_dep = "buildchroot-target:do_build"
> - sdk_toolchain = "build-essential"
> else:
> d.setVar('BUILD_HOST_ARCH', d.getVar('HOST_ARCH'))
> schroot_dir = d.getVar('SCHROOT_HOST_DIR', False)
> sbuild_dep = "sbuild-chroot-host:do_build"
> buildchroot_dir = d.getVar('BUILDCHROOT_HOST_DIR', False)
> buildchroot_dep = "buildchroot-host:do_build"
> - sdk_toolchain = "crossbuild-essential-" + distro_arch
> d.setVar('SCHROOT_DIR', schroot_dir)
> d.setVar('SCHROOT_DEP', sbuild_dep)
> d.setVar('BUILDCHROOT_DIR', buildchroot_dir)
> d.setVar('BUILDCHROOT_DEP', buildchroot_dep)
> - if isar_can_build_compat(d):
> - sdk_toolchain += " crossbuild-essential-" + d.getVar('COMPAT_DISTRO_ARCH')
> - d.setVar('SDK_TOOLCHAIN', sdk_toolchain)
> }

--

Srinuvasan Arjunan

unread,
Jun 5, 2023, 3:07:55 AM6/5/23
to isar-users
Yes tested working fine, here i do the append overrides in downstream layer, like how the previous implementation before things move into the python block.


Now in present implementation comapt-arch override was removed and this selection of compat will be handled by  ISAR_ENABLE_COMPAT_ARCH

Thanks,
Srinu

Jan Kiszka

unread,
Jun 5, 2023, 3:18:34 AM6/5/23
to Srinuvasan Arjunan, isar-users
On 05.06.23 09:07, Srinuvasan Arjunan wrote:
> Yes tested working fine, here i do the append overrides in downstream
> layer, like how the previous implementation before things move into the
> python block.
>
> https://github.com/ilbers/isar/commit/43f402f4862c3779a492c50a26475ea1221a2b01
>
> Now in present implementation comapt-arch override was removed and this
> selection of compat will be handled by  ISAR_ENABLE_COMPAT_ARCH

So, d.setVar blocks :append and :remove, right? You don't want to set it
downstream completely?

But I dislike this long inline python, specifically as we already have
the logic more readable. How about using an intermediate variable then
which is defined in the anonymous python block while SDK_TOOLCHAIN gets
that value by default outside the block?

Or - to come back to your original issue - we make that use case of
multilib officially an SDK toolchain option so that you just need to
flip a switch, not fiddle with the internals of SDK_TOOLCHAIN.

Jan
> --
> You received this message because you are subscribed to the Google
> Groups "isar-users" group.
> To unsubscribe from this group and stop receiving emails from it, send
> an email to isar-users+...@googlegroups.com
> <mailto:isar-users+...@googlegroups.com>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/isar-users/3f742bff-1ccd-4a88-8c96-8cab068b8eb4n%40googlegroups.com <https://groups.google.com/d/msgid/isar-users/3f742bff-1ccd-4a88-8c96-8cab068b8eb4n%40googlegroups.com?utm_medium=email&utm_source=footer>.

Srinuvasan Arjunan

unread,
Jun 5, 2023, 3:43:14 AM6/5/23
to isar-users
On Monday, June 5, 2023 at 12:48:34 PM UTC+5:30 Jan Kiszka wrote:
On 05.06.23 09:07, Srinuvasan Arjunan wrote:
> Yes tested working fine, here i do the append overrides in downstream
> layer, like how the previous implementation before things move into the
> python block.
>
> https://github.com/ilbers/isar/commit/43f402f4862c3779a492c50a26475ea1221a2b01
>
> Now in present implementation comapt-arch override was removed and this
> selection of compat will be handled by  ISAR_ENABLE_COMPAT_ARCH

So, d.setVar blocks :append and :remove, right?

         yes, correct. 
You don't want to set it
downstream completely?

But I dislike this long inline python, specifically as we already have
the logic more readable. How about using an intermediate variable then
which is defined in the anonymous python block while SDK_TOOLCHAIN gets
that value by default outside the block?

  We could do this way. 


Or - to come back to your original issue - we make that use case of
multilib officially an SDK toolchain option so that you just need to
flip a switch, not fiddle with the internals of SDK_TOOLCHAIN.

  Yes , this also works , i will come back with more details. 
Reply all
Reply to author
Forward
0 new messages