[v4,1/3] module.inc: fix kbuild dependency

Message ID 20240514141527.1997170-2-adriaan.schmidt@siemens.com
State Superseded, archived
Headers show
Series kbuild follow-up | expand

Commit Message

Schmidt, Adriaan May 14, 2024, 2:15 p.m. UTC
This achieves two things:

* Module builds now depend on linux-headers-*-native as build dependency.
  This is a minimal API change compared to the previous linux-headers-*.
  The dependency on the new linux-kbuild is kept hidden in linux-custom.inc
* Remove the unconditional building of native kbuild when it is
  not needed, i.e. when we're not actually cross-building a module

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Adriaan Schmidt <adriaan.schmidt@siemens.com>
---
 meta/recipes-kernel/linux-module/module.inc |  2 +-
 meta/recipes-kernel/linux/linux-custom.inc  | 25 ++++++++++++++-------
 meta/recipes-kernel/linux/linux-distro.bb   |  1 +
 3 files changed, 19 insertions(+), 9 deletions(-)

Comments

Anton Mikanovich May 15, 2024, 3:07 p.m. UTC | #1
14/05/2024 17:15, 'Adriaan Schmidt' via isar-users wrote:
> This achieves two things:
>
> * Module builds now depend on linux-headers-*-native as build dependency.
>    This is a minimal API change compared to the previous linux-headers-*.
>    The dependency on the new linux-kbuild is kept hidden in linux-custom.inc
> * Remove the unconditional building of native kbuild when it is
>    not needed, i.e. when we're not actually cross-building a module
>
> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
> Signed-off-by: Adriaan Schmidt <adriaan.schmidt@siemens.com>

Hello Adriaan,
This will fail for distro kernels because linux-distro.bb recipe do not provide
-native package.
Jan Kiszka May 15, 2024, 5:41 p.m. UTC | #2
On 15.05.24 17:07, Anton Mikanovich wrote:
> 14/05/2024 17:15, 'Adriaan Schmidt' via isar-users wrote:
>> This achieves two things:
>>
>> * Module builds now depend on linux-headers-*-native as build dependency.
>>    This is a minimal API change compared to the previous linux-headers-*.
>>    The dependency on the new linux-kbuild is kept hidden in
>> linux-custom.inc
>> * Remove the unconditional building of native kbuild when it is
>>    not needed, i.e. when we're not actually cross-building a module
>>
>> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
>> Signed-off-by: Adriaan Schmidt <adriaan.schmidt@siemens.com>
> 
> Hello Adriaan,
> This will fail for distro kernels because linux-distro.bb recipe do not
> provide
> -native package.

Does it fail (spoiler: it does not for me) or do you suspect it may fail?

Jan
Schmidt, Adriaan May 15, 2024, 9:28 p.m. UTC | #3
Kiszka, Jan (T CED), Sent: Mittwoch, 15. Mai 2024 19:42:
> On 15.05.24 17:07, Anton Mikanovich wrote:
> > 14/05/2024 17:15, 'Adriaan Schmidt' via isar-users wrote:
> >> This achieves two things:
> >>
> >> * Module builds now depend on linux-headers-*-native as build dependency.
> >>    This is a minimal API change compared to the previous linux-headers-*.
> >>    The dependency on the new linux-kbuild is kept hidden in
> >> linux-custom.inc
> >> * Remove the unconditional building of native kbuild when it is
> >>    not needed, i.e. when we're not actually cross-building a module
> >>
> >> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
> >> Signed-off-by: Adriaan Schmidt <adriaan.schmidt@siemens.com>
> >
> > Hello Adriaan,
> > This will fail for distro kernels because linux-distro.bb recipe do not
> > provide
> > -native package.
> 
> Does it fail (spoiler: it does not for me) or do you suspect it may fail?

It fails in non-cross cases (amd64 target on amd64 host), regardless of the
value of ISAR_CROSS_COMPILE, with "Nothing PROVIDES 'linux-headers-amd64-native'".

