mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00

When a header file is changed, kernel/gen_kheaders.sh may fail to update kernel/kheaders_data.tar.xz. [steps to reproduce] [1] Build kernel/kheaders_data.tar.xz $ make -j$(nproc) kernel/kheaders.o DESCEND objtool INSTALL libsubcmd_headers CALL scripts/checksyscalls.sh CHK kernel/kheaders_data.tar.xz GEN kernel/kheaders_data.tar.xz CC kernel/kheaders.o [2] Modify a header without changing the file size $ sed -i s/0xdeadbeef/0xfeedbeef/ include/linux/elfnote.h [3] Rebuild kernel/kheaders_data.tar.xz $ make -j$(nproc) kernel/kheaders.o DESCEND objtool INSTALL libsubcmd_headers CALL scripts/checksyscalls.sh CHK kernel/kheaders_data.tar.xz kernel/kheaders_data.tar.xz is not updated if steps [1] - [3] are run within the same minute. The headers_md5 variable stores the MD5 hash of the 'ls -l' output for all header files. This hash value is used to determine whether kheaders_data.tar.xz needs to be rebuilt. However, 'ls -l' prints the modification times with minute-level granularity. If a file is modified within the same minute and its size remains the same, the MD5 hash does not change. To reliably detect file modifications, this commit rewrites kernel/gen_kheaders.sh to output header dependencies to kernel/.kheaders_data.tar.xz.cmd. Then, Make compares the timestamps and reruns kernel/gen_kheaders.sh when necessary. This is the standard mechanism used by Make and Kbuild. Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
50 lines
1.4 KiB
Bash
Executable File
50 lines
1.4 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
|
|
tarfile=$1
|
|
srclist=$2
|
|
objlist=$3
|
|
|
|
dir=$(dirname "${tarfile}")
|
|
tmpdir=${dir}/.tmp_dir
|
|
depfile=${dir}/.$(basename "${tarfile}").d
|
|
|
|
# generate dependency list.
|
|
{
|
|
echo
|
|
echo "deps_${tarfile} := \\"
|
|
sed 's:\(.*\): \1 \\:' "${srclist}"
|
|
sed -n '/^include\/generated\/autoconf\.h$/!s:\(.*\): \1 \\:p' "${objlist}"
|
|
echo
|
|
echo "${tarfile}: \$(deps_${tarfile})"
|
|
echo
|
|
echo "\$(deps_${tarfile}):"
|
|
|
|
} > "${depfile}"
|
|
|
|
rm -rf "${tmpdir}"
|
|
mkdir "${tmpdir}"
|
|
|
|
# shellcheck disable=SC2154 # srctree is passed as an env variable
|
|
sed "s:^${srctree}/::" "${srclist}" | tar -c -f - -C "${srctree}" -T - | tar -xf - -C "${tmpdir}"
|
|
tar -c -f - -T "${objlist}" | tar -xf - -C "${tmpdir}"
|
|
|
|
# Remove comments except SDPX lines
|
|
# Use a temporary file to store directory contents to prevent find/xargs from
|
|
# seeing temporary files created by perl.
|
|
find "${tmpdir}" -type f -print0 > "${tmpdir}.contents.txt"
|
|
xargs -0 -P8 -n1 \
|
|
perl -pi -e 'BEGIN {undef $/;}; s/\/\*((?!SPDX).)*?\*\///smg;' \
|
|
< "${tmpdir}.contents.txt"
|
|
rm -f "${tmpdir}.contents.txt"
|
|
|
|
# Create archive and try to normalize metadata for reproducibility.
|
|
tar "${KBUILD_BUILD_TIMESTAMP:+--mtime=$KBUILD_BUILD_TIMESTAMP}" \
|
|
--owner=0 --group=0 --sort=name --numeric-owner --mode=u=rw,go=r,a+X \
|
|
-I $XZ -cf $tarfile -C "${tmpdir}/" . > /dev/null
|
|
|
|
rm -rf "${tmpdir}"
|