amlbian: Support making dtb-deb [1/1]

PD#SWPL-106598

Problem:
Support making dtb-deb.

Solution:
Support making dtb-deb.

Verify:
local

Change-Id: I3cb8e8d5666f073468e55e4a4e8862f12e60b15f
Signed-off-by: yi.liu <yi.liu@amlogic.com>
diff --git a/scripts/package/builddeb b/scripts/package/builddeb
index 91a502b..3a1b2ef 100755
--- a/scripts/package/builddeb
+++ b/scripts/package/builddeb
@@ -48,8 +48,68 @@
 	# in case we build in a setuid/setgid directory
 	chmod -R ug-s "$pdir"
 
+	# Create preinstall and post install script to remove dtb
+	if [[ "$1" == *dtb* ]]; then
+		cat >> $pdir/DEBIAN/preinst <<-EOF
+		#!/bin/bash
+		EOF
+
+		cat >> $pdir/DEBIAN/postinst <<-EOF
+		#!/bin/bash
+		cd /boot
+		ln -sfT dtb-$version dtb 2> /dev/null || mv dtb-$version dtb
+		cd - > /dev/null
+		echo dtb-$version > /boot/.dtb.tmp
+		exit 0
+		EOF
+		chmod 775 $pdir/DEBIAN/preinst ; chmod 775 $pdir/DEBIAN/postinst
+	fi
+
+	# Create postinst prerm scripts for headers
+	if [[ "$1" == *headers* ]]; then
+		cat >> $pdir/DEBIAN/postinst <<-EOF
+		#!/bin/bash
+		cd /usr/src/linux-headers-$version
+		echo "Compiling headers - please wait ..."
+		find -type f -exec touch {} +
+
+		pwd
+		gcc -v
+
+		echo "Compiling headers - make -j8 -s scripts > /dev/null 2>&1..."
+		#make -j\$(grep -c 'processor' /proc/cpuinfo) -s scripts > /dev/null 2>&1 || exit 1
+		# Guoping changed to J8 avoid using too many jobs for building in build server
+		#make -j8-s scripts > /dev/null 2>&1 || exit 1
+		make -j8 -s scripts 2>&1 > log.txt || exit 1
+
+		echo "Compiling headers - make -j8 -s M=scripts/mod/ > /dev/null 2>&1..."
+		#make -j\$(grep -c 'processor' /proc/cpuinfo) -s M=scripts/mod/ > /dev/null 2>&1 || exit 1
+		# Guoping changed to J8 avoid using too many jobs for building in build server
+		#make -j8 -s M=scripts/mod/ > /dev/null 2>&1 || exit 1
+		make -j8 -s M=scripts/mod/ 2>&1 > log.txt || exit 1
+
+		echo "Compiling headers - Done ..."
+
+		#exit 0
+		EOF
+
+		cat >> $pdir/DEBIAN/prerm <<-EOF
+		cd /usr/src/linux-headers-$version
+		rm -rf scripts .config.old
+		EOF
+
+		chmod 775 $pdir/DEBIAN/postinst ; chmod 775 $pdir/DEBIAN/prerm
+	fi
+
 	# Create the package
+	echo "Building package: $pdir $pname.deb"
 	dpkg-gencontrol -p$pname -P"$pdir"
+
+	## For HOST jammy, dpkg-deb default use zstd for compress,
+	# it will cause failed log "uses unknown compression for member 'control.tar.zst', giving up"
+	# dpkg -i need xz compress, but HOST jammy default use zst, so de-compress the debs and re-compress to xz
+	# HOST jammy: control.tar.zst  data.tar.zst  debian-binary
+	# HOST focal : control.tar.xz  data.tar.xz  debian-binary
 	dpkg-deb $dpkg_deb_opts ${KDEB_COMPRESS:+-Z$KDEB_COMPRESS} --build "$pdir" ..
 }
 
@@ -62,6 +122,7 @@
 		cd $srctree
 		find . arch/$SRCARCH -maxdepth 1 -name Makefile\*
 		find include scripts -type f -o -type l
