ACK: [SRU bionic:linux] [1/1] UBUNTU: [Packaging] sync dkms-build to updated API
Kelsey Skunberg
kelsey.skunberg at canonical.com
Mon Mar 1 23:59:17 UTC 2021
On 2021-02-26 16:33:18 , Andy Whitcroft wrote:
> We have two forms of dkms-build* in use in our package in various series.
> These have different APIs, from 18.10 we add an additional parameter
> to allow handling of debug packages. Having two incompatible APIs for
> dkms-build significantly complicates the application of fixes for this
> scripting, and thus complicates maintenance of both the kernel and LRM.
> Switch 18.04 to the new debug aware API.
>
> We also have some additional functionality for handling debug packages
> for DKMS builds. In later series we use this to supply ZFS debug
> packages (though this patch set does not enable those).
>
> Finally we have two different versions of fix-filenames which the newer
> of which contains an alignment fix and a cleaner pad character. Also
> sync this while we are at it.
>
> Contains the bulk of the following commits:
>
> UBUNTU: [Debian]: Remove hardcoded $(pkgdir) in debug symbols handling
> UBUNTU: [Debian]: Handle debug symbols for modules in extras too
> UBUNTU: [Debian]: Check/link modules with debug symbols after DKMS modules
> UBUNTU: [Debian]: Warn about modules without debug symbols
> UBUNTU: [Debian]: dkms-build: new parameter for debug package directory
> UBUNTU: [Debian]: dkms-build: Move zfs special-casing into configure script
> UBUNTU: [Debian]: dkms-build: Avoid executing post-processor scripts twice
> UBUNTU: [Packaging] dkms-build -- remove retpoline data from final binary packages
> UBUNTU: [Packaging] dkms-build--nvidia* -- check gcc version against primary build
> UBUNTU: [Packaging] fix-filenames -- handle exact string removal
> UBUNTU: [Packaging] dkms-build--nvidia-N -- remove GCC versions
>
> BugLink: https://bugs.launchpad.net/bugs/1917034
> Signed-off-by: Andy Whitcroft <apw at canonical.com>
Acked-by: Kelsey Skunberg <kelsey.skunberg at canonical.com>
> ---
> debian/rules.d/2-binary-arch.mk | 49 +++++++++++++----------
> debian/scripts/dkms-build | 60 +++++++++++++++++++++++++++--
> debian/scripts/dkms-build--nvidia-N | 38 +++++++++++++++---
> debian/scripts/fix-filenames.c | 13 +++++--
> 4 files changed, 129 insertions(+), 31 deletions(-)
>
> diff --git a/debian/rules.d/2-binary-arch.mk b/debian/rules.d/2-binary-arch.mk
> index a8a1b9f593b0..db990d5bee3e 100644
> --- a/debian/rules.d/2-binary-arch.mk
> +++ b/debian/rules.d/2-binary-arch.mk
> @@ -60,13 +60,13 @@ define build_dkms_sign =
> )
> endef
> define build_dkms =
> - $(SHELL) $(DROOT)/scripts/dkms-build $(dkms_dir) $(abi_release)-$* '$(call build_dkms_sign,$(builddir)/build-$*)' $(1) $(2) $(3) $(4)
> + CROSS_COMPILE=$(CROSS_COMPILE) $(SHELL) $(DROOT)/scripts/dkms-build $(dkms_dir) $(abi_release)-$* '$(call build_dkms_sign,$(builddir)/build-$*)' $(1) $(2) $(3) $(4) $(5)
> endef
>
> # nvidia_build_payload 450 450 450_450.102.04-0ubuntu0.20.04.1
> # nvidia_build_payload 450-server 450srv 50.102.04-0ubuntu0.20.04.1
> define nvidia_build_payload =
> - $(call build_dkms, $(bldinfo_pkg_name)-$*, $(pkgdir_bldinfo)/usr/lib/linux/$(abi_release)-$*/signatures, nvidia-$(2), pool/restricted/n/nvidia-graphics-drivers-$(1)/nvidia-kernel-source-$(1)_$(3)_$(arch).deb pool/restricted/n/nvidia-graphics-drivers-$(1)/nvidia-dkms-$(1)_$(3)_$(arch).deb)
> + $(call build_dkms, $(bldinfo_pkg_name)-$*, $(pkgdir_bldinfo)/usr/lib/linux/$(abi_release)-$*/signatures, "", nvidia-$(2), pool/restricted/n/nvidia-graphics-drivers-$(1)/nvidia-kernel-source-$(1)_$(3)_$(arch).deb pool/restricted/n/nvidia-graphics-drivers-$(1)/nvidia-dkms-$(1)_$(3)_$(arch).deb)
> endef
> # nvidia_build 450
> # nvidia_build 450-server
> @@ -283,21 +283,7 @@ ifneq ($(skipdbg),true)
> $(dbgpkgdir)/usr/lib/debug/boot/vmlinux-$(abi_release)-$*
> $(build_cd) $(kmake) $(build_O) modules_install $(vdso) \
> INSTALL_MOD_PATH=$(dbgpkgdir)/usr/lib/debug
> - # Add .gnu_debuglink sections to each stripped .ko
> - # pointing to unstripped verson
> - find $(pkgdir) -name '*.ko' | sed 's|$(pkgdir)||'| while read module ; do \
> - if [[ -f "$(dbgpkgdir)/usr/lib/debug/$$module" ]] ; then \
> - $(CROSS_COMPILE)objcopy \
> - --add-gnu-debuglink=$(dbgpkgdir)/usr/lib/debug/$$module \
> - $(pkgdir)/$$module; \
> - if grep -q CONFIG_MODULE_SIG=y $(builddir)/build-$*/.config; then \
> - $(builddir)/build-$*/scripts/sign-file $(MODHASHALGO) \
> - $(MODSECKEY) \
> - $(MODPUBKEY) \
> - $(pkgdir)/$$module; \
> - fi; \
> - fi; \
> - done
> + # Add .gnu_debuglink sections only after all/DKMS modules are built.
> rm -f $(dbgpkgdir)/usr/lib/debug/lib/modules/$(abi_release)-$*/build
> rm -f $(dbgpkgdir)/usr/lib/debug/lib/modules/$(abi_release)-$*/source
> rm -f $(dbgpkgdir)/usr/lib/debug/lib/modules/$(abi_release)-$*/modules.*
> @@ -410,10 +396,10 @@ endif
> install -d $(dkms_dir) $(dkms_dir)/headers $(dkms_dir)/build $(dkms_dir)/source
> cp -rp "$(hdrdir)" "$(indep_hdrdir)" "$(dkms_dir)/headers"
>
> - $(if $(filter true,$(enable_zfs)),$(call build_dkms, $(mods_pkg_name)-$*, $(pkgdir)/lib/modules/$(abi_release)-$*/kernel, spl, pool/universe/s/spl-linux/spl-dkms_$(dkms_spl_linux_version)_all.deb))
> - $(if $(filter true,$(enable_zfs)),$(call build_dkms, $(mods_pkg_name)-$*, $(pkgdir)/lib/modules/$(abi_release)-$*/kernel, zfs, pool/universe/z/zfs-linux/zfs-dkms_$(dkms_zfs_linux_version)_all.deb))
> + $(if $(filter true,$(enable_zfs)),$(call build_dkms, $(mods_pkg_name)-$*, $(pkgdir)/lib/modules/$(abi_release)-$*/kernel, "", spl, pool/universe/s/spl-linux/spl-dkms_$(dkms_spl_linux_version)_all.deb))
> + $(if $(filter true,$(enable_zfs)),$(call build_dkms, $(mods_pkg_name)-$*, $(pkgdir)/lib/modules/$(abi_release)-$*/kernel, "", zfs, pool/universe/z/zfs-linux/zfs-dkms_$(dkms_zfs_linux_version)_all.deb))
>
> - $(if $(filter true,$(do_dkms_wireguard)),$(call build_dkms, $(mods_pkg_name)-$*, $(pkgdir)/lib/modules/$(abi_release)-$*/kernel, wireguard, pool/universe/w/wireguard-linux-compat/wireguard-dkms_$(dkms_wireguard_version)_all.deb))
> + $(if $(filter true,$(do_dkms_wireguard)),$(call build_dkms, $(mods_pkg_name)-$*, $(pkgdir)/lib/modules/$(abi_release)-$*/kernel, "", wireguard, pool/universe/w/wireguard-linux-compat/wireguard-dkms_$(dkms_wireguard_version)_all.deb))
>
> ifeq ($(do_dkms_nvidia),true)
> $(foreach series,$(nvidia_desktop_series),$(call nvidia_build,$(series)))
> @@ -422,6 +408,29 @@ ifeq ($(do_dkms_nvidia_server),true)
> $(foreach series,$(nvidia_server_series),$(call nvidia_build,$(series)))
> endif
>
> +ifneq ($(skipdbg),true)
> + # Add .gnu_debuglink sections to each stripped .ko
> + # pointing to unstripped verson
> + find $(pkgdir) \
> + $(if $(filter true,$(do_extras_package)),$(pkgdir_ex)) \
> + -name '*.ko' | while read path_module ; do \
> + module="/lib/modules/$${path_module#*/lib/modules/}"; \
> + if [[ -f "$(dbgpkgdir)/usr/lib/debug/$$module" ]] ; then \
> + $(CROSS_COMPILE)objcopy \
> + --add-gnu-debuglink=$(dbgpkgdir)/usr/lib/debug/$$module \
> + $$path_module; \
> + if grep -q CONFIG_MODULE_SIG=y $(builddir)/build-$*/.config; then \
> + $(builddir)/build-$*/scripts/sign-file $(MODHASHALGO) \
> + $(MODSECKEY) \
> + $(MODPUBKEY) \
> + $$path_module; \
> + fi; \
> + else \
> + echo "WARNING: Missing debug symbols for module '$$module'."; \
> + fi; \
> + done
> +endif
> +
> # Build the final ABI information.
> install -d $(abidir)
> sed -e 's/^\(.\+\)[[:space:]]\+\(.\+\)[[:space:]]\(.\+\)$$/\3 \2 \1/' \
> diff --git a/debian/scripts/dkms-build b/debian/scripts/dkms-build
> index 5e5cef9bd3ec..c1269c01953a 100755
> --- a/debian/scripts/dkms-build
> +++ b/debian/scripts/dkms-build
> @@ -6,8 +6,9 @@ abi_flavour="$2"
> sign="$3"
> pkgname="$4"
> pkgdir="$5"
> -package="$6"
> -shift 6
> +dbgpkgdir="$6"
> +package="$7"
> +shift 7
>
> here=$(dirname "$(readlink -f "${0}")")
>
> @@ -104,6 +105,30 @@ done
> # package is installed directly, but not so much if we build it out
> # of the normal location.
> sed -i -e '/^PACKAGE_NAME=/ s/#//g' "$dkms_conf"
> +
> +# Run any dkms-package specfic configuration steps
> +dkms_config_specific="$srcdir/$0-configure--$package"
> +dkms_config_generic=$(echo "$dkms_config_specific" | sed -e 's/-[0-9][0-9]*$/-N/')
> +for dkms_config in "$dkms_config_specific" "$dkms_config_generic"
> +do
> + if [ -z "$dkms_config" -o ! -e "$dkms_config" ]; then
> + continue
> + fi
> + echo "II: dkms-build-configure $(basename "$dkms_config") found, executing"
> + $SHELL "$dkms_config" \
> + "$srcdir" \
> + "$dkms_conf" \
> + "$dkms_dir" \
> + "$abi_flavour" \
> + "$sign" \
> + "$pkgname" \
> + "$pkgdir" \
> + "$dbgpkgdir" \
> + "$package" \
> + "$@" || exit 1
> + break
> +done
> +
> cat - <<'EOF' >>"$dkms_conf"
> POST_BUILD="ubuntu-save-objects ${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build ${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/objects $POST_BUILD"
> EOF
> @@ -150,6 +175,34 @@ sed -e "s@$dkms_dir@<<DKMSDIR>>@g" <"$log"
> # If this build failed then exit here.
> [ "$rc" != 0 ] && exit "$rc"
>
> +# Install the modules with debug symbols we possibly built,
> +# and strip the original modules for the next install step.
> +if [ -n "$dbgpkgdir" ]; then
> + dbgpkgdir="$dbgpkgdir/$package"
> + echo "II: dkms-build installing $package into $dbgpkgdir (debug symbols)"
> + install -d "$dbgpkgdir"
> + find "$dkms_dir/build/$dkms_package/$dkms_version/$abi_version" -name \*.ko |
> + while read module; do
> + vmodule=$( basename "$module" )
> +
> + # Check for '.debug_info' section in order to copy module.
> + # Useful if debug symbols are requested but not built for
> + # any reason (including not yet supported by DKMS package).
> + # Strip module just in case even if section isn't present.
> + if ${CROSS_COMPILE}objdump -h -j '.debug_info' "$module" >/dev/null 2>&1
> + then
> + echo "copying $vmodule"
> + cp "$module" "$dbgpkgdir"
> + else
> + echo "ignoring $vmodule (missing debug symbols)"
> + fi
> +
> + # Just 'strip -g' as '/usr/sbin/dkms' does.
> + echo "stripping $vmodule"
> + strip -g "$module"
> + done
> +fi
> +
> # Install and optionally sign the modules we have built.
> pkgdir="$pkgdir/$package"
> echo "II: dkms-build installing $package into $pkgdir"
> @@ -183,7 +236,7 @@ dkms_build_specific="$srcdir/$0--$package"
> dkms_build_generic=$(echo "$dkms_build_specific" | sed -n -e 's/-[0-9][0-9]*[a-z]*$/-N/p')
> for dkms_build in "$dkms_build_specific" "$dkms_build_generic"
> do
> - if [ ! -e "$dkms_build" ]; then
> + if [ -z "$dkms_build" -o ! -e "$dkms_build" ]; then
> continue
> fi
> echo "II: dkms-build override $(basename "$dkms_build") found, executing"
> @@ -196,6 +249,7 @@ do
> "$sign" \
> "$pkgname" \
> "$pkgdir" \
> + "$dbgpkgdir" \
> "$package" \
> "$@" || exit 1
> break
> diff --git a/debian/scripts/dkms-build--nvidia-N b/debian/scripts/dkms-build--nvidia-N
> index 3759232549f1..bdec78233b43 100755
> --- a/debian/scripts/dkms-build--nvidia-N
> +++ b/debian/scripts/dkms-build--nvidia-N
> @@ -10,14 +10,29 @@ abi_flavour="$2"
> sign="$3"
> pkgname="$4"
> pkgdir="$5"
> -package="$6"
> -shift 6
> +dbgpkgdir="$6"
> +package="$7"
> +shift 7
>
> build="$( dirname "$objects" )/build"
>
> -# Copy over the objects ready for reconstruction.
> +# Copy over the objects ready for reconstruction. The objects copy contains
> +# the *.o files and the *.o-ur* retpoline files to allow the kernel to track
> +# any retpoline sequences therein. For our purposes we only want the *.o
> +# files, elide the rest.
> mkdir -p "$pkgdir/bits/scripts"
> -cp -rp "$objects"/* "$pkgdir/bits"
> +(
> + gcc_variant1=$(gcc --version | head -1 | sed -e 's/^gcc/GCC:/')
> + gcc_variant2=$(gcc --version | head -1 | sed -e 's/^\(gcc\) \((.*)\) \(.*\)$/\1 version \3 \2/')
> + cd "$objects" || exit 1
> + find -name \*.o | \
> + while read file
> + do
> + cp --parents "$file" "$pkgdir/bits"
> + "$srcdir/debian/scripts/fix-filenames" "$pkgdir/bits/$file" "$gcc_variant1"
> + "$srcdir/debian/scripts/fix-filenames" "$pkgdir/bits/$file" "$gcc_variant2"
> + done
> +)
>
> # Install the support files we need.
> cp "$srcdir/scripts/module-common.lds" "$pkgdir/bits/scripts"
> @@ -45,9 +60,22 @@ grep /usr/bin/ld.bfd "$log" | sed -e "s@$build/@@g" \
> elif [ "$sign" = "--lrm" ]; then
> # We are in LRM build the package a copy in any signatures we can
> # find for them. These will be added after linking.
> + base="/usr/lib/linux/$abi_flavour"
> +
> + # Check the GCC version we are using against that used in the kernel
> + # NOTE: that we treat this as only a warning, as if the binaries did come
> + # out differently then we will actually
> + echo "II: checking gcc version ..."
> + cat "$base/compiler"
> + gcc --version
> + gcc_was=$(cat "$base/compiler" | sed -e 's/^GCC:/gcc/')
> + gcc_is=$(gcc --version | head -1)
> + if [ "$gcc_was" != "$gcc_is" ]; then
> + echo "WW: gcc version missmatch between linux and linux-restricted-modules"
> + echo "WW: was: $gcc_was is: $gcc_is"
> + fi
>
> # Apply any local signatures.
> - base="/usr/lib/linux/$abi_flavour"
> echo "II: adding signatures from $base ..."
> cp "$base/signatures/$package/"*".ko.sig" "$pkgdir/bits"
> sha256sum -c "$base/signatures/$package/SHA256SUMS" || exit 1
> diff --git a/debian/scripts/fix-filenames.c b/debian/scripts/fix-filenames.c
> index e58dc72f8f94..9bd144a6efa8 100644
> --- a/debian/scripts/fix-filenames.c
> +++ b/debian/scripts/fix-filenames.c
> @@ -48,7 +48,6 @@ main(int argc, char *argv[])
> exit(1);
> }
> size = in_info.st_size;
> - printf("%s %ld bytes\n", in_name + prefix_len + 1, size);
>
> in = mmap((void *)0, size, PROT_READ|PROT_WRITE, MAP_SHARED, in_fd, (off_t)0);
> if (!in) {
> @@ -61,13 +60,21 @@ main(int argc, char *argv[])
> continue;
> if (strncmp(in, prefix, prefix_len) != 0)
> continue;
> - length = strlen(in + prefix_len + 1) + 1;
> + /* In the case of an exact match there there is nothing to move. */
> + if (in[prefix_len] == '\0')
> + length = 0;
> + /* If this is a filename, strip the leading slash. */
> + else if (in[prefix_len] == '/')
> + length = strlen(in + prefix_len + 1) + 1;
> + /* Otherwise just keep the suffix. */
> + else
> + length = strlen(in + prefix_len) + 1;
>
> /*
> * Copy the suffix portion down to the start and clear
> * the remainder of the space to 0.
> */
> memmove(in, in + prefix_len + 1, length);
> - memset(in + length, '_', prefix_len);
> + memset(in + length, '\0', prefix_len);
> }
> }
> --
> 2.29.2
>
>
> --
> kernel-team mailing list
> kernel-team at lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team
More information about the kernel-team
mailing list