^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) #!/bin/sh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) # SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) # This script generates an archive consisting of kernel headers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) # for CONFIG_IKHEADERS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) set -e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) sfile="$(readlink -f "$0")"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) outdir="$(pwd)"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) tarfile=$1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) cpio_dir=$outdir/$tarfile.tmp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) dir_list="
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) include/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) arch/$SRCARCH/include/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) # Support incremental builds by skipping archive generation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) # if timestamps of files being archived are not changed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) # This block is useful for debugging the incremental builds.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) # Uncomment it for debugging.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) # if [ ! -f /tmp/iter ]; then iter=1; echo 1 > /tmp/iter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) # else iter=$(($(cat /tmp/iter) + 1)); echo $iter > /tmp/iter; fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) # find $all_dirs -name "*.h" | xargs ls -l > /tmp/ls-$iter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) all_dirs=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) if [ "$building_out_of_srctree" ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) for d in $dir_list; do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) all_dirs="$all_dirs $srctree/$d"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) all_dirs="$all_dirs $dir_list"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) # include/generated/compile.h is ignored because it is touched even when none
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) # of the source files changed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) # When Kconfig regenerates include/generated/autoconf.h, its timestamp is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) # updated, but the contents might be still the same. When any CONFIG option is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) # changed, Kconfig touches the corresponding timestamp file include/config/*.h.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) # Hence, the md5sum detects the configuration change anyway. We do not need to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) # check include/generated/autoconf.h explicitly.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) # Ignore them for md5 calculation to avoid pointless regeneration.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) headers_md5="$(find $all_dirs -name "*.h" |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) grep -v "include/generated/compile.h" |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) grep -v "include/generated/autoconf.h" |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) xargs ls -l | md5sum | cut -d ' ' -f1)"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) # Any changes to this script will also cause a rebuild of the archive.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) this_file_md5="$(ls -l $sfile | md5sum | cut -d ' ' -f1)"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) if [ -f $tarfile ]; then tarfile_md5="$(md5sum $tarfile | cut -d ' ' -f1)"; fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) if [ -f kernel/kheaders.md5 ] &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) [ "$(head -n 1 kernel/kheaders.md5)" = "$headers_md5" ] &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) [ "$(head -n 2 kernel/kheaders.md5 | tail -n 1)" = "$this_file_md5" ] &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) [ "$(tail -n 1 kernel/kheaders.md5)" = "$tarfile_md5" ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) exit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) if [ "${quiet}" != "silent_" ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) echo " GEN $tarfile"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) rm -rf $cpio_dir
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) mkdir $cpio_dir
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) if [ "$building_out_of_srctree" ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) (
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) cd $srctree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) for f in $dir_list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) do find "$f" -name "*.h";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) done | cpio --quiet -pd $cpio_dir
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) # The second CPIO can complain if files already exist which can happen with out
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) # of tree builds having stale headers in srctree. Just silence CPIO for now.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) for f in $dir_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) do find "$f" -name "*.h";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) done | cpio --quiet -pd $cpio_dir >/dev/null 2>&1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) # Remove comments except SDPX lines
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) find $cpio_dir -type f -print0 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) xargs -0 -P8 -n1 perl -pi -e 'BEGIN {undef $/;}; s/\/\*((?!SPDX).)*?\*\///smg;'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) # Create archive and try to normalize metadata for reproducibility.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) # For compatibility with older versions of tar, files are fed to tar
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) # pre-sorted, as --sort=name might not be available.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) find $cpio_dir -printf "./%P\n" | LC_ALL=C sort | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) tar "${KBUILD_BUILD_TIMESTAMP:+--mtime=$KBUILD_BUILD_TIMESTAMP}" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) --owner=0 --group=0 --numeric-owner --no-recursion \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) -I $XZ -cf $tarfile -C $cpio_dir/ -T - > /dev/null
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) echo $headers_md5 > kernel/kheaders.md5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) echo "$this_file_md5" >> kernel/kheaders.md5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) echo "$(md5sum $tarfile | cut -d ' ' -f1)" >> kernel/kheaders.md5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) rm -rf $cpio_dir