[PATCH] linux-custom: Speedup build of target specific linux-kbuild package

7 views
Skip to first unread message

Stefan Koch

unread,
Jun 4, 2024, 11:39:30 AMJun 4
to isar-...@googlegroups.com, stefa...@siemens.com, jan.k...@siemens.com, christi...@siemens.com, michae...@siemens.com, simon....@siemens.com, cedric.h...@siemens.com, adriaan...@siemens.com, felix.mo...@siemens.com, ub...@ilbers.de, ami...@ilbers.de
Avoids time expensive QEMU-emulated merging of kernel config
by using a pregenerated kernel config for target specific linux-kbuild

Using DEPENDS instead of RDEPENDS ensures creation of
pregenerated kernel config before build of target specific linux-kbuild

Signed-off-by: Stefan Koch <stefa...@siemens.com>
---
.../linux/files/debian/control.tmpl | 8 ++++++++
.../linux/files/debian/isar/common.tmpl | 2 ++
.../linux/files/debian/isar/configure.tmpl | 18 ++++++++++++++----
.../linux/files/debian/isar/install.tmpl | 15 +++++++++++++++
meta/recipes-kernel/linux/linux-custom.inc | 14 +++++++++-----
5 files changed, 48 insertions(+), 9 deletions(-)

diff --git a/meta/recipes-kernel/linux/files/debian/control.tmpl b/meta/recipes-kernel/linux/files/debian/control.tmpl
index e0e932a0..fa2b4e12 100644
--- a/meta/recipes-kernel/linux/files/debian/control.tmpl
+++ b/meta/recipes-kernel/linux/files/debian/control.tmpl
@@ -50,6 +50,14 @@ Description: Linux kernel debugging symbols for @KR@
This package will come in handy if you need to debug the kernel. It provides
all the necessary debug symbols for the kernel and its modules.

+Package: linux-config-${KERNEL_NAME_PROVIDED}
+Build-Profiles: <kconfig>
+Architecture: all
+Depends: ${perl:Depends}, ${shlib:Depends}
+Description: ${KERNEL_NAME_PROVIDED} Linux kernel config for @KR@
+ This package provides the kernel config for @KR@
+ The target specific linux-kbuild package benefits from a reduced build time.
+
Package: linux-kbuild-${KERNEL_NAME_PROVIDED}
Build-Profiles: <kbuild !cross>
Architecture: any
diff --git a/meta/recipes-kernel/linux/files/debian/isar/common.tmpl b/meta/recipes-kernel/linux/files/debian/isar/common.tmpl
index 86af70c5..6666c414 100644
--- a/meta/recipes-kernel/linux/files/debian/isar/common.tmpl
+++ b/meta/recipes-kernel/linux/files/debian/isar/common.tmpl
@@ -10,6 +10,7 @@ KERNEL_PKG_IMAGE=linux-image-${KERNEL_NAME_PROVIDED}
KERNEL_PKG_KERN_HEADERS=linux-headers-${KERNEL_NAME_PROVIDED}
KERNEL_PKG_LIBC_HEADERS=linux-libc-dev
KERNEL_PKG_LIBC_HEADERS_CROSS=linux-libc-dev-${DISTRO_ARCH}-cross
+KERNEL_PKG_KERN_CONFIG=linux-config-${KERNEL_NAME_PROVIDED}
KERNEL_PKG_KERN_KBUILD=linux-kbuild-${KERNEL_NAME_PROVIDED}
KERNEL_PKG_KERN_KBUILD_CROSS=${KERNEL_PKG_KERN_KBUILD}-${DISTRO_ARCH}-cross

@@ -32,6 +33,7 @@ deb_dbg_dir=${deb_img_dir}-dbg
deb_kern_hdr_dir=${deb_top_dir}/${KERNEL_PKG_KERN_HEADERS}
deb_libc_hdr_dir=${deb_top_dir}/${KERNEL_PKG_LIBC_HEADERS}
deb_libc_hdr_cross_dir=${deb_top_dir}/${KERNEL_PKG_LIBC_HEADERS_CROSS}
+deb_kern_config_dir=${deb_top_dir}/${KERNEL_PKG_KERN_CONFIG}
deb_kern_kbuild_dir=${deb_top_dir}/${KERNEL_PKG_KERN_KBUILD}
deb_kern_kbuild_cross_dir=${deb_top_dir}/${KERNEL_PKG_KERN_KBUILD_CROSS}

