mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 13:55:32 +00:00
![Daniel Mentz](/assets/img/avatar_default.png)
For out-of-tree builds, this script invokes cpio twice to copy header files from the srctree and subsequently from the objtree. According to a comment in the script, there might be situations in which certain files already exist in the destination directory when header files are copied from the objtree: "The second CPIO can complain if files already exist which can happen with out of tree builds having stale headers in srctree. Just silence CPIO for now." GNU cpio might simply print a warning like "newer or same age version exists", but toybox cpio exits with a non-zero exit code unless the command line option "-u" is specified. To improve compatibility with toybox cpio, add the command line option "-u" to unconditionally replace existing files in the destination directory. Signed-off-by: Daniel Mentz <danielmentz@google.com> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
95 lines
3.1 KiB
Bash
Executable file
95 lines
3.1 KiB
Bash
Executable file
#!/bin/sh
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
|
|
# This script generates an archive consisting of kernel headers
|
|
# for CONFIG_IKHEADERS.
|
|
set -e
|
|
sfile="$(readlink -f "$0")"
|
|
outdir="$(pwd)"
|
|
tarfile=$1
|
|
cpio_dir=$outdir/$tarfile.tmp
|
|
|
|
dir_list="
|
|
include/
|
|
arch/$SRCARCH/include/
|
|
"
|
|
|
|
# Support incremental builds by skipping archive generation
|
|
# if timestamps of files being archived are not changed.
|
|
|
|
# This block is useful for debugging the incremental builds.
|
|
# Uncomment it for debugging.
|
|
# if [ ! -f /tmp/iter ]; then iter=1; echo 1 > /tmp/iter;
|
|
# else iter=$(($(cat /tmp/iter) + 1)); echo $iter > /tmp/iter; fi
|
|
# find $all_dirs -name "*.h" | xargs ls -l > /tmp/ls-$iter
|
|
|
|
all_dirs=
|
|
if [ "$building_out_of_srctree" ]; then
|
|
for d in $dir_list; do
|
|
all_dirs="$all_dirs $srctree/$d"
|
|
done
|
|
fi
|
|
all_dirs="$all_dirs $dir_list"
|
|
|
|
# include/generated/compile.h is ignored because it is touched even when none
|
|
# of the source files changed.
|
|
#
|
|
# When Kconfig regenerates include/generated/autoconf.h, its timestamp is
|
|
# updated, but the contents might be still the same. When any CONFIG option is
|
|
# changed, Kconfig touches the corresponding timestamp file include/config/*.
|
|
# Hence, the md5sum detects the configuration change anyway. We do not need to
|
|
# check include/generated/autoconf.h explicitly.
|
|
#
|
|
# Ignore them for md5 calculation to avoid pointless regeneration.
|
|
headers_md5="$(find $all_dirs -name "*.h" |
|
|
grep -v "include/generated/compile.h" |
|
|
grep -v "include/generated/autoconf.h" |
|
|
xargs ls -l | md5sum | cut -d ' ' -f1)"
|
|
|
|
# Any changes to this script will also cause a rebuild of the archive.
|
|
this_file_md5="$(ls -l $sfile | md5sum | cut -d ' ' -f1)"
|
|
if [ -f $tarfile ]; then tarfile_md5="$(md5sum $tarfile | cut -d ' ' -f1)"; fi
|
|
if [ -f kernel/kheaders.md5 ] &&
|
|
[ "$(head -n 1 kernel/kheaders.md5)" = "$headers_md5" ] &&
|
|
[ "$(head -n 2 kernel/kheaders.md5 | tail -n 1)" = "$this_file_md5" ] &&
|
|
[ "$(tail -n 1 kernel/kheaders.md5)" = "$tarfile_md5" ]; then
|
|
exit
|
|
fi
|
|
|
|
echo " GEN $tarfile"
|
|
|
|
rm -rf $cpio_dir
|
|
mkdir $cpio_dir
|
|
|
|
if [ "$building_out_of_srctree" ]; then
|
|
(
|
|
cd $srctree
|
|
for f in $dir_list
|
|
do find "$f" -name "*.h";
|
|
done | cpio --quiet -pd $cpio_dir
|
|
)
|
|
fi
|
|
|
|
# The second CPIO can complain if files already exist which can happen with out
|
|
# of tree builds having stale headers in srctree. Just silence CPIO for now.
|
|
for f in $dir_list;
|
|
do find "$f" -name "*.h";
|
|
done | cpio --quiet -pdu $cpio_dir >/dev/null 2>&1
|
|
|
|
# Remove comments except SDPX lines
|
|
find $cpio_dir -type f -print0 |
|
|
xargs -0 -P8 -n1 perl -pi -e 'BEGIN {undef $/;}; s/\/\*((?!SPDX).)*?\*\///smg;'
|
|
|
|
# Create archive and try to normalize metadata for reproducibility.
|
|
# For compatibility with older versions of tar, files are fed to tar
|
|
# pre-sorted, as --sort=name might not be available.
|
|
find $cpio_dir -printf "./%P\n" | LC_ALL=C sort | \
|
|
tar "${KBUILD_BUILD_TIMESTAMP:+--mtime=$KBUILD_BUILD_TIMESTAMP}" \
|
|
--owner=0 --group=0 --numeric-owner --no-recursion \
|
|
-I $XZ -cf $tarfile -C $cpio_dir/ -T - > /dev/null
|
|
|
|
echo $headers_md5 > kernel/kheaders.md5
|
|
echo "$this_file_md5" >> kernel/kheaders.md5
|
|
echo "$(md5sum $tarfile | cut -d ' ' -f1)" >> kernel/kheaders.md5
|
|
|
|
rm -rf $cpio_dir
|