linux-yocto/scripts/mkcompile_h
Matthias Maennich a979522a1a kbuild: mkcompile_h: consider timestamp if KBUILD_BUILD_TIMESTAMP is set
To avoid unnecessary recompilations, mkcompile_h does not regenerate
compile.h if just the timestamp changed.
Though, if KBUILD_BUILD_TIMESTAMP is set, an explicit timestamp for the
build was requested, in which case we should not ignore it.

If a user follows the documentation for reproducible builds [1] and
defines KBUILD_BUILD_TIMESTAMP as the git commit timestamp, a clean
build will have the correct timestamp. A subsequent cherry-pick (or
amend) changes the commit timestamp and if an incremental build is done
with a different KBUILD_BUILD_TIMESTAMP now, that new value is not taken
into consideration. But it should for reproducibility.

Hence, whenever KBUILD_BUILD_TIMESTAMP is explicitly set, do not ignore
UTS_VERSION when making a decision about whether the regenerated version
of compile.h should be moved into place.

[1] https://www.kernel.org/doc/html/latest/kbuild/reproducible-builds.html

Signed-off-by: Matthias Maennich <maennich@google.com>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2021-06-17 10:01:12 +09:00

2.5 KiB
Executable File

#!/bin/sh

SPDX-License-Identifier: GPL-2.0

TARGET=$1 ARCH=$2 SMP=$3 PREEMPT=$4 PREEMPT_RT=$5 CC_VERSION="$6" LD=$7

Do not expand names

set -f

Fix the language to get consistent output

LC_ALL=C export LC_ALL

if [ -z "$KBUILD_BUILD_VERSION" ]; then VERSION=$(cat .version 2>/dev/null || echo 1) else VERSION=$KBUILD_BUILD_VERSION fi

if [ -z "$KBUILD_BUILD_TIMESTAMP" ]; then TIMESTAMP=date else TIMESTAMP=$KBUILD_BUILD_TIMESTAMP fi if test -z "$KBUILD_BUILD_USER"; then LINUX_COMPILE_BY=$(whoami | sed 's/\/\\/') else LINUX_COMPILE_BY=$KBUILD_BUILD_USER fi if test -z "$KBUILD_BUILD_HOST"; then LINUX_COMPILE_HOST=uname -n else LINUX_COMPILE_HOST=$KBUILD_BUILD_HOST fi

UTS_VERSION="#$VERSION" CONFIG_FLAGS="" if [ -n "$SMP" ] ; then CONFIG_FLAGS="SMP"; fi if [ -n "$PREEMPT" ] ; then CONFIG_FLAGS="$CONFIG_FLAGS PREEMPT"; fi if [ -n "$PREEMPT_RT" ] ; then CONFIG_FLAGS="$CONFIG_FLAGS PREEMPT_RT"; fi

Truncate to maximum length

UTS_LEN=64 UTS_VERSION="$(echo $UTS_VERSION $CONFIG_FLAGS $TIMESTAMP | cut -b -$UTS_LEN)"

Generate a temporary compile.h

{ echo /* This file is auto generated, version $VERSION */ if [ -n "$CONFIG_FLAGS" ] ; then echo "/* $CONFIG_FLAGS */"; fi

echo #define UTS_MACHINE "$ARCH"

echo #define UTS_VERSION "$UTS_VERSION"

printf '#define LINUX_COMPILE_BY "%s"\n' "$LINUX_COMPILE_BY" echo #define LINUX_COMPILE_HOST "$LINUX_COMPILE_HOST"

LD_VERSION=$($LD -v | head -n1 | sed 's/(compatible with [^)])//'
| sed 's/:space:
$//') printf '#define LINUX_COMPILER "%s"\n' "$CC_VERSION, $LD_VERSION" } > .tmpcompile

Only replace the real compile.h if the new one is different,

in order to preserve the timestamp and avoid unnecessary

recompilations.

We don't consider the file changed if only the date/time changed,

unless KBUILD_BUILD_TIMESTAMP was explicitly set (e.g. for

reproducible builds with that value referring to a commit timestamp).

A kernel config change will increase the generation number, thus

causing compile.h to be updated (including date/time) due to the

changed comment in the

first line.

if [ -z "$KBUILD_BUILD_TIMESTAMP" ]; then IGNORE_PATTERN="UTS_VERSION" else IGNORE_PATTERN="NOT_A_PATTERN_TO_BE_MATCHED" fi

if [ -r $TARGET ] &&
grep -v $IGNORE_PATTERN $TARGET > .tmpver.1 &&
grep -v $IGNORE_PATTERN .tmpcompile > .tmpver.2 &&
cmp -s .tmpver.1 .tmpver.2; then rm -f .tmpcompile else echo " UPD $TARGET" mv -f .tmpcompile $TARGET fi rm -f .tmpver.1 .tmpver.2