You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
3.4 KiB
143 lines
3.4 KiB
#!/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
|
|
|