1#!/bin/bash 2 3NR_CPU=$(cat /proc/cpuinfo | grep ^processor | wc -l) 4TARGET="bzImage modules" 5WLOG="smatch_warns.txt" 6LOG="smatch_compile.warns" 7function usage { 8 echo 9 echo "Usage: $0 [smatch options]" 10 echo "Compiles the kernel with -j${NR_CPU}" 11 echo " available options:" 12 echo " --endian : enable endianess check" 13 echo " --target {TARGET} : specify build target, default: $TARGET" 14 echo " --log {FILE} : Output compile log to file, default is: $LOG" 15 echo " --wlog {FILE} : Output warnigs to file, default is: $WLOG" 16 echo " --help : Show this usage" 17 exit 1 18} 19 20 21while true ; do 22 if [[ "$1" == "--endian" ]] ; then 23 ENDIAN="CF=-D__CHECK_ENDIAN__" 24 shift 25 elif [[ "$1" == "--target" ]] ; then 26 shift 27 TARGET="$1" 28 shift 29 elif [[ "$1" == "--log" ]] ; then 30 shift 31 LOG="$1" 32 shift 33 elif [[ "$1" == "--wlog" ]] ; then 34 shift 35 WLOG="$1" 36 shift 37 elif [[ "$1" == "--help" ]] ; then 38 usage 39 else 40 break 41 fi 42done 43 44# receive parameters from environment, which override 45[ -z "${SMATCH_ENV_TARGET:-}" ] || TARGET="$SMATCH_ENV_TARGET" 46[ -z "${SMATCH_ENV_BUILD_PARAM:-}" ] || BUILD_PARAM="$SMATCH_ENV_BUILD_PARAM" 47 48SCRIPT_DIR=$(dirname $0) 49if [ -e $SCRIPT_DIR/../smatch ] ; then 50 cp $SCRIPT_DIR/../smatch $SCRIPT_DIR/../bak.smatch 51 CMD=$SCRIPT_DIR/../bak.smatch 52elif which smatch | grep smatch > /dev/null ; then 53 CMD=smatch 54else 55 echo "Smatch binary not found." 56 exit 1 57fi 58 59if [[ ! -z $ARCH ]]; then 60 KERNEL_ARCH="ARCH=$ARCH" 61fi 62if [[ ! -z $CROSS_COMPILE ]] ; then 63 KERNEL_CROSS_COMPILE="CROSS_COMPILE=$CROSS_COMPILE" 64fi 65 66make $KERNEL_ARCH $KERNEL_CROSS_COMPILE clean 67find -name \*.c.smatch -exec rm \{\} \; 68make $KERNEL_ARCH $KERNEL_CROSS_COMPILE -j${NR_CPU} $ENDIAN -k CHECK="$CMD -p=kernel --file-output --succeed $*" \ 69 C=1 $BUILD_PARAM $TARGET 2>&1 | tee $LOG 70BUILD_STATUS=${PIPESTATUS[0]} 71find -name \*.c.smatch -exec cat \{\} \; -exec rm \{\} \; > $WLOG 72find -name \*.c.smatch.sql -exec cat \{\} \; -exec rm \{\} \; > $WLOG.sql 73find -name \*.c.smatch.caller_info -exec cat \{\} \; -exec rm \{\} \; > $WLOG.caller_info 74 75echo "Done. Build with status $BUILD_STATUS. The warnings are saved to $WLOG" 76exit $BUILD_STATUS 77