Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Matthias Maennich and committed by
Masahiro Yamada
a979522a 4a679593

+11 -3
+11 -3
scripts/mkcompile_h
··· 68 68 # Only replace the real compile.h if the new one is different, 69 69 # in order to preserve the timestamp and avoid unnecessary 70 70 # recompilations. 71 - # We don't consider the file changed if only the date/time changed. 71 + # We don't consider the file changed if only the date/time changed, 72 + # unless KBUILD_BUILD_TIMESTAMP was explicitly set (e.g. for 73 + # reproducible builds with that value referring to a commit timestamp). 72 74 # A kernel config change will increase the generation number, thus 73 75 # causing compile.h to be updated (including date/time) due to the 74 76 # changed comment in the 75 77 # first line. 76 78 79 + if [ -z "$KBUILD_BUILD_TIMESTAMP" ]; then 80 + IGNORE_PATTERN="UTS_VERSION" 81 + else 82 + IGNORE_PATTERN="NOT_A_PATTERN_TO_BE_MATCHED" 83 + fi 84 + 77 85 if [ -r $TARGET ] && \ 78 - grep -v 'UTS_VERSION' $TARGET > .tmpver.1 && \ 79 - grep -v 'UTS_VERSION' .tmpcompile > .tmpver.2 && \ 86 + grep -v $IGNORE_PATTERN $TARGET > .tmpver.1 && \ 87 + grep -v $IGNORE_PATTERN .tmpcompile > .tmpver.2 && \ 80 88 cmp -s .tmpver.1 .tmpver.2; then 81 89 rm -f .tmpcompile 82 90 else