The patch below fixes it, by making the distro kernel dummy recipe provide it.
Although it should also be covered by multiarch.bbclass and your commit
5c2299c718fa1548057d250318df5bddfea8e2b5, because that seems like a case where
we'd want to drop the '-native' from the dependency.
Maybe we need to examine the condition here...

Adriaan

===
diff --git a/meta/recipes-kernel/linux/linux-distro.bb b/meta/recipes-kernel/linux/linux-distro.bb
index 13b8dc7e..16673b67 100644
--- a/meta/recipes-kernel/linux/linux-distro.bb
+++ b/meta/recipes-kernel/linux/linux-distro.bb
@@ -16,3 +16,5 @@ python() {
     if d.getVar('KERNEL_HEADERS_PKG'):
         d.appendVar('PROVIDES', ' ' + d.getVar('KERNEL_HEADERS_PKG'))
 }
+
+inherit multiarch
===

> Jan
> 
> --
> Siemens AG, Technology
> Linux Expert Center
Jan Kiszka May 16, 2024, 5:21 a.m. UTC | #4
On 15.05.24 23:28, Schmidt, Adriaan (T CED EDC-DE) wrote:
> Kiszka, Jan (T CED), Sent: Mittwoch, 15. Mai 2024 19:42:
>> On 15.05.24 17:07, Anton Mikanovich wrote:
>>> 14/05/2024 17:15, 'Adriaan Schmidt' via isar-users wrote:
>>>> This achieves two things:
>>>>
>>>> * Module builds now depend on linux-headers-*-native as build dependency.
>>>>    This is a minimal API change compared to the previous linux-headers-*.
>>>>    The dependency on the new linux-kbuild is kept hidden in
>>>> linux-custom.inc
>>>> * Remove the unconditional building of native kbuild when it is
>>>>    not needed, i.e. when we're not actually cross-building a module
>>>>
>>>> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
>>>> Signed-off-by: Adriaan Schmidt <adriaan.schmidt@siemens.com>
>>>
>>> Hello Adriaan,
>>> This will fail for distro kernels because linux-distro.bb recipe do not
>>> provide
>>> -native package.
>>
>> Does it fail (spoiler: it does not for me) or do you suspect it may fail?
> 
> It fails in non-cross cases (amd64 target on amd64 host), regardless of the
> value of ISAR_CROSS_COMPILE, with "Nothing PROVIDES 'linux-headers-amd64-native'".
> 
> The patch below fixes it, by making the distro kernel dummy recipe provide it.
> Although it should also be covered by multiarch.bbclass and your commit
> 5c2299c718fa1548057d250318df5bddfea8e2b5, because that seems like a case where
> we'd want to drop the '-native' from the dependency.
> Maybe we need to examine the condition here...
> 
> Adriaan
> 
> ===
> diff --git a/meta/recipes-kernel/linux/linux-distro.bb b/meta/recipes-kernel/linux/linux-distro.bb
> index 13b8dc7e..16673b67 100644
> --- a/meta/recipes-kernel/linux/linux-distro.bb
> +++ b/meta/recipes-kernel/linux/linux-distro.bb
> @@ -16,3 +16,5 @@ python() {
>      if d.getVar('KERNEL_HEADERS_PKG'):
>          d.appendVar('PROVIDES', ' ' + d.getVar('KERNEL_HEADERS_PKG'))
>  }
> +
> +inherit multiarch
> ===
> 

This makes sense as linux-distro is a dummy package to please bitbake,
an it does not generate and debian packages, thus does not inherit
multiarch via dpkg-base.

The reason why multiarch does not help us on example-module side is that
we only append -native to dependencies, we do not remove it anywhere
because we assume hat multiarch will augment PROVIDES with a -native
target when there is no need for a separate one.

Please send v5 then.

