compat-wireless: propagate errors with ckmake
[~tnikolova/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 RET=""
30
31 LSB_RED_ID=$(/usr/bin/lsb_release -i -s)
32 case $LSB_RED_ID in
33 "Ubuntu")
34         for i in $(find /lib/modules/ -type d -name \*generic\* | sort -n -r | grep -v -E '\-[[:alnum:]]{1,2}\-'); do
35                 KLIBS="$KLIBS $i"
36         done
37         ;;
38 *)
39         echo -e "Unsupported distribution"
40         exit
41         ;;
42 esac
43
44 function tee_color_split()
45 {
46         while read; do
47                 echo -e $REPLY | ./scripts/skip-colors >> $LOG
48                 echo -e $REPLY
49         done
50 }
51
52 function log_try_kernel()
53 {
54         echo -en "Trying kernel ${BLUE}"
55         printf "%40s\t" "${1}"
56         echo -en "${NORMAL}"
57 }
58
59 function usage()
60 {
61         echo -e "Usage: $0 [-t]"
62         echo -e "-t   will run: 'time ckmake; time ckmake' account for"
63         echo -e "     benchmark how long it takes to compile without ccache"
64         echo -e "     and a run after cache kicks in"
65 }
66
67 if [[ $# -gt 1 ]]; then
68         usage
69         exit 1
70 fi
71
72 if [[ $# -eq 1 ]]; then
73         if [[ $1 != "-t" ]]; then
74                 usage
75                 exit 1
76         fi
77         TIME="1"
78 fi
79
80 function run_ckmake()
81 {
82         for i in $KLIBS; do
83                 KERNEL=$(basename $i)
84                 DIR=${i}/build/
85                 echo -e "--------------------------------------------" >> $LOG
86
87                 if [[ ! -d $DIR ]]; then
88                         continue
89                 fi
90
91                 # We cannot use tee_color_split() as bash read only spits
92                 # out output when a newline comes in. We can modif IFS but
93                 # I am still not sure how to do this properly.
94                 log_try_kernel $KERNEL | ./scripts/skip-colors >> $LOG
95                 log_try_kernel $KERNEL
96
97                 ionice -c 3 nice -n 20 make -s KLIB=$DIR KLIB_BUILD=$DIR -j6 -Wunused-but-set-variable &>> $LOG
98                 CUR_RET=$?
99
100                 if [[ $RET = "" ]]; then
101                         RET=$CUR_RET
102                 fi
103
104                 if [[ $CUR_RET -eq 0 ]]; then
105                         echo -e "${GREEN}[OK]${NORMAL}" | tee_color_split
106                 else
107                         echo -e "${RED}[FAILED]${NORMAL}" | tee_color_split
108                         RET=$CUR_RET
109                 fi
110
111                 nice make clean KLIB=$DIR KLIB_BUILD=$DIR 2>&1 >> $LOG
112         done
113 }
114
115 nice make clean 2>&1 > $LOG
116
117 if [[ $TIME != "1" ]]; then
118         run_ckmake
119         exit $RET
120 fi
121
122 time $0
123 time $0 | egrep "real|user|sys"
124
125 exit $RET