143 lines
3.4 KiB
Bash
Executable file
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
|