Thanks,
Jan
Jan Kiszka May 16, 2024, 6:15 a.m. UTC | #5
On 16.05.24 07:21, 'Jan Kiszka' via isar-users wrote:
> On 15.05.24 23:28, Schmidt, Adriaan (T CED EDC-DE) wrote:
>> Kiszka, Jan (T CED), Sent: Mittwoch, 15. Mai 2024 19:42:
>>> On 15.05.24 17:07, Anton Mikanovich wrote:
>>>> 14/05/2024 17:15, 'Adriaan Schmidt' via isar-users wrote:
>>>>> This achieves two things:
>>>>>
>>>>> * Module builds now depend on linux-headers-*-native as build dependency.
>>>>>    This is a minimal API change compared to the previous linux-headers-*.
>>>>>    The dependency on the new linux-kbuild is kept hidden in
>>>>> linux-custom.inc
>>>>> * Remove the unconditional building of native kbuild when it is
>>>>>    not needed, i.e. when we're not actually cross-building a module
>>>>>
>>>>> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
>>>>> Signed-off-by: Adriaan Schmidt <adriaan.schmidt@siemens.com>
>>>>
>>>> Hello Adriaan,
>>>> This will fail for distro kernels because linux-distro.bb recipe do not
>>>> provide
>>>> -native package.
>>>
>>> Does it fail (spoiler: it does not for me) or do you suspect it may fail?
>>
>> It fails in non-cross cases (amd64 target on amd64 host), regardless of the
>> value of ISAR_CROSS_COMPILE, with "Nothing PROVIDES 'linux-headers-amd64-native'".
>>
>> The patch below fixes it, by making the distro kernel dummy recipe provide it.
>> Although it should also be covered by multiarch.bbclass and your commit
>> 5c2299c718fa1548057d250318df5bddfea8e2b5, because that seems like a case where
>> we'd want to drop the '-native' from the dependency.
>> Maybe we need to examine the condition here...
>>
>> Adriaan
>>
>> ===
>> diff --git a/meta/recipes-kernel/linux/linux-distro.bb b/meta/recipes-kernel/linux/linux-distro.bb
>> index 13b8dc7e..16673b67 100644
>> --- a/meta/recipes-kernel/linux/linux-distro.bb
>> +++ b/meta/recipes-kernel/linux/linux-distro.bb
>> @@ -16,3 +16,5 @@ python() {
>>      if d.getVar('KERNEL_HEADERS_PKG'):
>>          d.appendVar('PROVIDES', ' ' + d.getVar('KERNEL_HEADERS_PKG'))
>>  }
>> +
>> +inherit multiarch
>> ===
>>
> 
> This makes sense as linux-distro is a dummy package to please bitbake,
> an it does not generate and debian packages, thus does not inherit
> multiarch via dpkg-base.
> 
> The reason why multiarch does not help us on example-module side is that
> we only append -native to dependencies, we do not remove it anywhere
> because we assume hat multiarch will augment PROVIDES with a -native
> target when there is no need for a separate one.
> 

In fact, we are also dropping -native from DEPENDS, in the anonymous
python block of multiarch.bbclass. Maybe we rather have an ordering
issues of all the magics?

Jan