+		find security/*/include -type f
 		find arch/$SRCARCH -name Kbuild.platforms -o -name Platform
 		find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f
 	) > debian/hdrsrcfiles
@@ -80,10 +141,13 @@
 
 	destdir=$pdir/usr/src/linux-headers-$version
 	mkdir -p $destdir
+	(cd $destdir; patch -p1 < /tmp/headers-debian-byteshift.patch)
 	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
 
+	(cd $destdir; export sub_make_done=0; make M=scripts clean;)
+
 	# copy .config manually to be where it's expected to be
 	cp $KCONFIG_CONFIG $destdir/.config
 
@@ -109,9 +173,15 @@
 version=$KERNELRELEASE
 tmpdir=debian/linux-image
 dbg_dir=debian/linux-image-dbg
-packagename=linux-image-$version
+dtb_dir=debian/linux-dtb
+packagename=linux-image"$LOCAL_VERSION"
+dtb_packagename=linux-dtb"$LOCAL_VERSION"
 dbg_packagename=$packagename-dbg
 
+
+echo "Building packagename: $packagename.deb"
+echo "Building dtb_packagename: $dtb_packagename.deb"
+
 if [ "$ARCH" = "um" ] ; then
 	packagename=user-mode-linux-$version
 fi
@@ -120,6 +190,15 @@
 # XXX: have each arch Makefile export a variable of the canonical image install
 # path instead
 case $ARCH in
+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"
 	;;
@@ -133,7 +212,9 @@
 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 "$dtb_dir/DEBIAN"
+mkdir -p "$dtb_dir/boot/dtb-$version" "$dtb_dir/usr/share/doc/$dtb_packagename"
 mkdir -m 755 -p "$tmpdir/DEBIAN"
 mkdir -p "$tmpdir/lib" "$tmpdir/boot"
 
@@ -147,12 +228,16 @@
 	cp System.map "$tmpdir/boot/System.map-$version"
 	cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version"
 fi
-cp "$($MAKE -s -f $srctree/Makefile image_name)" "$tmpdir/$installed_image_path"
+cp arch/$ARCH/boot/Image "$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
+		if [ -n "$DTBS" ]; then
+			$MAKE -f $srctree/Makefile INSTALL_DTBS_PATH="$tmpdir/usr/lib/$packagename" dtbs_install dtb-y="$DTBS"
+		else
+			$MAKE -f $srctree/Makefile INSTALL_DTBS_PATH="$tmpdir/usr/lib/$packagename" dtbs_install
+		fi
 	fi
 fi
 
@@ -183,6 +268,14 @@
 	fi
 fi
 
+if grep -q '^CONFIG_OF=y' $KCONFIG_CONFIG ; then
+	if [ -n "$DTBS" ]; then
+		INSTALL_DTBS_PATH="$dtb_dir/boot/dtb-$version" $MAKE KBUILD_SRC= dtbs_install dtb-y="$DTBS"
+	else
+		INSTALL_DTBS_PATH="$dtb_dir/boot/dtb-$version" $MAKE KBUILD_SRC= dtbs_install
+	fi
+fi
+
 # Install the maintainer scripts
 # Note: hook scripts under /etc/kernel are also executed by official Debian
 # kernel packages, as well as kernel packages built using make-kpkg.
@@ -192,7 +285,7 @@
 for script in postinst postrm preinst prerm ; do
 	mkdir -p "$tmpdir$debhookdir/$script.d"
 	cat <<EOF > "$tmpdir/DEBIAN/$script"
-#!/bin/sh
+#!/bin/bash
 
 set -e
 
@@ -208,6 +301,55 @@
 	chmod 755 "$tmpdir/DEBIAN/$script"
 done
 
+
+##
+## Create sym link to kernel image
+##
+sed -e "s/set -e//g" -i $tmpdir/DEBIAN/postinst
+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/postinst
+cat >> $tmpdir/DEBIAN/postinst <<EOT
+if [ "\$(grep nand /proc/partitions)" != "" ] && [ "\$(grep mmc /proc/partitions)" = "" ]; then
+   mkimage -A arm -O linux -T kernel -C none -a "0x40008000" -e "0x40008000" -n "Linux kernel" -d /$installed_image_path /boot/uImage  > /dev/null 2>&1
+   cp /boot/uImage /tmp/uImage
+   sync
+   mountpoint -q /boot || mount /boot
+   cp /tmp/uImage /boot/uImage
+   rm -f /$installed_image_path
+else
+   ln -sf $(basename $installed_image_path) /boot/Image > /dev/null 2>&1 || mv /$installed_image_path /boot/Image
+fi
+exit 0
+EOT
+
+##
+## FAT install workaround
+##
+sed -e "s/set -e//g" -i $tmpdir/DEBIAN/preinst
+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_and_unmount (){
+   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_and_unmount
+EOT
+echo "exit 0" >> $tmpdir/DEBIAN/preinst
+
 if [ "$ARCH" != "um" ]; then
 	if is_enabled CONFIG_MODULES; then
 		deploy_kernel_headers debian/linux-headers
@@ -216,6 +358,8 @@
 
 	deploy_libc_headers debian/linux-libc-dev
 	create_package linux-libc-dev debian/linux-libc-dev
+
+	create_package "$dtb_packagename" "$dtb_dir" "dtb"
 fi
 
 create_package "$packagename" "$tmpdir"
diff --git a/scripts/package/mkdebian b/scripts/package/mkdebian
index 32d528a..85af3e2 100755
--- a/scripts/package/mkdebian
+++ b/scripts/package/mkdebian
@@ -94,6 +94,8 @@
 	packageversion=$version-$revision
 fi
 sourcename=$KDEB_SOURCENAME
+dtb_packagename=linux-dtb$LOCAL_VERSION
+kernel_headers_packagename=linux-headers$LOCAL_VERSION
 
 if [ "$ARCH" = "um" ] ; then
 	packagename=user-mode-linux
@@ -178,12 +180,19 @@
 Build-Depends: bc, rsync, kmod, cpio, bison, flex | flex:native $extra_build_depends
 Homepage: https://www.kernel.org/
 
-Package: $packagename-$version
+Package: $packagename$LOCAL_VERSION
 Architecture: $debarch
 Description: Linux kernel, version $version
  This package contains the Linux kernel, modules and corresponding other
  files, version: $version.
 
+Package: $kernel_headers_packagename
+Architecture: $debarch
+Description: Linux kernel headers for $version on $debarch
+ This package provides kernel header files for $version on $debarch
+ .
+ This is useful for people who need to build external modules
+
 Package: linux-libc-dev
 Section: devel
 Provides: linux-kernel-headers
@@ -192,6 +201,11 @@
  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
+Description: Linux DTB, version $version
+ This package contains device blobs from the Linux kernel, version $version
 EOF
 
 if is_enabled CONFIG_MODULES; then
@@ -209,7 +223,7 @@
 if is_enabled CONFIG_DEBUG_INFO; then
 cat <<EOF >> debian/control
 
-Package: linux-image-$version-dbg
+Package: linux-image$LOCAL_VERSION-dbg
 Section: debug
 Architecture: $debarch
 Description: Linux kernel debugging symbols for $version