From 343cce21fd59a649fdeec48808ac82fb3df3700e Mon Sep 17 00:00:00 2001 From: orangepi-xunlong <258384131@qq.com> Date: Mon, 5 Jun 2023 15:02:03 +0800 Subject: [PATCH] scripts: package: Update builddeb and mkdebian for builddeb packaging --- scripts/package/builddeb | 266 +++++++++++++++++++++++++++++++-------- scripts/package/mkdebian | 56 +++++---- 2 files changed, 251 insertions(+), 71 deletions(-) diff --git a/scripts/package/builddeb b/scripts/package/builddeb index 67cd420dc..8df6596ee 100755 --- a/scripts/package/builddeb +++ b/scripts/package/builddeb @@ -9,6 +9,15 @@ # /etc/kernel/{pre,post}{inst,rm}.d/ directories (or an alternative location # specified in KDEB_HOOKDIR) that will be called on package install and # removal. +# +# armbian/bulddeb 0.1 +# Copyright 2021 Leonid Gasheev (The-going <48602507+The-going@users.noreply.github.com>) +# +# In order to make a choice, it is enough for us to check the value +# of the variable in the kernel configuration file and Debian's own variables. +# +# Uncomment the next line to see all the current values. +# echo "$(dpkg-architecture -l)" >&2 set -e @@ -24,6 +33,14 @@ if_enabled_echo() { fi } +is_native() { + dpkg-architecture -qDEB_BUILD_ARCH | grep -q "$(dpkg-architecture -qDEB_HOST_ARCH)" +} + +is_build_on_amd64() { + dpkg-architecture -qDEB_BUILD_ARCH | grep -q amd64 +} + create_package() { local pname="$1" pdir="$2" local dpkg_deb_opts @@ -32,7 +49,7 @@ create_package() { mkdir -p "$pdir/usr/share/doc/$pname" cp debian/copyright "$pdir/usr/share/doc/$pname/" cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian" - gzip -n -9 "$pdir/usr/share/doc/$pname/changelog.Debian" + gzip -9 "$pdir/usr/share/doc/$pname/changelog.Debian" sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \ | xargs -r0 md5sum > DEBIAN/md5sums" @@ -48,38 +65,104 @@ create_package() { # in case we build in a setuid/setgid directory chmod -R ug-s "$pdir" + # Create preinstall and post install script to remove dtb + if [ "$3" = "dtb" ]; then + + cat >> $pdir/DEBIAN/preinst <<- EOT + rm -rf /boot/dtb + rm -rf /boot/dtb-$version + exit 0 + EOT + + cat >> $pdir/DEBIAN/postinst <<- EOT + cd /boot + ln -sfT dtb-$version dtb 2> /dev/null || mv dtb-$version dtb + exit 0 + EOT + + chmod 775 $pdir/DEBIAN/preinst + chmod 775 $pdir/DEBIAN/postinst + fi + + # Create postinst prerm script for headers + if [ "$3" = "headers" ]; then + + # Set the time for all files to the current time. + # And build them for the current architecture. + cat >> $pdir/DEBIAN/postinst <<- EOT + cd /usr/src/linux-headers-$version + echo "Compiling headers - please wait ..." + NCPU=\$(grep -c 'processor' /proc/cpuinfo) + find -type f -exec touch {} + + yes "" | make ARCH=$ARCH oldconfig >/dev/null + make -j\$NCPU ARCH=$ARCH -s scripts >/dev/null + make -j\$NCPU ARCH=$ARCH -s M=scripts/mod/ >/dev/null + exit 0 + EOT + + # After the configuration and compilation processes, new files + # appear that the package manager does not know anything about. + # Just clear all the files in the target directory. + cat >> $pdir/DEBIAN/prerm <<- EOT + rm -rf /usr/src/linux-headers-$version + exit 0 + EOT + + chmod 775 $pdir/DEBIAN/postinst + chmod 775 $pdir/DEBIAN/prerm + fi + # Create the package dpkg-gencontrol -p$pname -P"$pdir" - dpkg-deb $dpkg_deb_opts ${KDEB_COMPRESS:+-Z$KDEB_COMPRESS} --build "$pdir" .. + dpkg-deb ${KDEB_COMPRESS:+-Z$KDEB_COMPRESS} --build "$pdir" .. } -deploy_kernel_headers () { +deploy_kernel_headers() { pdir=$1 rm -rf $pdir + destdir=$pdir/usr/src/linux-headers-$version + mkdir -p $destdir + + if linux-version compare "$KERNELVERSION" ge "5.19" ; then + configobj=CONFIG_OBJTOOL + else + configobj=CONFIG_STACK_VALIDATION + fi + ( cd $srctree - find . arch/$SRCARCH -maxdepth 1 -name Makefile\* - find include scripts -type f -o -type l - find arch/$SRCARCH -name Kbuild.platforms -o -name Platform + find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl + find arch/*/include include scripts -type f -o -type l + find security/*/include -type f + find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f ) > debian/hdrsrcfiles { - if is_enabled CONFIG_OBJTOOL; then - echo tools/objtool/objtool + # This affects arch/x86 + if is_enabled $configobj; then + # echo tools/objtool/objtool + find tools/objtool -type f -executable fi find arch/$SRCARCH/include Module.symvers include scripts -type f if is_enabled CONFIG_GCC_PLUGINS; then - find scripts/gcc-plugins -name \*.so + find scripts/gcc-plugins -name \*.so -o -name gcc-common.h fi } > debian/hdrobjfiles - destdir=$pdir/usr/src/linux-headers-$version - mkdir -p $destdir + if is_native; then + echo "info: Build native: Skip headers-debian-byteshift.patch" >&2 + elif is_build_on_amd64; then + ( + cd $destdir + patch -p1 < /tmp/headers-debian-byteshift.patch + ) + fi + tar -c -f - -C $srctree -T debian/hdrsrcfiles | tar -xf - -C $destdir tar -c -f - -T debian/hdrobjfiles | tar -xf - -C $destdir rm -f debian/hdrsrcfiles debian/hdrobjfiles @@ -91,7 +174,7 @@ deploy_kernel_headers () { ln -s /usr/src/linux-headers-$version $pdir/lib/modules/$version/build } -deploy_libc_headers () { +deploy_libc_headers() { pdir=$1 rm -rf $pdir @@ -107,12 +190,18 @@ deploy_libc_headers () { } version=$KERNELRELEASE -tmpdir=debian/linux-image -dbg_dir=debian/linux-image-dbg -packagename=linux-image-$version +tmpdir="debian/tmp" +kernel_headers_dir="debian/hdrtmp" +libc_headers_dir="debian/headertmp" +dbg_dir="debian/dbgtmp" +dtb_dir="debian/dtbtmp" +packagename=linux-image-"$BRANCH$LOCALVERSION" +kernel_headers_packagename=linux-headers-"$BRANCH$LOCALVERSION" +dtb_packagename=linux-dtb-"$BRANCH$LOCALVERSION" +libc_headers_packagename=linux-libc-dev dbg_packagename=$packagename-dbg -if [ "$ARCH" = "um" ] ; then +if [ "$ARCH" = "um" ]; then packagename=user-mode-linux-$version fi @@ -120,26 +209,41 @@ fi # XXX: have each arch Makefile export a variable of the canonical image install # path instead case $ARCH in -um) - installed_image_path="usr/bin/linux-$version" - ;; -parisc|mips|powerpc) - installed_image_path="boot/vmlinux-$version" - ;; -*) - installed_image_path="boot/vmlinuz-$version" + ++aarch64|arm64) + image_name=Image + installed_image_path="boot/vmlinuz-$version" + ;; + arm*) + image_name=zImage + installed_image_path="boot/vmlinuz-$version" + ;; + um) + installed_image_path="usr/bin/linux-$version" + ;; + parisc|mips|powerpc) + installed_image_path="boot/vmlinux-$version" + ;; + *) + image_name=vmlinuz + installed_image_path="boot/vmlinuz-$version" + ;; esac BUILD_DEBUG=$(if_enabled_echo CONFIG_DEBUG_INFO Yes) # Setup the directory structure -rm -rf "$tmpdir" "$dbg_dir" debian/files +rm -rf "$tmpdir" "$dbg_dir" "$dtb_dir" debian/files mkdir -m 755 -p "$tmpdir/DEBIAN" mkdir -p "$tmpdir/lib" "$tmpdir/boot" +mkdir -m 755 -p "$dtb_dir/DEBIAN" +mkdir -p "$dtb_dir/boot/dtb-$version" "$dtb_dir/usr/share/doc/$dtb_packagename" +mkdir -m 755 -p "$kernel_headers_dir/lib/modules/$version/" +mkdir -m 755 -p "$libc_headers_dir/DEBIAN" # Install the kernel -if [ "$ARCH" = "um" ] ; then +if [ "$ARCH" = "um" ]; then mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" "$tmpdir/usr/share/doc/$packagename" + $MAKE linux cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map" cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config" gzip "$tmpdir/usr/share/doc/$packagename/config" @@ -152,19 +256,26 @@ cp "$($MAKE -s -f $srctree/Makefile image_name)" "$tmpdir/$installed_image_path" if is_enabled CONFIG_OF_EARLY_FLATTREE; then # Only some architectures with OF support have this target if [ -d "${srctree}/arch/$SRCARCH/boot/dts" ]; then - $MAKE -f $srctree/Makefile INSTALL_DTBS_PATH="$tmpdir/usr/lib/$packagename" dtbs_install + $MAKE -f $srctree/Makefile INSTALL_DTBS_PATH="$tmpdir/usr/lib/linux-image-$version" dtbs_install fi fi +if grep -q '^CONFIG_OF=y' $KCONFIG_CONFIG; then + #mkdir -p "$tmpdir/boot/dtb" + INSTALL_DTBS_PATH="$dtb_dir/boot/dtb-$version" $MAKE KBUILD_SRC= dtbs_install +fi + if is_enabled CONFIG_MODULES; then INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_install rm -f "$tmpdir/lib/modules/$version/build" rm -f "$tmpdir/lib/modules/$version/source" - if [ "$ARCH" = "um" ] ; then + + if [ "$ARCH" = "um" ]; then mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/" rmdir "$tmpdir/lib/modules/$version" fi - if [ -n "$BUILD_DEBUG" ] ; then + + if [ -n "$BUILD_DEBUG" ]; then for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do module=lib/modules/$module mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module) @@ -189,38 +300,95 @@ fi # make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and # so do we; recent versions of dracut and initramfs-tools will obey this. debhookdir=${KDEB_HOOKDIR:-/etc/kernel} -for script in postinst postrm preinst prerm ; do +for script in postinst postrm preinst prerm; do mkdir -p "$tmpdir$debhookdir/$script.d" - cat < "$tmpdir/DEBIAN/$script" -#!/bin/sh + cat <<- EOF > "$tmpdir/DEBIAN/$script" + #!/bin/bash -set -e + set -e -# Pass maintainer script parameters to hook scripts -export DEB_MAINT_PARAMS="\$*" + # Pass maintainer script parameters to hook scripts + export DEB_MAINT_PARAMS="\$*" -# Tell initramfs builder whether it's wanted -export INITRD=$(if_enabled_echo CONFIG_BLK_DEV_INITRD Yes No) + # Tell initramfs builder whether it's wanted + export INITRD=$(if_enabled_echo CONFIG_BLK_DEV_INITRD Yes No) -test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d -exit 0 -EOF + test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d + exit 0 + EOF chmod 755 "$tmpdir/DEBIAN/$script" done -if [ "$ARCH" != "um" ]; then - if is_enabled CONFIG_MODULES; then - deploy_kernel_headers debian/linux-headers - create_package linux-headers-$version debian/linux-headers - fi +## +## Create sym link to kernel image +## +sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/postinst +cat >> $tmpdir/DEBIAN/postinst <<- EOT + ln -sf $(basename $installed_image_path) /boot/$image_name 2> /dev/null || cp /$installed_image_path /boot/$image_name + touch /boot/.next + exit 0 +EOT - deploy_libc_headers debian/linux-libc-dev - create_package linux-libc-dev debian/linux-libc-dev -fi +## +## FAT install workaround +## +sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/preinst +cat >> $tmpdir/DEBIAN/preinst <<- EOT + # exit if we are running chroot + if [ "\$(stat -c %d:%i /)" != "\$(stat -c %d:%i /proc/1/root/.)" ]; then exit 0; fi + + check_boot_dev (){ + boot_device=\$(mountpoint -d /boot) + + for file in /dev/* ; do + CURRENT_DEVICE=\$(printf "%d:%d" \$(stat --printf="0x%t 0x%T" \$file)) + if [[ "\$CURRENT_DEVICE" = "\$boot_device" ]]; then + boot_partition=\$file + break + fi + done + + bootfstype=\$(blkid -s TYPE -o value \$boot_partition) + if [ "\$bootfstype" = "vfat" ]; then + rm -f /boot/System.map* /boot/config* /boot/vmlinuz* /boot/$image_name /boot/uImage + fi + } + mountpoint -q /boot && check_boot_dev + exit 0 +EOT create_package "$packagename" "$tmpdir" -if [ -n "$BUILD_DEBUG" ] ; then +if [ "$ARCH" != "um" ]; then + + if [ "$(cat debian/arch)" != "amd64" ]; then # No DTB for amd64 target + create_package "$dtb_packagename" "$dtb_dir" "dtb" + fi + + deploy_libc_headers $libc_headers_dir + create_package $libc_headers_packagename $libc_headers_dir + + if is_enabled CONFIG_MODULES; then + if is_native; then + # echo "Skip scripts folder cleaning" >&2 + # echo "Skip creating postinst prerm scripts for headers" >&2 + deploy_kernel_headers $kernel_headers_dir + create_package $kernel_headers_packagename $kernel_headers_dir + else + # Clean up the executables that are left over from + # cross-compilation for a different host architecture. + ( + cd $srctree + make M=scripts clean + ) + deploy_kernel_headers $kernel_headers_dir + create_package $kernel_headers_packagename $kernel_headers_dir "headers" + fi + fi + +fi + +if [ -n "$BUILD_DEBUG" ]; then # Build debug package # Different tools want the image in different locations # perf diff --git a/scripts/package/mkdebian b/scripts/package/mkdebian index 5be7e627e..624afca8e 100755 --- a/scripts/package/mkdebian +++ b/scripts/package/mkdebian @@ -85,20 +85,24 @@ set_debarch() { } # Some variables and settings used throughout the script +KDEB_SOURCENAME=linux-$KERNELRELEASE version=$KERNELRELEASE if [ -n "$KDEB_PKGVERSION" ]; then packageversion=$KDEB_PKGVERSION revision=${packageversion##*-} else - revision=$($srctree/init/build-version) + revision=$(cat .version 2>/dev/null||echo 1) packageversion=$version-$revision fi sourcename=$KDEB_SOURCENAME +packagename=linux-image-"$BRANCH$LOCALVERSION" +kernel_headers_packagename=linux-headers-"$BRANCH$LOCALVERSION" +libc_headers_packagename=linux-libc-dev +dtb_packagename=linux-dtb-"$BRANCH$LOCALVERSION" +dbg_packagename=$packagename-dbg if [ "$ARCH" = "um" ] ; then - packagename=user-mode-linux -else - packagename=linux-image + packagename=user-mode-linux-$version fi debarch= @@ -143,14 +147,14 @@ extra_build_depends="$extra_build_depends, $(if_enabled_echo CONFIG_SYSTEM_TRUST cat < debian/changelog $sourcename ($packageversion) $distribution; urgency=low - * Custom built Linux kernel. + * Armbian built Linux kernel. $BRANCH -- $maintainer $(date -R) EOF # Generate copyright file cat < debian/copyright -This is a packacked upstream version of the Linux kernel. +This is a packacked orangepi patches version of the Linux kernel. The sources may be found at most Linux archive sites, including: https://www.kernel.org/pub/linux/kernel @@ -174,32 +178,44 @@ Source: $sourcename Section: kernel Priority: optional Maintainer: $maintainer -Rules-Requires-Root: no -Build-Depends: bc, rsync, kmod, cpio, bison, flex | flex:native $extra_build_depends +Build-Depends: bc, rsync, kmod, cpio, bison, linux-base, + flex | flex:native $extra_build_depends Homepage: https://www.kernel.org/ -Package: $packagename-$version +Package: $packagename Architecture: $debarch -Description: Linux kernel, version $version +Provides: linux-image, linux-image-orangepi, orangepi-$BRANCH +Description: Linux kernel, orangepi version $version $BRANCH This package contains the Linux kernel, modules and corresponding other files, version: $version. -Package: linux-libc-dev +Package: $libc_headers_packagename Section: devel Provides: linux-kernel-headers +Conflicts: linux-kernel-headers +Replaces: linux-kernel-headers Architecture: $debarch -Description: Linux support headers for userspace development +Description: Armbian Linux support headers for userspace development This package provides userspaces headers from the Linux kernel. These headers are used by the installed headers for GNU glibc and other system libraries. Multi-Arch: same + +Package: $dtb_packagename +Architecture: $debarch +Provides: linux-dtb, linux-dtb-orangepi, orangepi-$BRANCH +Description: Armbian Linux DTB, version $version $BRANCH + This package contains device blobs from the Linux kernel, version $version EOF if is_enabled CONFIG_MODULES; then cat <> debian/control -Package: linux-headers-$version +Package: $kernel_headers_packagename +Section: devel Architecture: $debarch -Description: Linux kernel headers for $version on $debarch +Provides: linux-headers, linux-headers-orangepi, orangepi-$BRANCH +Depends: make, gcc, libc6-dev, bison, flex, libssl-dev +Description: Linux kernel headers for $version on $debarch $BRANCH This package provides kernel header files for $version on $debarch . This is useful for people who need to build external modules @@ -209,7 +225,7 @@ fi if is_enabled CONFIG_DEBUG_INFO; then cat <> debian/control -Package: linux-image-$version-dbg +Package: $dbg_packagename Section: debug Architecture: $debarch Description: Linux kernel debugging symbols for $version @@ -223,20 +239,16 @@ cat < debian/rules srctree ?= . -build-indep: -build-arch: +build: \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \ KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile -build: build-arch - -binary-indep: -binary-arch: build-arch +binary-arch: \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \ KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile intdeb-pkg clean: - rm -rf debian/files debian/linux-* + rm -rf debian/*tmp debian/files \$(MAKE) clean binary: binary-arch