
Commit858805b336
("kbuild: add $(BASH) to run scripts with bash-extension") shed light on portability issues. Here is another one. Since commitf07726048d
("Fix handling of backlash character in LINUX_COMPILE_BY name"), we must escape a backslash contained in LINUX_COMPILE_BY. This is not working on such distros as Ubuntu. As the POSIX spec [1] says, if any of the operands contain a backslash ( '\' ) character, the results are implementation-defined. The actual shell of /bin/sh could be bash, dash, etc. depending on distros, and the behavior of builtin echo command is different among them. The bash builtin echo, unless -e is given, copies the arguments to stdout without expanding escape sequences (BSD-like behavior). The dash builtin echo, in contrast, adopts System V behavior, which does expand escape sequences without any option given. Even non-builtin /bin/echo behaves differently depending on the system. Due to these variations, echo is considered as a non-portable command. Using printf is the common solution to avoid the portability issue. [1] https://pubs.opengroup.org/onlinepubs/009695399/utilities/echo.html Fixes:858805b336
("kbuild: add $(BASH) to run scripts with bash-extension") Reported-by: XXing Wei <xxing.wei@unisoc.com> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
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=$6
vecho() { [ "${quiet}" = "silent_" ] || echo "$@" ; }
If compile.h exists already and we don't own autoconf.h
(i.e. we're not the same user who did make *config), don't
modify compile.h
So "sudo make install" won't change the "compiled by "
do "compiled by root"
if [ -r $TARGET -a ! -O include/generated/autoconf.h ]; then vecho " SKIPPED $TARGET" exit 0 fi
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=hostname
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"
echo #define LINUX_COMPILER "$CC -v 2>&1 | grep ' version ' | sed 's/[[:space:]]*$//'
"
} > .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.
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 [ -r $TARGET ] &&
grep -v 'UTS_VERSION' $TARGET > .tmpver.1 &&
grep -v 'UTS_VERSION' .tmpcompile > .tmpver.2 &&
cmp -s .tmpver.1 .tmpver.2; then
rm -f .tmpcompile
else
vecho " UPD $TARGET"
mv -f .tmpcompile $TARGET
fi
rm -f .tmpver.1 .tmpver.2