1*4882a593Smuzhiyun#!/bin/sh 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 3*4882a593Smuzhiyun 4*4882a593SmuzhiyunTARGET=$1 5*4882a593SmuzhiyunARCH=$2 6*4882a593SmuzhiyunSMP=$3 7*4882a593SmuzhiyunPREEMPT=$4 8*4882a593SmuzhiyunPREEMPT_RT=$5 9*4882a593SmuzhiyunCC_VERSION="$6" 10*4882a593SmuzhiyunLD=$7 11*4882a593Smuzhiyun 12*4882a593Smuzhiyunvecho() { [ "${quiet}" = "silent_" ] || echo "$@" ; } 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun# Do not expand names 15*4882a593Smuzhiyunset -f 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun# Fix the language to get consistent output 18*4882a593SmuzhiyunLC_ALL=C 19*4882a593Smuzhiyunexport LC_ALL 20*4882a593Smuzhiyun 21*4882a593Smuzhiyunif [ -z "$KBUILD_BUILD_VERSION" ]; then 22*4882a593Smuzhiyun VERSION=$(cat .version 2>/dev/null || echo 1) 23*4882a593Smuzhiyunelse 24*4882a593Smuzhiyun VERSION=$KBUILD_BUILD_VERSION 25*4882a593Smuzhiyunfi 26*4882a593Smuzhiyun 27*4882a593Smuzhiyunif [ -z "$KBUILD_BUILD_TIMESTAMP" ]; then 28*4882a593Smuzhiyun TIMESTAMP=`date` 29*4882a593Smuzhiyunelse 30*4882a593Smuzhiyun TIMESTAMP=$KBUILD_BUILD_TIMESTAMP 31*4882a593Smuzhiyunfi 32*4882a593Smuzhiyunif test -z "$KBUILD_BUILD_USER"; then 33*4882a593Smuzhiyun LINUX_COMPILE_BY=$(whoami | sed 's/\\/\\\\/') 34*4882a593Smuzhiyunelse 35*4882a593Smuzhiyun LINUX_COMPILE_BY=$KBUILD_BUILD_USER 36*4882a593Smuzhiyunfi 37*4882a593Smuzhiyunif test -z "$KBUILD_BUILD_HOST"; then 38*4882a593Smuzhiyun LINUX_COMPILE_HOST=`uname -n` 39*4882a593Smuzhiyunelse 40*4882a593Smuzhiyun LINUX_COMPILE_HOST=$KBUILD_BUILD_HOST 41*4882a593Smuzhiyunfi 42*4882a593Smuzhiyun 43*4882a593SmuzhiyunUTS_VERSION="#$VERSION" 44*4882a593SmuzhiyunCONFIG_FLAGS="" 45*4882a593Smuzhiyunif [ -n "$SMP" ] ; then CONFIG_FLAGS="SMP"; fi 46*4882a593Smuzhiyunif [ -n "$PREEMPT" ] ; then CONFIG_FLAGS="$CONFIG_FLAGS PREEMPT"; fi 47*4882a593Smuzhiyunif [ -n "$PREEMPT_RT" ] ; then CONFIG_FLAGS="$CONFIG_FLAGS PREEMPT_RT"; fi 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun# Truncate to maximum length 50*4882a593SmuzhiyunUTS_LEN=64 51*4882a593SmuzhiyunUTS_VERSION="$(echo $UTS_VERSION $CONFIG_FLAGS $TIMESTAMP | cut -b -$UTS_LEN)" 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun# Generate a temporary compile.h 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun{ echo /\* This file is auto generated, version $VERSION \*/ 56*4882a593Smuzhiyun if [ -n "$CONFIG_FLAGS" ] ; then echo "/* $CONFIG_FLAGS */"; fi 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun echo \#define UTS_MACHINE \"$ARCH\" 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun echo \#define UTS_VERSION \"$UTS_VERSION\" 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun printf '#define LINUX_COMPILE_BY "%s"\n' "$LINUX_COMPILE_BY" 63*4882a593Smuzhiyun echo \#define LINUX_COMPILE_HOST \"$LINUX_COMPILE_HOST\" 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun LD_VERSION=$($LD -v | head -n1 | sed 's/(compatible with [^)]*)//' \ 66*4882a593Smuzhiyun | sed 's/[[:space:]]*$//') 67*4882a593Smuzhiyun printf '#define LINUX_COMPILER "%s"\n' "$CC_VERSION, $LD_VERSION" 68*4882a593Smuzhiyun} > .tmpcompile 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun# Only replace the real compile.h if the new one is different, 71*4882a593Smuzhiyun# in order to preserve the timestamp and avoid unnecessary 72*4882a593Smuzhiyun# recompilations. 73*4882a593Smuzhiyun# We don't consider the file changed if only the date/time changed, 74*4882a593Smuzhiyun# unless KBUILD_BUILD_TIMESTAMP was explicitly set (e.g. for 75*4882a593Smuzhiyun# reproducible builds with that value referring to a commit timestamp). 76*4882a593Smuzhiyun# A kernel config change will increase the generation number, thus 77*4882a593Smuzhiyun# causing compile.h to be updated (including date/time) due to the 78*4882a593Smuzhiyun# changed comment in the 79*4882a593Smuzhiyun# first line. 80*4882a593Smuzhiyun 81*4882a593Smuzhiyunif [ -z "$KBUILD_BUILD_TIMESTAMP" ]; then 82*4882a593Smuzhiyun IGNORE_PATTERN="UTS_VERSION" 83*4882a593Smuzhiyunelse 84*4882a593Smuzhiyun IGNORE_PATTERN="NOT_A_PATTERN_TO_BE_MATCHED" 85*4882a593Smuzhiyunfi 86*4882a593Smuzhiyun 87*4882a593Smuzhiyunif [ -r $TARGET ] && \ 88*4882a593Smuzhiyun grep -v $IGNORE_PATTERN $TARGET > .tmpver.1 && \ 89*4882a593Smuzhiyun grep -v $IGNORE_PATTERN .tmpcompile > .tmpver.2 && \ 90*4882a593Smuzhiyun cmp -s .tmpver.1 .tmpver.2; then 91*4882a593Smuzhiyun rm -f .tmpcompile 92*4882a593Smuzhiyunelse 93*4882a593Smuzhiyun vecho " UPD $TARGET" 94*4882a593Smuzhiyun mv -f .tmpcompile $TARGET 95*4882a593Smuzhiyunfi 96*4882a593Smuzhiyunrm -f .tmpver.1 .tmpver.2 97