compat: use -s instead of -q
[~emulex/for-vlad/old/compat.git] / bin / ckmake
1 #!/bin/bash
2 #
3 # Copyright (C) 2012, Luis R. Rodriguez <mcgrof@frijolero.org>
4 # Copyright (C) 2012, Hauke Mehrtens <hauke@hauke-m.de>
5 #
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License version 2 as
8 # published by the Free Software Foundation.
9 #
10 # You can use this to compile a module accross all installed kernels
11 # found. This relies on distribution specific kernels, but can handle
12 # your own custom list of target kernels. Log is setnt to LOG variable.
13
14 # Pretty colors
15 GREEN="\033[01;32m"
16 YELLOW="\033[01;33m"
17 NORMAL="\033[00m"
18 BLUE="\033[34m"
19 RED="\033[31m"
20 PURPLE="\033[35m"
21 CYAN="\033[36m"
22 UNDERLINE="\033[02m"
23
24 #export KCFLAGS="-Wno-unused-but-set-variable"
25 KERNEL_DIR="/lib/modules"
26 KLIBS=""
27 LOG="ckmake.log"
28 TIME="0"
29 QUIET=""
30 ARGS=""
31
32 RET=""
33
34 LSB_RED_ID=$(/usr/bin/lsb_release -i -s)
35 case $LSB_RED_ID in
36 "Ubuntu")
37         for i in $(find /lib/modules/ -type d -name \*generic\* | sort -n -r | grep -v -E '\-[[:alnum:]]{1,2}\-'); do
38                 KLIBS="$KLIBS $i"
39         done
40         ;;
41 *)
42         echo -e "Unsupported distribution"
43         exit
44         ;;
45 esac
46
47 function tee_color_split()
48 {
49         while read; do
50                 echo -e $REPLY | ./scripts/skip-colors >> $LOG
51                 echo -e $REPLY
52         done
53 }
54
55 function log_try_kernel()
56 {
57         echo -en "Trying kernel ${BLUE}"
58         printf "%40s\t" "${1}"
59         echo -en "${NORMAL}"
60 }
61
62 function usage()
63 {
64         echo -e "Usage: $0 [-t] <optional-target>"
65         echo -e "-t   will run: 'time ckmake; time ckmake' account for"
66         echo -e "     benchmark how long it takes to compile without ccache"
67         echo -e "     and a run after cache kicks in"
68         echo -e "-q   will ask ckmake to run make with -s to only output errors"
69         echo
70         echo -e "<optional-target>  is the arguments you want to pass to the"
71         echo -e "child make call that ckmake will use. For example if you have"
72         echo -e "a target 'linux' on your Makefile you can run 'cmake linux'"
73 }
74
75 for i in $@ ; do
76         case $1 in
77                 "-h")
78                         usage
79                         exit 1
80                         ;;
81                 "--help")
82                         usage
83                         exit 1
84                         ;;
85                 "-t")
86                         TIME="1"
87                         shift
88                         ;;
89                 "-s")
90                         QUIET="-s"
91                         shift
92                         ;;
93                 *)
94                         ARGS="${ARGS} $1"
95                         shift
96         esac
97 done
98
99 function run_ckmake()
100 {
101         for i in $KLIBS; do
102                 KERNEL=$(basename $i)
103                 DIR=${i}/build/
104                 echo -e "--------------------------------------------" >> $LOG
105
106                 if [[ ! -d $DIR ]]; then
107                         continue
108                 fi
109
110                 # We cannot use tee_color_split() as bash read only spits
111                 # out output when a newline comes in. We can modif IFS but
112                 # I am still not sure how to do this properly.
113                 log_try_kernel $KERNEL | ./scripts/skip-colors >> $LOG
114                 log_try_kernel $KERNEL
115
116                 ionice -c 3 nice -n 20 make $QUIET KLIB=$DIR KLIB_BUILD=$DIR -j6 -Wunused-but-set-variable $ARGS &>> $LOG
117                 CUR_RET=$?
118
119                 if [[ $RET = "" ]]; then
120                         RET=$CUR_RET
121                 fi
122
123                 if [[ $CUR_RET -eq 0 ]]; then
124                         echo -e "${GREEN}[OK]${NORMAL}" | tee_color_split
125                 else
126                         echo -e "${RED}[FAILED]${NORMAL}" | tee_color_split
127                         RET=$CUR_RET
128                 fi
129
130                 nice make clean KLIB=$DIR KLIB_BUILD=$DIR 2>&1 >> $LOG
131         done
132 }
133
134 nice make clean 2>&1 > $LOG
135
136 if [[ $TIME != "1" ]]; then
137         run_ckmake
138         exit $RET
139 fi
140
141 time $0 $QUIET $ARGS
142 time $0 $QUIET $ARGS | egrep "real|user|sys"
143
144 exit $RET