Re: [PATCH v6 11/12] kbuild: deb-pkg: improve the usability of source package

Péter Ujfalusi
2023-03-08T12:29:22Z

On 15/02/2023 03:20, Masahiro Yamada wrote:
> Improve the source package support in case the dpkg-buildpackage is
> directly used to build binary packages.
>
> For cross-compiling, you can set CROSS_COMPILE via the environment
> variable, but it is better to set it automatically - set it to
> ${DEB_HOST_GNU_TYPE}- if we are cross-compiling but not from the top
> Makefile.
>
> The generated source package may be carried to a different build
> environment, which may have a different compiler installed.
> Run olddefconfig first to set new CONFIG options to their default
> values without prompting.
>
> Take KERNELRELEASE and KBUILD_BUILD_VERSION from the version field of
> debian/changelog in case it is updated afterwards.

I just arrived to this patch when trying to update the kernel for SOF
from 6.2.0 base to 6.3.0-rc1:
https://github.com/thesofproject/linux/pull/4223#issuecomment-1459997676

Our CI is building a kernel deb package from PRs to test with this command:
make bindeb-pkg LOCALVERSION=-$PRIDV-default KDEB_PKGVERSION=$(make
kernelversion)-$GITSHA

The files, directories and the name of the deb package follows the rule
set up by scripts/setlocalversion, taking into account the LOCALVERSION,
CONFIG_LOCALVERSION and CONFIG_LOCALVERSION_AUTO, but the built kernel
is using the version derived from KDEB_PKGVERSION and the system is not
able to boot up since the modules are in a different directory then they
should be.

Something like this:
make bindeb-pkg LOCALVERSION=-testbuild
vmlinuz-6.3.0-rc1-testbuild-05827-g863ad81a6aa9-dirty
/lib/modules/6.3.0-rc1-testbuild-05827-g863ad81a6aa9-dirty/

strings vmlinuz-6.3.0-rc1-testbuild-05827-g863ad81a6aa9-dirty | grep 6.3
6.3.0-rc1-testbuild-05827-g863ad81a6aa9-dirty

Then with the KDEB_PKGVERSION:
make bindeb-pkg LOCALVERSION=-testbuild KDEB_PKGVERSION=$(make
kernelversion)-notworking
vmlinuz-6.3.0-rc1-testbuild-05827-g863ad81a6aa9-dirty
/lib/modules/6.3.0-rc1-testbuild-05827-g863ad81a6aa9-dirty/

strings vmlinuz-6.3.0-rc1-testbuild-05827-g863ad81a6aa9-dirty | grep 6.3
6.3.0-rc1

in this case modprobe will not find the modules, it is looking for them
under /lib/modules/6.3.0-rc1

Reverting this patch makes the created deb package usable, the system
is bootable.

We use the LOCALVERSION to feed in PR inforamtion and the
KDEB_PKGVERSION is used fro additional information, like build ID.

Do you have any suggestion on how to get the functionality back or we
must stop using the KDEB_PKGVERSION altogether?

Thank you,
--
Péter

>
> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
> ---
>
> Changes in v6:
> - New patch
>
> scripts/package/deb-build-option | 16 ++++++++++++++++
> scripts/package/mkdebian | 9 ++++-----
> 2 files changed, 20 insertions(+), 5 deletions(-)
> create mode 100755 scripts/package/deb-build-option
>
> diff --git a/scripts/package/deb-build-option b/scripts/package/deb-build-option
> new file mode 100755
> index 000000000000..b079b0d121d4
> --- /dev/null
> +++ b/scripts/package/deb-build-option
> @@ -0,0 +1,16 @@
> +#!/bin/sh
> +# SPDX-License-Identifier: GPL-2.0-only
> +
> +# Set up CROSS_COMPILE if we are cross-compiling, but not called from the
> +# kernel toplevel Makefile
> +if [ -z "${CROSS_COMPILE}${cross_compiling}" -a "${DEB_HOST_ARCH}" != "${DEB_BUILD_ARCH}" ]; then
> + echo CROSS_COMPILE=${DEB_HOST_GNU_TYPE}-
> +fi
> +
> +version=$(dpkg-parsechangelog -S Version)
> +version_upstream="${version%-*}"
> +debian_revision="${version#${version_upstream}}"
> +debian_revision="${debian_revision#*-}"
> +
> +echo KERNELRELEASE=${version_upstream}
> +echo KBUILD_BUILD_VERSION=${debian_revision}
> diff --git a/scripts/package/mkdebian b/scripts/package/mkdebian
> index eef20d5dc288..f74380036bb5 100755
> --- a/scripts/package/mkdebian
> +++ b/scripts/package/mkdebian
> @@ -90,10 +90,8 @@ rm -rf debian
> version=$KERNELRELEASE
> if [ -n "$KDEB_PKGVERSION" ]; then
> packageversion=$KDEB_PKGVERSION
> - revision=${packageversion##*-}
> else
> - revision=$($srctree/init/build-version)
> - packageversion=$version-$revision
> + packageversion=$version-$($srctree/init/build-version)
> fi
> sourcename=${KDEB_SOURCENAME:-linux-upstream}
>
> @@ -244,8 +242,9 @@ srctree ?= .
>
> build-indep:
> build-arch:
> - \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \
> - KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile
> + \$(MAKE) -f \$(srctree)/Makefile ARCH=${ARCH} \
> + \$(shell \$(srctree)/scripts/package/deb-build-option) \
> + olddefconfig all
>
> build: build-arch
>

--
Péter