> Please send v5 then.
> 
> Thanks,
> Jan
>
Jan Kiszka May 16, 2024, 6:21 a.m. UTC | #6
On 16.05.24 08:15, 'Jan Kiszka' via isar-users wrote:
> On 16.05.24 07:21, 'Jan Kiszka' via isar-users wrote:
>> On 15.05.24 23:28, Schmidt, Adriaan (T CED EDC-DE) wrote:
>>> Kiszka, Jan (T CED), Sent: Mittwoch, 15. Mai 2024 19:42:
>>>> On 15.05.24 17:07, Anton Mikanovich wrote:
>>>>> 14/05/2024 17:15, 'Adriaan Schmidt' via isar-users wrote:
>>>>>> This achieves two things:
>>>>>>
>>>>>> * Module builds now depend on linux-headers-*-native as build dependency.
>>>>>>    This is a minimal API change compared to the previous linux-headers-*.
>>>>>>    The dependency on the new linux-kbuild is kept hidden in
>>>>>> linux-custom.inc
>>>>>> * Remove the unconditional building of native kbuild when it is
>>>>>>    not needed, i.e. when we're not actually cross-building a module
>>>>>>
>>>>>> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
>>>>>> Signed-off-by: Adriaan Schmidt <adriaan.schmidt@siemens.com>
>>>>>
>>>>> Hello Adriaan,
>>>>> This will fail for distro kernels because linux-distro.bb recipe do not
>>>>> provide
>>>>> -native package.
>>>>
>>>> Does it fail (spoiler: it does not for me) or do you suspect it may fail?
>>>
>>> It fails in non-cross cases (amd64 target on amd64 host), regardless of the
>>> value of ISAR_CROSS_COMPILE, with "Nothing PROVIDES 'linux-headers-amd64-native'".
>>>
>>> The patch below fixes it, by making the distro kernel dummy recipe provide it.
>>> Although it should also be covered by multiarch.bbclass and your commit
>>> 5c2299c718fa1548057d250318df5bddfea8e2b5, because that seems like a case where
>>> we'd want to drop the '-native' from the dependency.
>>> Maybe we need to examine the condition here...
>>>
>>> Adriaan
>>>
>>> ===
>>> diff --git a/meta/recipes-kernel/linux/linux-distro.bb b/meta/recipes-kernel/linux/linux-distro.bb
>>> index 13b8dc7e..16673b67 100644
>>> --- a/meta/recipes-kernel/linux/linux-distro.bb
>>> +++ b/meta/recipes-kernel/linux/linux-distro.bb
>>> @@ -16,3 +16,5 @@ python() {
>>>      if d.getVar('KERNEL_HEADERS_PKG'):
>>>          d.appendVar('PROVIDES', ' ' + d.getVar('KERNEL_HEADERS_PKG'))
>>>  }
>>> +
>>> +inherit multiarch
>>> ===
>>>
>>
>> This makes sense as linux-distro is a dummy package to please bitbake,
>> an it does not generate and debian packages, thus does not inherit
>> multiarch via dpkg-base.
>>
>> The reason why multiarch does not help us on example-module side is that
>> we only append -native to dependencies, we do not remove it anywhere
>> because we assume hat multiarch will augment PROVIDES with a -native
>> target when there is no need for a separate one.
>>
> 
> In fact, we are also dropping -native from DEPENDS, in the anonymous
> python block of multiarch.bbclass. Maybe we rather have an ordering
> issues of all the magics?
> 

Ah, no, needed to read my own comment more carefully again: that removal
is only for the case of enforced emulated builds, not for natural native
ones.

