huawei-mrd-kernel/scripts/check_defconfigs

143 lines
3.4 KiB
Bash
Executable file

#!/bin/bash
function usage ()
{
echo $0 'Check for kernel defconfig mismacth'
echo 'Usage:'
echo ' '$0' [-c] [-u] [defconfig-files]'
echo ' -c Check changed defconfigs from last git commit'
echo ' -u Update defconfig if no mismatch is found'
echo ' -h This help'
exit 0
}
CONFIGS=
UPDATE=0
CHECK_COMMIT=0
while getopts "cuh" opt; do
case $opt in
c)
if [ $# == 2 ]; then
CHECK_COMMIT=$2
else
CHECK_COMMIT="HEAD"
fi
KCONFIG=`git show ${CHECK_COMMIT} --stat | gawk '/\/Kconfig.* +\| +[0-9]*/{print $1}'`
if [ ".$KCONFIG" != "." ]; then
echo From git commit: Checking all defconfig due to Kconfig is changed.
CONFIGS=`grep -rl "CONFIG_MTK_PLATFORM" arch/arm/configs arch/arm64/configs`
fi
CONFIGS+=" `git show ${CHECK_COMMIT} --stat-width=500 | gawk '/arch\/(arm64|arm)\/configs\/.*_defconfig +\| +[0-9]*/{print $1}'`"
CONFIGS=`echo $CONFIGS | xargs -n1 | sort -u | xargs`
if [ ".$CONFIGS" != "." ]; then
echo From git commit: Checking $CONFIGS
fi
;;
u)
UPDATE=1
;;
h)
usage
;;
esac
done
if [ $# == 0 ]; then
usage
fi
if [ $CHECK_COMMIT == 0 ]; then
shift $((OPTIND-1))
CONFIGS="${CONFIGS} $*"
fi
check_defconfig() {
CONFIG=$1
UPDATE=$2
FAIL=0
echo "Checking ${CONFIG}"
if [ ! -e ${CONFIG} ]; then
echo warning: defconfig file $CONFIG not found
return $FAIL
fi
echo $CONFIG | grep arch/arm64 > /dev/null
RETVAL=$?
if [ $RETVAL != 0 ]; then
ARCH=arm
else
ARCH=arm64
fi
OUT=out-$$
mkdir ${OUT}
OUTPUT="$(make ARCH=${ARCH} O=${OUT} `basename ${CONFIG}` savedefconfig 2>&1)"
RETVAL=$?
echo "$OUTPUT"
if [ $RETVAL != 0 ]; then
echo error: Make ${CONFIG} error
rm -rf ${OUT}
FAIL=1
return $FAIL
fi
# Check if there is a warning message
if echo "$OUTPUT" | grep -q "^warning:"; then
echo error: there is a warning message with Kconfig
rm -rf ${OUT}
FAIL=1
return $FAIL
fi
# Check option mismatch
gawk 'BEGIN{lastf="";} { if (lastf != FILENAME) { if (lastf != "") CHECK=1; lastf=FILENAME; } } \
/CONFIG_/ { match($0, /CONFIG_[^ =]*/); option=substr($0, RSTART, RLENGTH); \
if (CHECK==1) { if (option in opts && opts[option]==$0) delete opts[option]; } \
else { if (option in opts && opts[option]!=$0) dups[option]=$0; opts[option]=$0; } } \
END { C=0; RET=0; for (i in dups) { RET=1; C++; printf("error: %s duplicate in defconfig\n", i); } \
for (i in opts) { RET=1; C++; printf("error: %s mismatch\n", i); } exit(RET);}' ${CONFIG} ${OUT}/.config
RETVAL=$?
if [ $RETVAL != 0 ]; then
echo error: ${CONFIG}: defconfig mismatch. Please check Kconfig and follow SOP to update _defconfig.
rm -rf ${OUT}
FAIL=1
return $FAIL
fi
if [ $UPDATE == 0 ]; then
# Compare output, make sure format is correct
OUTPUT="$(diff -u ${OUT}/defconfig ${CONFIG} 2>&1)"
RETVAL=$?
if [ $RETVAL != 0 ]; then
echo error: ${CONFIG} compare error. Please follow SOP to update _defconfig
echo "$OUTPUT"
rm -rf ${OUT}
FAIL=1
return $FAIL
fi
else
cp ${OUT}/defconfig ${CONFIG}
fi
rm -rf ${OUT}
return $FAIL
}
export -f check_defconfig
parallel check_defconfig ::: $CONFIGS ::: $UPDATE
RETVAL=$?
if [ $RETVAL != 0 ]; then
echo
echo Please check the following wiki for detail, thanks!
echo http://wiki.mediatek.inc/display/KernelStandardization/Check+defconfig+in+kernel+preflight
echo http://wiki.mediatek.inc/display/KernelStandardization/SOP+to+update+kernel+config
fi
exit $RETVAL