11f5207b7SJohn Levon#!/bin/bash
21f5207b7SJohn Levon
31f5207b7SJohn LevonNR_CPU=$(cat /proc/cpuinfo | grep ^processor | wc -l)
41f5207b7SJohn LevonTARGET="bzImage modules"
51f5207b7SJohn LevonWLOG="smatch_warns.txt"
61f5207b7SJohn LevonLOG="smatch_compile.warns"
71f5207b7SJohn Levonfunction usage {
81f5207b7SJohn Levon    echo
91f5207b7SJohn Levon    echo "Usage:  $0 [smatch options]"
101f5207b7SJohn Levon    echo "Compiles the kernel with -j${NR_CPU}"
111f5207b7SJohn Levon    echo " available options:"
121f5207b7SJohn Levon    echo "	--endian          : enable endianess check"
131f5207b7SJohn Levon    echo "	--target {TARGET} : specify build target, default: $TARGET"
141f5207b7SJohn Levon    echo "	--log {FILE}      : Output compile log to file, default is: $LOG"
151f5207b7SJohn Levon    echo "	--wlog {FILE}     : Output warnigs to file, default is: $WLOG"
161f5207b7SJohn Levon    echo "	--help            : Show this usage"
171f5207b7SJohn Levon    exit 1
181f5207b7SJohn Levon}
191f5207b7SJohn Levon
201f5207b7SJohn Levon
211f5207b7SJohn Levonwhile true ; do
221f5207b7SJohn Levon    if [[ "$1" == "--endian" ]] ; then
231f5207b7SJohn Levon	ENDIAN="CF=-D__CHECK_ENDIAN__"
241f5207b7SJohn Levon	shift
251f5207b7SJohn Levon    elif [[ "$1" == "--target" ]] ; then
261f5207b7SJohn Levon	shift
271f5207b7SJohn Levon	TARGET="$1"
281f5207b7SJohn Levon	shift
291f5207b7SJohn Levon    elif [[ "$1" == "--log" ]] ; then
301f5207b7SJohn Levon	shift
311f5207b7SJohn Levon	LOG="$1"
321f5207b7SJohn Levon	shift
331f5207b7SJohn Levon    elif [[ "$1" == "--wlog" ]] ; then
341f5207b7SJohn Levon	shift
351f5207b7SJohn Levon	WLOG="$1"
361f5207b7SJohn Levon	shift
371f5207b7SJohn Levon    elif [[ "$1" == "--help" ]] ; then
381f5207b7SJohn Levon	usage
391f5207b7SJohn Levon    else
401f5207b7SJohn Levon	    break
411f5207b7SJohn Levon    fi
421f5207b7SJohn Levondone
431f5207b7SJohn Levon
44efe51d0cSJohn Levon# receive parameters from environment, which override
45efe51d0cSJohn Levon[ -z "${SMATCH_ENV_TARGET:-}" ] || TARGET="$SMATCH_ENV_TARGET"
46efe51d0cSJohn Levon[ -z "${SMATCH_ENV_BUILD_PARAM:-}" ] || BUILD_PARAM="$SMATCH_ENV_BUILD_PARAM"
47efe51d0cSJohn Levon
481f5207b7SJohn LevonSCRIPT_DIR=$(dirname $0)
491f5207b7SJohn Levonif [ -e $SCRIPT_DIR/../smatch ] ; then
501f5207b7SJohn Levon    cp $SCRIPT_DIR/../smatch $SCRIPT_DIR/../bak.smatch
511f5207b7SJohn Levon    CMD=$SCRIPT_DIR/../bak.smatch
521f5207b7SJohn Levonelif which smatch | grep smatch > /dev/null ; then
531f5207b7SJohn Levon    CMD=smatch
541f5207b7SJohn Levonelse
551f5207b7SJohn Levon    echo "Smatch binary not found."
561f5207b7SJohn Levon    exit 1
571f5207b7SJohn Levonfi
581f5207b7SJohn Levon
59*c85f09ccSJohn Levonif [[ ! -z $ARCH ]]; then
60*c85f09ccSJohn Levon	KERNEL_ARCH="ARCH=$ARCH"
61*c85f09ccSJohn Levonfi
62*c85f09ccSJohn Levonif [[ ! -z $CROSS_COMPILE ]] ; then
63*c85f09ccSJohn Levon	KERNEL_CROSS_COMPILE="CROSS_COMPILE=$CROSS_COMPILE"
64*c85f09ccSJohn Levonfi
65*c85f09ccSJohn Levon
66*c85f09ccSJohn Levonmake $KERNEL_ARCH $KERNEL_CROSS_COMPILE clean
671f5207b7SJohn Levonfind -name \*.c.smatch -exec rm \{\} \;
68*c85f09ccSJohn Levonmake $KERNEL_ARCH $KERNEL_CROSS_COMPILE -j${NR_CPU} $ENDIAN -k CHECK="$CMD -p=kernel --file-output --succeed $*" \
69efe51d0cSJohn Levon	C=1 $BUILD_PARAM $TARGET 2>&1 | tee $LOG
70efe51d0cSJohn LevonBUILD_STATUS=${PIPESTATUS[0]}
711f5207b7SJohn Levonfind -name \*.c.smatch -exec cat \{\} \; -exec rm \{\} \; > $WLOG
721f5207b7SJohn Levonfind -name \*.c.smatch.sql -exec cat \{\} \; -exec rm \{\} \; > $WLOG.sql
731f5207b7SJohn Levonfind -name \*.c.smatch.caller_info -exec cat \{\} \; -exec rm \{\} \; > $WLOG.caller_info
741f5207b7SJohn Levon
75efe51d0cSJohn Levonecho "Done. Build with status $BUILD_STATUS. The warnings are saved to $WLOG"
76efe51d0cSJohn Levonexit $BUILD_STATUS
77