diff --git a/meta/recipes-kernel/linux/files/debian/isar/configure.tmpl b/meta/recipes-kernel/linux/files/debian/isar/configure.tmpl
index 389c9a85..19797b84 100644
--- a/meta/recipes-kernel/linux/files/debian/isar/configure.tmpl
+++ b/meta/recipes-kernel/linux/files/debian/isar/configure.tmpl
@@ -10,10 +10,20 @@ do_configure() {
# Trace what we do here
set -x

- # Process kernel config target and fragments
- ${MAKE} O=${KERNEL_BUILD_DIR} ${KERNEL_CONFIG_TARGET}
- ./scripts/kconfig/merge_config.sh -O ${KERNEL_BUILD_DIR}/ \
- ${KERNEL_BUILD_DIR}/.config ${KERNEL_CONFIG_FRAGMENTS}
+ configdir=/usr/lib/linux-config-${PV}
+ if [ -e ${configdir}/kernelconfig ]; then
+ # Prefer pregenerated kernel config
+ # So, very expensive QEMU-emulated merge_config.sh
+ # can be skipped for target specific linux-kbuild package
+ mkdir -p ${KERNEL_BUILD_DIR}
+ cp ${configdir}/kernelconfig ${KERNEL_BUILD_DIR}/.config
+ ${MAKE} O=${KERNEL_BUILD_DIR} olddefconfig
+ else
+ # Process kernel config target and fragments
+ ${MAKE} O=${KERNEL_BUILD_DIR} ${KERNEL_CONFIG_TARGET}
+ ./scripts/kconfig/merge_config.sh -O ${KERNEL_BUILD_DIR}/ \
+ ${KERNEL_BUILD_DIR}/.config ${KERNEL_CONFIG_FRAGMENTS}
+ fi

# Stop tracing
set +x
diff --git a/meta/recipes-kernel/linux/files/debian/isar/install.tmpl b/meta/recipes-kernel/linux/files/debian/isar/install.tmpl
index 00011517..3387671c 100644
--- a/meta/recipes-kernel/linux/files/debian/isar/install.tmpl
+++ b/meta/recipes-kernel/linux/files/debian/isar/install.tmpl
@@ -33,6 +33,13 @@ do_install() {
# Trace what we do here
set -x

+ if echo "${DEB_BUILD_PROFILES}" | grep -q "kconfig"; then
+ # Install kernel config
+ # The target specific linux-kbuild package can speedup
+ # the build using this pregenerated kernel config
+ install_kconf ${deb_kern_config_dir}
+ fi
+
if echo "${DEB_BUILD_PROFILES}" | grep -q "kbuild"; then
# Install kernel scripts and tools
if echo "${DEB_BUILD_PROFILES}" | grep -q "cross"; then
@@ -223,6 +230,14 @@ install_headers() {
kernel_headers
}

+install_kconf() {
+ kernel_kconf_dir=usr/lib/linux-config-${PV}
+ destdir=${1}/${kernel_kconf_dir}
+
+ mkdir -p ${destdir}
+ cp ${O}/${KCONF} ${destdir}/kernelconfig
+}
+
install_kbuild() {
kernel_kbuild_dir=usr/lib/linux-kbuild-${krel}
destdir=${1}/${kernel_kbuild_dir}
diff --git a/meta/recipes-kernel/linux/linux-custom.inc b/meta/recipes-kernel/linux/linux-custom.inc
index 647f09dd..b21a90f3 100644
--- a/meta/recipes-kernel/linux/linux-custom.inc
+++ b/meta/recipes-kernel/linux/linux-custom.inc
@@ -25,6 +25,7 @@ KBUILD_DEPENDS ?= "build-essential:native, \
flex, \
git, \
kmod, \
+ linux-config-${KERNEL_NAME_PROVIDED} <kbuild !kconfig>, \
rsync,"

KERNEL_DEBIAN_DEPENDS ?= "initramfs-tools | linux-initramfs-tool, \
@@ -106,14 +107,14 @@ python() {
}

# Default profiles and provides
-BUILD_PROFILES = "kernel kbuild"
+BUILD_PROFILES = "kernel kconfig kbuild"

# We only offer the -kbuildtarget variant when actually cross compiling
BBCLASSEXTEND:append:cross-profile = " kbuildtarget"

# When cross-profile is active:
-# build only kernel with the default variant of the recipe
-BUILD_PROFILES:cross-profile = "kernel"
+# build only kernel and package config with the default variant of the recipe
+BUILD_PROFILES:cross-profile = "kernel kconfig"

# -native: kbuild package for host
BUILD_PROFILES:class-native = "kbuild"
@@ -122,14 +123,17 @@ RECIPE_PROVIDES:class-native = " \
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"
+# Using DEPENDS, see below
+DEPENDS:class-native += "${BPN}-pseudo"

# -kbuildtarget: kbuild package for target, enforcing non-cross-build
BUILD_PROFILES:class-kbuildtarget = "kbuild"
RECIPE_PROVIDES:class-kbuildtarget = " \
linux-headers-${KERNEL_NAME_PROVIDED} \
linux-kbuild-${KERNEL_NAME_PROVIDED}"
-RDEPENDS:class-kbuildtarget = "${BPN}"
+# Using DEPENDS instead of RDEPENDS to ensure creation of pregenerated
+# kernel config before build of target specific linux-kbuild package
+DEPENDS:class-kbuildtarget = "${BPN}"
ISAR_CROSS_COMPILE:class-kbuildtarget = "0"

# Make bitbake know we will be producing linux-image and linux-headers packages
--
2.39.2

Jan Kiszka

unread,
Jun 4, 2024, 12:18:40 PMJun 4
to Stefan Koch, isar-...@googlegroups.com, christi...@siemens.com, michae...@siemens.com, simon....@siemens.com, cedric.h...@siemens.com, adriaan...@siemens.com, felix.mo...@siemens.com, ub...@ilbers.de, ami...@ilbers.de
On 04.06.24 17:39, Stefan Koch wrote:
> Avoids time expensive QEMU-emulated merging of kernel config
> by using a pregenerated kernel config for target specific linux-kbuild
>

Hmm, it's a bit heavier to install, but we already have the config
packaged: in linux-image under /boot/config-*. Or is this not always the
case?

Jan
Siemens AG, Technology
Linux Expert Center

Koch, Stefan

unread,
Jun 7, 2024, 9:45:48 AMJun 7
to isar-...@googlegroups.com, Kiszka, Jan, Storm, Christian, cedric.h...@siemens.com, Adler, Michael, ami...@ilbers.de, Sudler, Simon, ub...@ilbers.de, MOESSBAUER, Felix, Schmidt, Adriaan
On Tue, 2024-06-04 at 18:18 +0200, Jan Kiszka wrote:
> > On 04.06.24 17:39, Stefan Koch wrote:
> > > > Avoids time expensive QEMU-emulated merging of kernel config
> > > > by using a pregenerated kernel config for target specific
> > > > linux-kbuild
> > > >
> >
> > Hmm, it's a bit heavier to install, but we already have the config
> > packaged: in linux-image under /boot/config-*. Or is this not
> > always
> > the
> > case?
Yes, that's right. I'll send an updated patch.
It will copy the config from linux-image while build time is the same
as with separate linux-config package.
Stefan Koch
Siemens AG
www.siemens.com

--
Stefan Koch
Siemens AG
www.siemens.com

Stefan Koch

unread,
Jun 7, 2024, 10:11:34 AMJun 7
to isar-...@googlegroups.com, stefa...@siemens.com, jan.k...@siemens.com, christi...@siemens.com, michae...@siemens.com, simon....@siemens.com, cedric.h...@siemens.com, adriaan...@siemens.com, felix.mo...@siemens.com, ub...@ilbers.de, ami...@ilbers.de
Avoids time expensive QEMU-emulated merging of kernel config by using
the existing kernel config for the target specific linux-kbuild

Using DEPENDS instead of RDEPENDS ensures creation of
kernel (including config) before build of target specific linux-kbuild

Signed-off-by: Stefan Koch <stefa...@siemens.com>
---
.../linux/files/debian/isar/configure.tmpl | 18 ++++++++++++++----
meta/recipes-kernel/linux/linux-custom.inc | 10 +++++++---
2 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/meta/recipes-kernel/linux/files/debian/isar/configure.tmpl b/meta/recipes-kernel/linux/files/debian/isar/configure.tmpl
index 389c9a85..72eae448 100644
--- a/meta/recipes-kernel/linux/files/debian/isar/configure.tmpl
+++ b/meta/recipes-kernel/linux/files/debian/isar/configure.tmpl
@@ -10,10 +10,20 @@ do_configure() {
# Trace what we do here
set -x

- # Process kernel config target and fragments
- ${MAKE} O=${KERNEL_BUILD_DIR} ${KERNEL_CONFIG_TARGET}
- ./scripts/kconfig/merge_config.sh -O ${KERNEL_BUILD_DIR}/ \
- ${KERNEL_BUILD_DIR}/.config ${KERNEL_CONFIG_FRAGMENTS}
+ kernelconfig="$(find /boot -maxdepth 1 -name "config-${PV}*" -print -quit)"
+ if [ -e "${kernelconfig}" ]; then
+ # Prefer existing kernel config
+ # So, very expensive QEMU-emulated merge_config.sh
+ # can be skipped for target specific linux-kbuild package
+ mkdir -p ${KERNEL_BUILD_DIR}
+ cp "${kernelconfig}" ${KERNEL_BUILD_DIR}/.config
+ ${MAKE} O=${KERNEL_BUILD_DIR} olddefconfig
+ else
+ # Process kernel config target and fragments
+ ${MAKE} O=${KERNEL_BUILD_DIR} ${KERNEL_CONFIG_TARGET}
+ ./scripts/kconfig/merge_config.sh -O ${KERNEL_BUILD_DIR}/ \
+ ${KERNEL_BUILD_DIR}/.config ${KERNEL_CONFIG_FRAGMENTS}
+ fi

# Stop tracing
set +x
diff --git a/meta/recipes-kernel/linux/linux-custom.inc b/meta/recipes-kernel/linux/linux-custom.inc
index 647f09dd..dc354e13 100644
--- a/meta/recipes-kernel/linux/linux-custom.inc
+++ b/meta/recipes-kernel/linux/linux-custom.inc
@@ -25,6 +25,7 @@ KBUILD_DEPENDS ?= "build-essential:native, \
flex, \
git, \
kmod, \
+ linux-image-${KERNEL_NAME_PROVIDED}:${DISTRO_ARCH} <kbuild !kernel>, \
rsync,"

KERNEL_DEBIAN_DEPENDS ?= "initramfs-tools | linux-initramfs-tool, \
@@ -112,7 +113,7 @@ BUILD_PROFILES = "kernel kbuild"
BBCLASSEXTEND:append:cross-profile = " kbuildtarget"

# When cross-profile is active:
-# build only kernel with the default variant of the recipe
+# build only kernel (including config) with the default variant of the recipe
BUILD_PROFILES:cross-profile = "kernel"

# -native: kbuild package for host
@@ -122,14 +123,17 @@ RECIPE_PROVIDES:class-native = " \
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"
+# Using DEPENDS, see below
+DEPENDS:class-native += "${BPN}-pseudo"

# -kbuildtarget: kbuild package for target, enforcing non-cross-build
BUILD_PROFILES:class-kbuildtarget = "kbuild"
RECIPE_PROVIDES:class-kbuildtarget = " \
linux-headers-${KERNEL_NAME_PROVIDED} \
linux-kbuild-${KERNEL_NAME_PROVIDED}"
-RDEPENDS:class-kbuildtarget = "${BPN}"
+# Using DEPENDS instead of RDEPENDS to ensure creation of kernel including
+# pregenerated kernel config before target specific linux-kbuild package build
+DEPENDS:class-kbuildtarget = "${BPN}"
ISAR_CROSS_COMPILE:class-kbuildtarget = "0"

# Make bitbake know we will be producing linux-image and linux-headers packages
--
2.39.2

Jan Kiszka

unread,
Jun 7, 2024, 11:08:07 AMJun 7
to Stefan Koch, isar-...@googlegroups.com, christi...@siemens.com, michae...@siemens.com, simon....@siemens.com, cedric.h...@siemens.com, adriaan...@siemens.com, felix.mo...@siemens.com, ub...@ilbers.de, ami...@ilbers.de
On 07.06.24 16:11, Stefan Koch wrote:
> Avoids time expensive QEMU-emulated merging of kernel config by using
> the existing kernel config for the target specific linux-kbuild
>
> Using DEPENDS instead of RDEPENDS ensures creation of
> kernel (including config) before build of target specific linux-kbuild
>
> Signed-off-by: Stefan Koch <stefa...@siemens.com>
> ---
> .../linux/files/debian/isar/configure.tmpl | 18 ++++++++++++++----
> meta/recipes-kernel/linux/linux-custom.inc | 10 +++++++---
> 2 files changed, 21 insertions(+), 7 deletions(-)
>
> diff --git a/meta/recipes-kernel/linux/files/debian/isar/configure.tmpl b/meta/recipes-kernel/linux/files/debian/isar/configure.tmpl
> index 389c9a85..72eae448 100644
> --- a/meta/recipes-kernel/linux/files/debian/isar/configure.tmpl
> +++ b/meta/recipes-kernel/linux/files/debian/isar/configure.tmpl
> @@ -10,10 +10,20 @@ do_configure() {
> # Trace what we do here
> set -x
>
> - # Process kernel config target and fragments
> - ${MAKE} O=${KERNEL_BUILD_DIR} ${KERNEL_CONFIG_TARGET}
> - ./scripts/kconfig/merge_config.sh -O ${KERNEL_BUILD_DIR}/ \
> - ${KERNEL_BUILD_DIR}/.config ${KERNEL_CONFIG_FRAGMENTS}
> + kernelconfig="$(find /boot -maxdepth 1 -name "config-${PV}*" -print -quit)"

Can we additionally limit this to the case were we expect the config
there (kbuild && !kernel)? Just to reduce the risk that some "this
should never be there" config is ever silently pulled by the base
package build. Only if our dependency is installed, that rather generic
config-<version> file is from there, or we failed on installing the
dependency.
Need to help me with remember my own code: Why do we also need this
build dependency? I thought you are only optimizing the kbuildtarget case.

>
> # -kbuildtarget: kbuild package for target, enforcing non-cross-build
> BUILD_PROFILES:class-kbuildtarget = "kbuild"
> RECIPE_PROVIDES:class-kbuildtarget = " \
> linux-headers-${KERNEL_NAME_PROVIDED} \
> linux-kbuild-${KERNEL_NAME_PROVIDED}"
> -RDEPENDS:class-kbuildtarget = "${BPN}"
> +# Using DEPENDS instead of RDEPENDS to ensure creation of kernel including
> +# pregenerated kernel config before target specific linux-kbuild package build
> +DEPENDS:class-kbuildtarget = "${BPN}"
> ISAR_CROSS_COMPILE:class-kbuildtarget = "0"
>
> # Make bitbake know we will be producing linux-image and linux-headers packages

Fine-tuning - this generally looks like a nice optimization now!

Jan

Koch, Stefan

unread,
Jun 7, 2024, 11:37:48 AMJun 7
to isar-...@googlegroups.com, Kiszka, Jan, Storm, Christian, cedric.h...@siemens.com, Adler, Michael, ami...@ilbers.de, Sudler, Simon, ub...@ilbers.de, MOESSBAUER, Felix, Schmidt, Adriaan
Build profile can be checked here as second condition, too.

find with "config-${PV}*" is used because some kernel specify "-rt18"
or "-isar" or something else that is not included in PV:

/boot/config-5.10.209-audis-rtp-rt18
/boot/config-6.6.11-isar

Some kernel do not specify an suffix to ${PV}. Maybe it depends on
LOCALVERISON from the kernel config? But as kernel config is not
available, we cannot find out this information...

find returns the first match. When using the old isar-buildchroot
instead of sbuild/schroot: Multiple configs could exist - if multiple
kernels are built. But if ${PV} is identical dpkg should have a
conflict with overwriting an existing config with the same version? (as
long this "-rt18"/"-isar" suffix is not renamed for that build.)

See below for dependency problem.
That ensures installation of the dependency.
> >                     rsync,"
> >  
> >  KERNEL_DEBIAN_DEPENDS ?= "initramfs-tools | linux-initramfs-tool,
> > \
> > @@ -112,7 +113,7 @@ BUILD_PROFILES = "kernel kbuild"
> >  BBCLASSEXTEND:append:cross-profile = " kbuildtarget"
> >  
> >  # When cross-profile is active:
> > -# build only kernel with the default variant of the recipe
> > +# build only kernel (including config) with the default variant of
> > the recipe
> >  BUILD_PROFILES:cross-profile = "kernel"
> >  
> >  # -native: kbuild package for host
> > @@ -122,14 +123,17 @@ RECIPE_PROVIDES:class-native = " \
> >      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"
> > +# Using DEPENDS, see below
> > +DEPENDS:class-native += "${BPN}-pseudo"
>
> Need to help me with remember my own code: Why do we also need this
> build dependency? I thought you are only optimizing the kbuildtarget
> case.
Kernel config is also read from linux-image for linux-kbuild-native.
When choosing to call merge_config.sh here again, this change would not
be needed. Then a different build profile must be added, because
<kernel !kbuild> won't match anymore.
>
> >  
> >  # -kbuildtarget: kbuild package for target, enforcing non-cross-
> > build
> >  BUILD_PROFILES:class-kbuildtarget = "kbuild"
> >  RECIPE_PROVIDES:class-kbuildtarget = " \
> >      linux-headers-${KERNEL_NAME_PROVIDED} \
> >      linux-kbuild-${KERNEL_NAME_PROVIDED}"
> > -RDEPENDS:class-kbuildtarget = "${BPN}"
> > +# Using DEPENDS instead of RDEPENDS to ensure creation of kernel
> > including
> > +# pregenerated kernel config before target specific linux-kbuild
> > package build
> > +DEPENDS:class-kbuildtarget = "${BPN}"
> >  ISAR_CROSS_COMPILE:class-kbuildtarget = "0"
> >  
> >  # Make bitbake know we will be producing linux-image and linux-
> > headers packages
>
> Fine-tuning - this generally looks like a nice optimization now!
>
> Jan
>

--

Stefan Koch

unread,
Jun 10, 2024, 11:44:35 AMJun 10
to isar-...@googlegroups.com, stefa...@siemens.com, jan.k...@siemens.com, christi...@siemens.com, michae...@siemens.com, simon....@siemens.com, cedric.h...@siemens.com, adriaan...@siemens.com, felix.mo...@siemens.com, ub...@ilbers.de, ami...@ilbers.de
Avoids time expensive QEMU-emulated merging of kernel config by using
the existing kernel config for the target specific linux-kbuild.
The host specific linux-kbuild package
uses the existing kernel config, too.

Using DEPENDS instead of RDEPENDS ensures creation of
kernel (including config) before build of
target and host specific linux-kbuild packages.

Signed-off-by: Stefan Koch <stefa...@siemens.com>
---
.../linux/files/debian/isar/configure.tmpl | 22 +++++++++++++++----
meta/recipes-kernel/linux/linux-custom.inc | 11 +++++++---
2 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/meta/recipes-kernel/linux/files/debian/isar/configure.tmpl b/meta/recipes-kernel/linux/files/debian/isar/configure.tmpl
index 389c9a85..73f554ed 100644
--- a/meta/recipes-kernel/linux/files/debian/isar/configure.tmpl
+++ b/meta/recipes-kernel/linux/files/debian/isar/configure.tmpl
@@ -10,10 +10,24 @@ do_configure() {
# Trace what we do here
set -x

- # Process kernel config target and fragments
- ${MAKE} O=${KERNEL_BUILD_DIR} ${KERNEL_CONFIG_TARGET}
- ./scripts/kconfig/merge_config.sh -O ${KERNEL_BUILD_DIR}/ \
- ${KERNEL_BUILD_DIR}/.config ${KERNEL_CONFIG_FRAGMENTS}
+ kernelconfig="$(find /boot -maxdepth 1 -name "config-${PV}*" -print -quit)"
+ if echo "${DEB_BUILD_PROFILES}" | grep -q "kbuild" && \
+ ! echo "${DEB_BUILD_PROFILES}" | grep -q "kernel" && \
+ [ -e "${kernelconfig}" ]; then
+ # Prefer existing kernel config
+ # So, very expensive QEMU-emulated merge_config.sh
+ # can be skipped for target specific linux-kbuild package
+ # The host specific linux-kbuild package
+ # uses the existing kernel config, too.
+ mkdir -p ${KERNEL_BUILD_DIR}
+ cp "${kernelconfig}" ${KERNEL_BUILD_DIR}/.config
+ ${MAKE} O=${KERNEL_BUILD_DIR} olddefconfig
+ else
+ # Process kernel config target and fragments
+ ${MAKE} O=${KERNEL_BUILD_DIR} ${KERNEL_CONFIG_TARGET}
+ ./scripts/kconfig/merge_config.sh -O ${KERNEL_BUILD_DIR}/ \
+ ${KERNEL_BUILD_DIR}/.config ${KERNEL_CONFIG_FRAGMENTS}
+ fi

# Stop tracing
set +x
diff --git a/meta/recipes-kernel/linux/linux-custom.inc b/meta/recipes-kernel/linux/linux-custom.inc
index 647f09dd..6aa70fd3 100644
--- a/meta/recipes-kernel/linux/linux-custom.inc
+++ b/meta/recipes-kernel/linux/linux-custom.inc
@@ -25,6 +25,7 @@ KBUILD_DEPENDS ?= "build-essential:native, \
flex, \
git, \
kmod, \
+ linux-image-${KERNEL_NAME_PROVIDED}:${DISTRO_ARCH} <kbuild !kernel>, \
rsync,"

KERNEL_DEBIAN_DEPENDS ?= "initramfs-tools | linux-initramfs-tool, \
@@ -112,7 +113,7 @@ BUILD_PROFILES = "kernel kbuild"
BBCLASSEXTEND:append:cross-profile = " kbuildtarget"

# When cross-profile is active:
-# build only kernel with the default variant of the recipe
+# build only kernel (including config) with the default variant of the recipe
BUILD_PROFILES:cross-profile = "kernel"

# -native: kbuild package for host
@@ -122,14 +123,18 @@ RECIPE_PROVIDES:class-native = " \
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"
+# Using DEPENDS instead of RDEPENDS to ensure creation of kernel including
+# pregenerated kernel config before host specific linux-kbuild package build
+DEPENDS:class-native += "${BPN}-pseudo"

# -kbuildtarget: kbuild package for target, enforcing non-cross-build
BUILD_PROFILES:class-kbuildtarget = "kbuild"
RECIPE_PROVIDES:class-kbuildtarget = " \
linux-headers-${KERNEL_NAME_PROVIDED} \
linux-kbuild-${KERNEL_NAME_PROVIDED}"
-RDEPENDS:class-kbuildtarget = "${BPN}"
+# Using DEPENDS instead of RDEPENDS to ensure creation of kernel including
+# pregenerated kernel config before target specific linux-kbuild package build
+DEPENDS:class-kbuildtarget = "${BPN}"
ISAR_CROSS_COMPILE:class-kbuildtarget = "0"

# Make bitbake know we will be producing linux-image and linux-headers packages
--
2.39.2

Uladzimir Bely

unread,
Jun 17, 2024, 1:25:20 AMJun 17
to Stefan Koch, isar-...@googlegroups.com
Applied to next, thanks.

--
Best regards,
Uladzimir.
Reply all
Reply to author
Forward
0 new messages