kbuild: deb-pkg: split generating packaging and build

Move debian/ directory generation out of builddeb to a new script,
mkdebian. The package build commands are kept in builddeb, which
is now an internal command called from debian/rules.

With these changes in place, we can now use dpkg-buildpackage from
deb-pkg and bindeb-pkg removing need for handrolled source/changes
generation.

This patch is based on the criticism of the current state of builddeb
discussed on:

https://patchwork.kernel.org/patch/9656403/

Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>

authored by Riku Voipio and committed by Masahiro Yamada b41d920a a73619a8

+200 -244
+10 -24
scripts/package/Makefile
··· 24 # Remove hyphens since they have special meaning in RPM filenames 25 KERNELPATH := kernel-$(subst -,_,$(KERNELRELEASE)) 26 KDEB_SOURCENAME ?= linux-$(KERNELRELEASE) 27 export KDEB_SOURCENAME 28 # Include only those top-level files that are needed by make, plus the GPL copy 29 TAR_CONTENT := $(KBUILD_ALLDIRS) .config .scmversion Makefile \ ··· 67 68 clean-files += $(objtree)/*.spec 69 70 - # Deb target 71 - # --------------------------------------------------------------------------- 72 - quiet_cmd_builddeb = BUILDDEB 73 - cmd_builddeb = set -e; \ 74 - test `id -u` = 0 || \ 75 - test -n "$(KBUILD_PKG_ROOTCMD)" || { \ 76 - which fakeroot >/dev/null 2>&1 && \ 77 - KBUILD_PKG_ROOTCMD="fakeroot -u"; \ 78 - } || { \ 79 - echo; \ 80 - echo "builddeb must be run as root (or using fakeroot)."; \ 81 - echo "KBUILD_PKG_ROOTCMD is unset and fakeroot not found."; \ 82 - echo "Try setting KBUILD_PKG_ROOTCMD to a command to acquire"; \ 83 - echo "root privileges (e.g., 'fakeroot -u' or 'sudo')."; \ 84 - false; \ 85 - } && \ 86 - \ 87 - $$KBUILD_PKG_ROOTCMD $(CONFIG_SHELL) \ 88 - $(srctree)/scripts/package/builddeb $@ 89 - 90 deb-pkg: FORCE 91 $(MAKE) clean 92 $(call cmd,src_tar,$(KDEB_SOURCENAME)) 93 - $(MAKE) KBUILD_SRC= 94 - +$(call cmd,builddeb) 95 96 bindeb-pkg: FORCE 97 - $(MAKE) KBUILD_SRC= 98 - +$(call cmd,builddeb) 99 100 clean-dirs += $(objtree)/debian/ 101
··· 24 # Remove hyphens since they have special meaning in RPM filenames 25 KERNELPATH := kernel-$(subst -,_,$(KERNELRELEASE)) 26 KDEB_SOURCENAME ?= linux-$(KERNELRELEASE) 27 + KBUILD_PKG_ROOTCMD ?="fakeroot -u" 28 export KDEB_SOURCENAME 29 # Include only those top-level files that are needed by make, plus the GPL copy 30 TAR_CONTENT := $(KBUILD_ALLDIRS) .config .scmversion Makefile \ ··· 66 67 clean-files += $(objtree)/*.spec 68 69 deb-pkg: FORCE 70 $(MAKE) clean 71 + $(CONFIG_SHELL) $(srctree)/scripts/package/mkdebian 72 $(call cmd,src_tar,$(KDEB_SOURCENAME)) 73 + origversion=$$(dpkg-parsechangelog -SVersion |sed 's/-[^-]*$$//');\ 74 + mv $(KDEB_SOURCENAME).tar.gz ../$(KDEB_SOURCENAME)_$${origversion}.orig.tar.gz 75 + +dpkg-buildpackage -r$(KBUILD_PKG_ROOTCMD) -a$$(cat debian/arch) -i.git -us -uc 76 77 bindeb-pkg: FORCE 78 + $(CONFIG_SHELL) $(srctree)/scripts/package/mkdebian 79 + +dpkg-buildpackage -r$(KBUILD_PKG_ROOTCMD) -a$$(cat debian/arch) -b -nc -uc 80 + 81 + intdeb-pkg: FORCE 82 + +$(CONFIG_SHELL) $(srctree)/scripts/package/builddeb 83 84 clean-dirs += $(objtree)/debian/ 85
+1 -220
scripts/package/builddeb
··· 30 chmod -R a+rX "$pdir" 31 32 # Create the package 33 - dpkg-gencontrol $forcearch -Vkernel:debarch="${debarch}" -p$pname -P"$pdir" 34 dpkg --build "$pdir" .. 35 } 36 37 - set_debarch() { 38 - # Attempt to find the correct Debian architecture 39 - case "$UTS_MACHINE" in 40 - i386|ia64|alpha) 41 - debarch="$UTS_MACHINE" ;; 42 - x86_64) 43 - debarch=amd64 ;; 44 - sparc*) 45 - debarch=sparc ;; 46 - s390*) 47 - debarch=s390$(grep -q CONFIG_64BIT=y $KCONFIG_CONFIG && echo x || true) ;; 48 - ppc*) 49 - debarch=$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo ppc64el || echo powerpc) ;; 50 - parisc*) 51 - debarch=hppa ;; 52 - mips*) 53 - debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo el || true) ;; 54 - aarch64|arm64) 55 - debarch=arm64 ;; 56 - arm*) 57 - if grep -q CONFIG_AEABI=y $KCONFIG_CONFIG; then 58 - if grep -q CONFIG_VFP=y $KCONFIG_CONFIG; then 59 - debarch=armhf 60 - else 61 - debarch=armel 62 - fi 63 - else 64 - debarch=arm 65 - fi 66 - ;; 67 - *) 68 - debarch=$(dpkg --print-architecture) 69 - echo "" >&2 70 - echo "** ** ** WARNING ** ** **" >&2 71 - echo "" >&2 72 - echo "Your architecture doesn't have its equivalent" >&2 73 - echo "Debian userspace architecture defined!" >&2 74 - echo "Falling back to using your current userspace instead!" >&2 75 - echo "Please add support for $UTS_MACHINE to ${0} ..." >&2 76 - echo "" >&2 77 - esac 78 - if [ -n "$KBUILD_DEBARCH" ] ; then 79 - debarch="$KBUILD_DEBARCH" 80 - fi 81 - forcearch="-DArchitecture=$debarch" 82 - 83 - } 84 - 85 - # Some variables and settings used throughout the script 86 version=$KERNELRELEASE 87 - revision=$(cat .version) 88 - if [ -n "$KDEB_PKGVERSION" ]; then 89 - packageversion=$KDEB_PKGVERSION 90 - else 91 - packageversion=$version-$revision 92 - fi 93 - sourcename=$KDEB_SOURCENAME 94 tmpdir="$objtree/debian/tmp" 95 kernel_headers_dir="$objtree/debian/hdrtmp" 96 libc_headers_dir="$objtree/debian/headertmp" ··· 43 kernel_headers_packagename=linux-headers-$version 44 libc_headers_packagename=linux-libc-dev 45 dbg_packagename=$packagename-dbg 46 - debarch= 47 - forcearch= 48 - set_debarch 49 50 if [ "$ARCH" = "um" ] ; then 51 packagename=user-mode-linux-$version ··· 153 chmod 755 "$tmpdir/DEBIAN/$script" 154 done 155 156 - # Try to determine maintainer and email values 157 - if [ -n "$DEBEMAIL" ]; then 158 - email=$DEBEMAIL 159 - elif [ -n "$EMAIL" ]; then 160 - email=$EMAIL 161 - else 162 - email=$(id -nu)@$(hostname -f 2>/dev/null || hostname) 163 - fi 164 - if [ -n "$DEBFULLNAME" ]; then 165 - name=$DEBFULLNAME 166 - elif [ -n "$NAME" ]; then 167 - name=$NAME 168 - else 169 - name="Anonymous" 170 - fi 171 - maintainer="$name <$email>" 172 - 173 - # Try to determine distribution 174 - if [ -n "$KDEB_CHANGELOG_DIST" ]; then 175 - distribution=$KDEB_CHANGELOG_DIST 176 - # In some cases lsb_release returns the codename as n/a, which breaks dpkg-parsechangelog 177 - elif distribution=$(lsb_release -cs 2>/dev/null) && [ -n "$distribution" ] && [ "$distribution" != "n/a" ]; then 178 - : # nothing to do in this case 179 - else 180 - distribution="unstable" 181 - echo >&2 "Using default distribution of 'unstable' in the changelog" 182 - echo >&2 "Install lsb-release or set \$KDEB_CHANGELOG_DIST explicitly" 183 - fi 184 - 185 - # Generate a simple changelog template 186 - cat <<EOF > debian/changelog 187 - $sourcename ($packageversion) $distribution; urgency=low 188 - 189 - * Custom built Linux kernel. 190 - 191 - -- $maintainer $(date -R) 192 - EOF 193 - 194 - # Generate copyright file 195 - cat <<EOF > debian/copyright 196 - This is a packacked upstream version of the Linux kernel. 197 - 198 - The sources may be found at most Linux archive sites, including: 199 - https://www.kernel.org/pub/linux/kernel 200 - 201 - Copyright: 1991 - 2017 Linus Torvalds and others. 202 - 203 - The git repository for mainline kernel development is at: 204 - git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 205 - 206 - This program is free software; you can redistribute it and/or modify 207 - it under the terms of the GNU General Public License as published by 208 - the Free Software Foundation; version 2 dated June, 1991. 209 - 210 - On Debian GNU/Linux systems, the complete text of the GNU General Public 211 - License version 2 can be found in \`/usr/share/common-licenses/GPL-2'. 212 - EOF 213 - 214 - 215 - build_depends="bc, kmod, cpio " 216 - 217 - # Generate a control file 218 - cat <<EOF > debian/control 219 - Source: $sourcename 220 - Section: kernel 221 - Priority: optional 222 - Maintainer: $maintainer 223 - Build-Depends: $build_depends 224 - Homepage: http://www.kernel.org/ 225 - EOF 226 - 227 - if [ "$ARCH" = "um" ]; then 228 - cat <<EOF >> debian/control 229 - 230 - Package: $packagename 231 - Architecture: any 232 - Description: User Mode Linux kernel, version $version 233 - User-mode Linux is a port of the Linux kernel to its own system call 234 - interface. It provides a kind of virtual machine, which runs Linux 235 - as a user process under another Linux kernel. This is useful for 236 - kernel development, sandboxes, jails, experimentation, and 237 - many other things. 238 - . 239 - This package contains the Linux kernel, modules and corresponding other 240 - files, version: $version. 241 - EOF 242 - 243 - else 244 - cat <<EOF >> debian/control 245 - 246 - Package: $packagename 247 - Architecture: any 248 - Description: Linux kernel, version $version 249 - This package contains the Linux kernel, modules and corresponding other 250 - files, version: $version. 251 - EOF 252 - 253 - fi 254 - 255 # Build kernel header package 256 (cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles" 257 (cd $srctree; find arch/*/include include scripts -type f -o -type l) >> "$objtree/debian/hdrsrcfiles" ··· 173 ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" 174 rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" 175 176 - cat <<EOF >> debian/control 177 - 178 - Package: $kernel_headers_packagename 179 - Architecture: any 180 - Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch} 181 - This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch} 182 - . 183 - This is useful for people who need to build external modules 184 - EOF 185 - 186 - cat <<EOF >> debian/control 187 - 188 - Package: $libc_headers_packagename 189 - Section: devel 190 - Provides: linux-kernel-headers 191 - Architecture: any 192 - Description: Linux support headers for userspace development 193 - This package provides userspaces headers from the Linux kernel. These headers 194 - are used by the installed headers for GNU glibc and other system libraries. 195 - EOF 196 - 197 if [ "$ARCH" != "um" ]; then 198 create_package "$kernel_headers_packagename" "$kernel_headers_dir" 199 create_package "$libc_headers_packagename" "$libc_headers_dir" ··· 191 ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version 192 # kdump-tools 193 ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version 194 - 195 - cat <<EOF >> debian/control 196 - 197 - Package: $dbg_packagename 198 - Section: debug 199 - Architecture: any 200 - Description: Linux kernel debugging symbols for $version 201 - This package will come in handy if you need to debug the kernel. It provides 202 - all the necessary debug symbols for the kernel and its modules. 203 - EOF 204 - 205 create_package "$dbg_packagename" "$dbg_dir" 206 - fi 207 - 208 - if [ "x$1" = "xdeb-pkg" ] 209 - then 210 - cat <<EOF > debian/rules 211 - #!/usr/bin/make -f 212 - 213 - build: 214 - \$(MAKE) 215 - 216 - binary-arch: 217 - \$(MAKE) KDEB_SOURCENAME=${sourcename} KDEB_PKGVERSION=${packageversion} bindeb-pkg 218 - 219 - clean: 220 - rm -rf debian/*tmp debian/files 221 - mv debian/ debian.backup # debian/ might be cleaned away 222 - \$(MAKE) clean 223 - mv debian.backup debian 224 - 225 - binary: binary-arch 226 - EOF 227 - mv ${sourcename}.tar.gz ../${sourcename}_${version}.orig.tar.gz 228 - tar caf ../${sourcename}_${packageversion}.debian.tar.gz debian/{copyright,rules,changelog,control} 229 - dpkg-source -cdebian/control -ldebian/changelog --format="3.0 (custom)" --target-format="3.0 (quilt)" \ 230 - -b / ../${sourcename}_${version}.orig.tar.gz ../${sourcename}_${packageversion}.debian.tar.gz 231 - mv ${sourcename}_${packageversion}*dsc .. 232 - dpkg-genchanges -Vkernel:debarch="${debarch}" > ../${sourcename}_${packageversion}_${debarch}.changes 233 - else 234 - dpkg-genchanges -b -Vkernel:debarch="${debarch}" > ../${sourcename}_${packageversion}_${debarch}.changes 235 fi 236 237 exit 0
··· 30 chmod -R a+rX "$pdir" 31 32 # Create the package 33 + dpkg-gencontrol -p$pname -P"$pdir" 34 dpkg --build "$pdir" .. 35 } 36 37 version=$KERNELRELEASE 38 tmpdir="$objtree/debian/tmp" 39 kernel_headers_dir="$objtree/debian/hdrtmp" 40 libc_headers_dir="$objtree/debian/headertmp" ··· 99 kernel_headers_packagename=linux-headers-$version 100 libc_headers_packagename=linux-libc-dev 101 dbg_packagename=$packagename-dbg 102 103 if [ "$ARCH" = "um" ] ; then 104 packagename=user-mode-linux-$version ··· 212 chmod 755 "$tmpdir/DEBIAN/$script" 213 done 214 215 # Build kernel header package 216 (cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles" 217 (cd $srctree; find arch/*/include include scripts -type f -o -type l) >> "$objtree/debian/hdrsrcfiles" ··· 331 ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" 332 rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" 333 334 if [ "$ARCH" != "um" ]; then 335 create_package "$kernel_headers_packagename" "$kernel_headers_dir" 336 create_package "$libc_headers_packagename" "$libc_headers_dir" ··· 370 ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version 371 # kdump-tools 372 ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version 373 create_package "$dbg_packagename" "$dbg_dir" 374 fi 375 376 exit 0
+189
scripts/package/mkdebian
···
··· 1 + #!/bin/sh 2 + # 3 + # Copyright 2003 Wichert Akkerman <wichert@wiggy.net> 4 + # 5 + # Simple script to generate a debian/ directory for a Linux kernel. 6 + 7 + set -e 8 + 9 + set_debarch() { 10 + # Attempt to find the correct Debian architecture 11 + case "$UTS_MACHINE" in 12 + i386|ia64|alpha) 13 + debarch="$UTS_MACHINE" ;; 14 + x86_64) 15 + debarch=amd64 ;; 16 + sparc*) 17 + debarch=sparc ;; 18 + s390*) 19 + debarch=s390$(grep -q CONFIG_64BIT=y $KCONFIG_CONFIG && echo x || true) ;; 20 + ppc*) 21 + debarch=$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo ppc64el || echo powerpc) ;; 22 + parisc*) 23 + debarch=hppa ;; 24 + mips*) 25 + debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo el || true) ;; 26 + aarch64|arm64) 27 + debarch=arm64 ;; 28 + arm*) 29 + if grep -q CONFIG_AEABI=y $KCONFIG_CONFIG; then 30 + if grep -q CONFIG_VFP=y $KCONFIG_CONFIG; then 31 + debarch=armhf 32 + else 33 + debarch=armel 34 + fi 35 + else 36 + debarch=arm 37 + fi 38 + ;; 39 + *) 40 + debarch=$(dpkg --print-architecture) 41 + echo "" >&2 42 + echo "** ** ** WARNING ** ** **" >&2 43 + echo "" >&2 44 + echo "Your architecture doesn't have its equivalent" >&2 45 + echo "Debian userspace architecture defined!" >&2 46 + echo "Falling back to using your current userspace instead!" >&2 47 + echo "Please add support for $UTS_MACHINE to ${0} ..." >&2 48 + echo "" >&2 49 + esac 50 + if [ -n "$KBUILD_DEBARCH" ] ; then 51 + debarch="$KBUILD_DEBARCH" 52 + fi 53 + } 54 + 55 + # Some variables and settings used throughout the script 56 + version=$KERNELRELEASE 57 + if [ -n "$KDEB_PKGVERSION" ]; then 58 + packageversion=$KDEB_PKGVERSION 59 + else 60 + revision=$(cat .version 2>/dev/null||echo 1) 61 + packageversion=$version-$revision 62 + fi 63 + sourcename=$KDEB_SOURCENAME 64 + packagename=linux-image-$version 65 + kernel_headers_packagename=linux-headers-$version 66 + dbg_packagename=$packagename-dbg 67 + debarch= 68 + set_debarch 69 + 70 + if [ "$ARCH" = "um" ] ; then 71 + packagename=user-mode-linux-$version 72 + fi 73 + 74 + # Try to determine maintainer and email values 75 + if [ -n "$DEBEMAIL" ]; then 76 + email=$DEBEMAIL 77 + elif [ -n "$EMAIL" ]; then 78 + email=$EMAIL 79 + else 80 + email=$(id -nu)@$(hostname -f 2>/dev/null || hostname) 81 + fi 82 + if [ -n "$DEBFULLNAME" ]; then 83 + name=$DEBFULLNAME 84 + elif [ -n "$NAME" ]; then 85 + name=$NAME 86 + else 87 + name="Anonymous" 88 + fi 89 + maintainer="$name <$email>" 90 + 91 + # Try to determine distribution 92 + if [ -n "$KDEB_CHANGELOG_DIST" ]; then 93 + distribution=$KDEB_CHANGELOG_DIST 94 + # In some cases lsb_release returns the codename as n/a, which breaks dpkg-parsechangelog 95 + elif distribution=$(lsb_release -cs 2>/dev/null) && [ -n "$distribution" ] && [ "$distribution" != "n/a" ]; then 96 + : # nothing to do in this case 97 + else 98 + distribution="unstable" 99 + echo >&2 "Using default distribution of 'unstable' in the changelog" 100 + echo >&2 "Install lsb-release or set \$KDEB_CHANGELOG_DIST explicitly" 101 + fi 102 + 103 + mkdir -p debian/ 104 + echo $debarch > debian/arch 105 + 106 + # Generate a simple changelog template 107 + cat <<EOF > debian/changelog 108 + $sourcename ($packageversion) $distribution; urgency=low 109 + 110 + * Custom built Linux kernel. 111 + 112 + -- $maintainer $(date -R) 113 + EOF 114 + 115 + # Generate copyright file 116 + cat <<EOF > debian/copyright 117 + This is a packacked upstream version of the Linux kernel. 118 + 119 + The sources may be found at most Linux archive sites, including: 120 + https://www.kernel.org/pub/linux/kernel 121 + 122 + Copyright: 1991 - 2018 Linus Torvalds and others. 123 + 124 + The git repository for mainline kernel development is at: 125 + git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 126 + 127 + This program is free software; you can redistribute it and/or modify 128 + it under the terms of the GNU General Public License as published by 129 + the Free Software Foundation; version 2 dated June, 1991. 130 + 131 + On Debian GNU/Linux systems, the complete text of the GNU General Public 132 + License version 2 can be found in \`/usr/share/common-licenses/GPL-2'. 133 + EOF 134 + 135 + # Generate a control file 136 + cat <<EOF > debian/control 137 + Source: $sourcename 138 + Section: kernel 139 + Priority: optional 140 + Maintainer: $maintainer 141 + Build-Depends: bc, kmod, cpio 142 + Homepage: http://www.kernel.org/ 143 + 144 + Package: $packagename 145 + Architecture: $debarch 146 + Description: Linux kernel, version $version 147 + This package contains the Linux kernel, modules and corresponding other 148 + files, version: $version. 149 + 150 + Package: $kernel_headers_packagename 151 + Architecture: $debarch 152 + Description: Linux kernel headers for $version on $debarch 153 + This package provides kernel header files for $version on $debarch 154 + . 155 + This is useful for people who need to build external modules 156 + 157 + Package: linux-libc-dev 158 + Section: devel 159 + Provides: linux-kernel-headers 160 + Architecture: $debarch 161 + Description: Linux support headers for userspace development 162 + This package provides userspaces headers from the Linux kernel. These headers 163 + are used by the installed headers for GNU glibc and other system libraries. 164 + 165 + Package: $dbg_packagename 166 + Section: debug 167 + Architecture: $debarch 168 + Description: Linux kernel debugging symbols for $version 169 + This package will come in handy if you need to debug the kernel. It provides 170 + all the necessary debug symbols for the kernel and its modules. 171 + EOF 172 + 173 + cat <<EOF > debian/rules 174 + #!$(command -v $MAKE) -f 175 + 176 + build: 177 + \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} KBUILD_SRC= 178 + 179 + binary-arch: 180 + \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} KBUILD_SRC= intdeb-pkg 181 + 182 + clean: 183 + rm -rf debian/*tmp debian/files 184 + \$(MAKE) clean 185 + 186 + binary: binary-arch 187 + EOF 188 + 189 + exit 0