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