Jan
Schmidt, Adriaan May 16, 2024, 6:28 a.m. UTC | #7
Kiszka, Jan (T CED), 16. Mai 2024 08:21:
> On 16.05.24 08:15, 'Jan Kiszka' via isar-users wrote:
> > On 16.05.24 07:21, 'Jan Kiszka' via isar-users wrote:
> >> On 15.05.24 23:28, Schmidt, Adriaan (T CED EDC-DE) wrote:
> >>> Kiszka, Jan (T CED), Sent: Mittwoch, 15. Mai 2024 19:42:
> >>>> On 15.05.24 17:07, Anton Mikanovich wrote:
> >>>>> 14/05/2024 17:15, 'Adriaan Schmidt' via isar-users wrote:
> >>>>>> This achieves two things:
> >>>>>>
> >>>>>> * Module builds now depend on linux-headers-*-native as build
> dependency.
> >>>>>>    This is a minimal API change compared to the previous linux-
> headers-*.
> >>>>>>    The dependency on the new linux-kbuild is kept hidden in
> >>>>>> linux-custom.inc
> >>>>>> * Remove the unconditional building of native kbuild when it is
> >>>>>>    not needed, i.e. when we're not actually cross-building a module
> >>>>>>
> >>>>>> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
> >>>>>> Signed-off-by: Adriaan Schmidt <adriaan.schmidt@siemens.com>
> >>>>>
> >>>>> Hello Adriaan,
> >>>>> This will fail for distro kernels because linux-distro.bb recipe do not
> >>>>> provide
> >>>>> -native package.
> >>>>
> >>>> Does it fail (spoiler: it does not for me) or do you suspect it may
> fail?
> >>>
> >>> It fails in non-cross cases (amd64 target on amd64 host), regardless of
> the
> >>> value of ISAR_CROSS_COMPILE, with "Nothing PROVIDES 'linux-headers-amd64-
> native'".
> >>>
> >>> The patch below fixes it, by making the distro kernel dummy recipe
> provide it.
> >>> Although it should also be covered by multiarch.bbclass and your commit
> >>> 5c2299c718fa1548057d250318df5bddfea8e2b5, because that seems like a case
> where
> >>> we'd want to drop the '-native' from the dependency.
> >>> Maybe we need to examine the condition here...
> >>>
> >>> Adriaan
> >>>
> >>> ===
> >>> diff --git a/meta/recipes-kernel/linux/linux-distro.bb b/meta/recipes-
> kernel/linux/linux-distro.bb
> >>> index 13b8dc7e..16673b67 100644
> >>> --- a/meta/recipes-kernel/linux/linux-distro.bb
> >>> +++ b/meta/recipes-kernel/linux/linux-distro.bb
> >>> @@ -16,3 +16,5 @@ python() {
> >>>      if d.getVar('KERNEL_HEADERS_PKG'):
> >>>          d.appendVar('PROVIDES', ' ' + d.getVar('KERNEL_HEADERS_PKG'))
> >>>  }
> >>> +
> >>> +inherit multiarch
> >>> ===
> >>>
> >>
> >> This makes sense as linux-distro is a dummy package to please bitbake,
> >> an it does not generate and debian packages, thus does not inherit
> >> multiarch via dpkg-base.
> >>
> >> The reason why multiarch does not help us on example-module side is that
> >> we only append -native to dependencies, we do not remove it anywhere
> >> because we assume hat multiarch will augment PROVIDES with a -native
> >> target when there is no need for a separate one.
> >>
> >
> > In fact, we are also dropping -native from DEPENDS, in the anonymous
> > python block of multiarch.bbclass. Maybe we rather have an ordering
> > issues of all the magics?
> >
> 
> Ah, no, needed to read my own comment more carefully again: that removal
> is only for the case of enforced emulated builds, not for natural native
> ones.

Yes. I also had to read that twice ;)
And I think that's still the right way:

- if the native and "normal" package are the same, the "normal" recipe
  PROVIDES -native. And with v5 that's fixed for linux-distro.bb
- if the native and "normal" packages differ, but conditions (enforced
  emulated build) mean that we need "normal" even though the recipe DEPENDS
  on native, we change the DEPEND side. As it is currently.

Adriaan

> Jan
> 
> --
> Siemens AG, Technology
> Linux Expert Center

Patch

diff --git a/meta/recipes-kernel/linux-module/module.inc b/meta/recipes-kernel/linux-module/module.inc
index eddbf177..229e6a5c 100644
--- a/meta/recipes-kernel/linux-module/module.inc
+++ b/meta/recipes-kernel/linux-module/module.inc
@@ -17,7 +17,7 @@  PN .= "-${KERNEL_NAME}"
 
 KERNEL_IMAGE_PKG ??= "linux-image-${KERNEL_NAME}"
 KERNEL_HEADERS_PKG ??= "linux-headers-${KERNEL_NAME}"
-DEPENDS += "${KERNEL_HEADERS_PKG}"
+DEPENDS += "${KERNEL_HEADERS_PKG}-native"
 DEBIAN_BUILD_DEPENDS = "${KERNEL_HEADERS_PKG}"
 
 SIGNATURE_KEYFILE ??= ""
diff --git a/meta/recipes-kernel/linux/linux-custom.inc b/meta/recipes-kernel/linux/linux-custom.inc
index 0d222332..7b752f2b 100644
--- a/meta/recipes-kernel/linux/linux-custom.inc
+++ b/meta/recipes-kernel/linux/linux-custom.inc
@@ -116,11 +116,19 @@  HEADERS_DEPENDS:cross-profile = ", linux-kbuild-${KERNEL_NAME_PROVIDED}:${HOST_A
 
 # -native: kbuild package for host
 BUILD_PROFILES:class-native = "kbuild"
