check_defconfigs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #!/bin/bash
  2. function usage ()
  3. {
  4. echo $0 'Check for kernel defconfig mismacth'
  5. echo 'Usage:'
  6. echo ' '$0' [-c] [-u] [defconfig-files]'
  7. echo ' -c Check changed defconfigs from last git commit'
  8. echo ' -u Update defconfig if no mismatch is found'
  9. echo ' -h This help'
  10. exit 0
  11. }
  12. CONFIGS=
  13. OUT=out-$$
  14. FAIL=0
  15. UPDATE=0
  16. CHECK_COMMIT=0
  17. while getopts "cuh" opt; do
  18. case $opt in
  19. c)
  20. if [ $# == 2 ]; then
  21. CHECK_COMMIT=$2
  22. else
  23. CHECK_COMMIT="HEAD"
  24. fi
  25. CONFIGS=`git show ${CHECK_COMMIT} --stat | gawk '/arch\/(arm64|arm)\/configs\/.*_defconfig +\| +[0-9]*/{print $1}'`
  26. if [ ".$CONFIGS" != "." ]; then
  27. echo From git commit: Checking $CONFIGS
  28. fi
  29. ;;
  30. u)
  31. UPDATE=1
  32. ;;
  33. h)
  34. usage
  35. ;;
  36. esac
  37. done
  38. if [ $# == 0 ]; then
  39. usage
  40. fi
  41. if [ $CHECK_COMMIT == 0 ]; then
  42. shift $((OPTIND-1))
  43. CONFIGS="${CONFIGS} $*"
  44. fi
  45. mkdir ${OUT}
  46. for CONFIG in $CONFIGS ; do
  47. if [ ! -e ${CONFIG} ]; then
  48. echo warning: defconfig file $CONFIG not found
  49. continue
  50. fi
  51. echo $CONFIG | grep arch/arm64 > /dev/null
  52. RETVAL=$?
  53. if [ $RETVAL != 0 ]; then
  54. ARCH=arm
  55. else
  56. ARCH=arm64
  57. fi
  58. make ARCH=${ARCH} O=${OUT} `basename ${CONFIG}` savedefconfig
  59. RETVAL=$?
  60. if [ $RETVAL != 0 ]; then
  61. echo error: Make ${CONFIG} error
  62. FAIL=1
  63. continue
  64. fi
  65. # Check option mismatch
  66. echo ${CONFIG} ${OUT}/.config
  67. gawk 'BEGIN{lastf="";} { if (lastf != FILENAME) { if (lastf != "") CHECK=1; lastf=FILENAME; } } \
  68. /CONFIG_/ { match($0, /CONFIG_[^ =]*/); option=substr($0, RSTART, RLENGTH); \
  69. if (CHECK==1) { if (option in opts && opts[option]==$0) delete opts[option]; } \
  70. else { if (option in opts && opts[option]!=$0) dups[option]=$0; opts[option]=$0; } } \
  71. END { C=0; RET=0; for (i in dups) { RET=1; C++; printf("error: %s duplicate in defconfig\n", i); } \
  72. for (i in opts) { RET=1; C++; printf("error: %s mismatch\n", i); } exit(RET);}' ${CONFIG} ${OUT}/.config
  73. RETVAL=$?
  74. if [ $RETVAL != 0 ]; then
  75. echo error: ${CONFIG}: defconfig mismatch. Please check Kconfig and follow SOP to update _defconfig.
  76. FAIL=1
  77. continue
  78. fi
  79. if [ $UPDATE == 0 ]; then
  80. # Compare output, make sure format is correct
  81. cmp ${OUT}/defconfig ${CONFIG} > /dev/null
  82. RETVAL=$?
  83. if [ $RETVAL != 0 ]; then
  84. echo error: ${CONFIG} compare error. Please follow SOP to update _defconfig
  85. FAIL=1
  86. continue
  87. fi
  88. else
  89. cp ${OUT}/defconfig ${CONFIG}
  90. fi
  91. done
  92. if [ $FAIL == 1 ]; then
  93. echo
  94. echo Please be informed that we had phased in defconfig check mechanism in kernel preflight for kernel 3.18 on 2015/7/27.
  95. echo
  96. echo Please check the following wiki for detail, thanks!
  97. echo http://wiki.mediatek.inc/display/KernelStandardization/Check+defconfig+in+kernel+preflight
  98. echo http://wiki.mediatek.inc/display/KernelStandardization/SOP+to+update+kernel+config
  99. fi
  100. rm -rf ${OUT}
  101. exit $FAIL