Added checks required to support RHEL7.1
[~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 LOG_TMP="ckmake-tmp.log"
29 REPORT="ckmake-report.log"
30 TIME="0"
31 QUIET=""
32 ARGS=""
33
34 RET=""
35
36 for i in $(find /lib/modules/ -type d -name \*generic\* | sort -n -r | grep -v -E '\-[[:alnum:]]{1,2}\-'); do
37         KLIBS="$KLIBS $i"
38 done
39
40 function tee_color_split()
41 {
42         while read; do
43                 echo -e $REPLY | ./scripts/skip-colors >> $1
44                 echo -e $REPLY
45         done
46 }
47
48 function log_try_kernel()
49 {
50         echo -en "Trying kernel ${BLUE}"
51         printf "%40s\t" "${1}"
52         echo -en "${NORMAL}"
53 }
54
55 function usage()
56 {
57         echo -e "Usage: $0 [-t] <optional-target>"
58         echo -e "-t   will run: 'time ckmake; time ckmake' account for"
59         echo -e "     benchmark how long it takes to compile without ccache"
60         echo -e "     and a run after cache kicks in"
61         echo -e "-q   will ask ckmake to run make with -s to only output errors"
62         echo
63         echo -e "<optional-target>  is the arguments you want to pass to the"
64         echo -e "child make call that ckmake will use. For example if you have"
65         echo -e "a target 'linux' on your Makefile you can run 'cmake linux'"
66 }
67
68 for i in $@ ; do
69         case $1 in
70                 "-h")
71                         usage
72                         exit 1
73                         ;;
74                 "--help")
75                         usage
76                         exit 1
77                         ;;
78                 "-t")
79                         TIME="1"
80                         shift
81                         ;;
82                 "-s")
83                         QUIET="-s"
84                         shift
85                         ;;
86                 *)
87                         ARGS="${ARGS} $1"
88                         shift
89         esac
90 done
91
92 function run_ckmake()
93 {
94         for i in $KLIBS; do
95                 KERNEL=$(basename $i)
96                 DIR=${i}/build/
97                 echo -e "--------------------------------------------" >> $LOG
98
99                 if [[ ! -d $DIR ]]; then
100                         continue
101                 fi
102
103                 # We cannot use tee_color_split() as bash read only spits
104                 # out output when a newline comes in. We can modif IFS but
105                 # I am still not sure how to do this properly.
106                 log_try_kernel $KERNEL | ./scripts/skip-colors >> $LOG
107                 log_try_kernel $KERNEL
108
109                 ionice -c 3 nice -n 20 make $QUIET KLIB=$DIR KLIB_BUILD=$DIR -j6 -Wunused-but-set-variable $ARGS &>> $LOG
110                 CUR_RET=$?
111
112                 if [[ $RET = "" ]]; then
113                         RET=$CUR_RET
114                 fi
115
116                 if [[ $CUR_RET -eq 0 ]]; then
117                         echo -e "${GREEN}[OK]${NORMAL}" | tee_color_split $LOG
118                 else
119                         echo -e "${RED}[FAILED]${NORMAL}" | tee_color_split $LOG
120                         RET=$CUR_RET
121                 fi
122
123                 nice make clean KLIB=$DIR KLIB_BUILD=$DIR 2>&1 >> $LOG
124         done
125 }
126
127 for i in $LOG $LOG_TMP $REPORT; do
128         echo > $i
129 done
130
131 nice make clean 2>&1 > $LOG
132
133 if [[ $TIME != "1" ]]; then
134         run_ckmake | tee_color_split $REPORT
135
136         cat $LOG $REPORT > $LOG_TMP
137         mv $LOG_TMP $LOG
138         rm -f $LOG_TMP
139
140         exit $RET
141 fi
142
143 time $0 $QUIET $ARGS | tee_color_split $REPORT
144 time $0 $QUIET $ARGS | egrep "real|user|sys" | tee_color_split $REPORT
145
146 cat $LOG $REPORT > $LOG_TMP
147 mv $LOG_TMP $LOG
148
149 rm -f $LOG_TMP
150
151 exit $RET