-RECIPE_PROVIDES:class-native = "linux-kbuild-${KERNEL_NAME_PROVIDED}-native"
+RECIPE_PROVIDES:class-native = " \
+    linux-headers-${KERNEL_NAME_PROVIDED} \
+    linux-kbuild-${KERNEL_NAME_PROVIDED}"
+# Use pseudo target to pull in the base variant of the recipe.
+# Will be auto-extended with -native by multiarch.bbclass.
+RDEPENDS:class-native += "${BPN}-pseudo"
 
 # -kbuildtarget: kbuild package for target, enforcing non-cross-build
 BUILD_PROFILES:class-kbuildtarget = "kbuild"
-RECIPE_PROVIDES:class-kbuildtarget = "linux-kbuild-${KERNEL_NAME_PROVIDED}"
+RECIPE_PROVIDES:class-kbuildtarget = " \
+    linux-headers-${KERNEL_NAME_PROVIDED} \
+    linux-kbuild-${KERNEL_NAME_PROVIDED}"
+RDEPENDS:class-kbuildtarget = "${BPN}"
 ISAR_CROSS_COMPILE:class-kbuildtarget = "0"
 
 # Make bitbake know we will be producing linux-image and linux-headers packages
@@ -132,11 +140,15 @@  RECIPE_PROVIDES = " \
     linux-libc-dev-${DISTRO_ARCH}-cross \
     linux-image-${KERNEL_NAME_PROVIDED}-dbg \
     linux-kbuild-${KERNEL_NAME_PROVIDED} \
+    ${BPN}-pseudo-native \
 "
 # When cross-profile is active:
-# kbuild package is provided by -native or -kbuildtarget variant
-# Otherwise it's provided by the default variant
-RECIPE_PROVIDES:remove:cross-profile = "linux-kbuild-${KERNEL_NAME_PROVIDED}"
+# kbuild package is provided by -native or -kbuildtarget variant. Also headers
+# provisioning moves over to ensure those variants are pulled, although the
+# package itself is still built by the base recipe.
+RECIPE_PROVIDES:remove:cross-profile = " \
+    linux-headers-${KERNEL_NAME_PROVIDED} \
+    linux-kbuild-${KERNEL_NAME_PROVIDED}"
 
 # Append headers depends
 HEADERS_DEPENDS = ", linux-kbuild-${KERNEL_NAME_PROVIDED}"
@@ -148,9 +160,6 @@  PROVIDES += "${RECIPE_PROVIDES}"
 # Append build profiles
 DEB_BUILD_PROFILES += "${BUILD_PROFILES}"
 
-# Add dependency to build -kbuildtarget and -native automatically
-RDEPENDS:append:cross-profile = " ${BPN}-native"
-
 def get_kernel_arch(d):
     distro_arch = d.getVar("DISTRO_ARCH")
     if distro_arch in ["amd64", "i386"]:
diff --git a/meta/recipes-kernel/linux/linux-distro.bb b/meta/recipes-kernel/linux/linux-distro.bb
index bc43528c..13b8dc7e 100644
--- a/meta/recipes-kernel/linux/linux-distro.bb
+++ b/meta/recipes-kernel/linux/linux-distro.bb
@@ -10,6 +10,7 @@  python() {
     for kernel in distro_kernels.split():
         d.appendVar('PROVIDES', ' linux-image-' + kernel)
         d.appendVar('PROVIDES', ' linux-headers-' + kernel)
+        d.appendVar('PROVIDES', ' linux-kbuild-' + kernel)
     if d.getVar('KERNEL_IMAGE_PKG'):
         d.appendVar('PROVIDES', ' ' + d.getVar('KERNEL_IMAGE_PKG'))
     if d.getVar('KERNEL_HEADERS_PKG'):