|
1 #!/bin/bash |
|
2 # |
|
3 # Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. |
|
4 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
|
5 # |
|
6 # This code is free software; you can redistribute it and/or modify it |
|
7 # under the terms of the GNU General Public License version 2 only, as |
|
8 # published by the Free Software Foundation. |
|
9 # |
|
10 # This code is distributed in the hope that it will be useful, but WITHOUT |
|
11 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
12 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
13 # version 2 for more details (a copy is included in the LICENSE file that |
|
14 # accompanied this code). |
|
15 # |
|
16 # You should have received a copy of the GNU General Public License version |
|
17 # 2 along with this work; if not, write to the Free Software Foundation, |
|
18 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
19 # |
|
20 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
21 # or visit www.oracle.com if you need additional information or have any |
|
22 # questions. |
|
23 # |
|
24 |
|
25 # MANUAL |
|
26 # |
|
27 # ./common/bin/compare-objects.sh old_jdk_build_dir new_jdk_build_dir |
|
28 # |
|
29 # Compares object files |
|
30 # |
|
31 |
|
32 if [ "x$1" = "x-h" ] || [ "x$1" = "x--help" ] || [ "x$1" == "x" ]; then |
|
33 echo "bash ./common/bin/compare-build.sh old_jdk_build_dir new_jdk_build_dir" |
|
34 echo "" |
|
35 echo "Compare object files" |
|
36 echo "" |
|
37 exit 10 |
|
38 fi |
|
39 |
|
40 ####### |
|
41 # |
|
42 # List of files (grep patterns) that are ignored |
|
43 # |
|
44 # 1) hotspot object files |
|
45 IGNORE="-e hotspot" |
|
46 |
|
47 # 2) various build artifacts: sizer.32.o sizer.64.o dummyodbc.o |
|
48 # these are produced during build and then e.g run to produce other data |
|
49 # i.e not directly put into build => safe to ignore |
|
50 IGNORE="${IGNORE} -e sizer.32.o -e sizer.64.o" |
|
51 IGNORE="${IGNORE} -e dummyodbc.o" |
|
52 IGNORE="${IGNORE} -e genSolarisConstants.o" |
|
53 IGNORE="${IGNORE} -e genUnixConstants.o" |
|
54 |
|
55 OLD="$1" |
|
56 NEW="$2" |
|
57 shift; shift |
|
58 PATTERN="$*" |
|
59 |
|
60 if [ -f $NEW/spec.sh ]; then |
|
61 . $NEW/spec.sh |
|
62 elif [ -f $NEW/../../spec.sh ]; then |
|
63 . $NEW/../../spec.sh |
|
64 elif [ -f $OLD/spec.sh ]; then |
|
65 . $OLD/spec.sh |
|
66 elif [ -f $OLD/../../spec.sh ]; then |
|
67 . $OLD/../../spec.sh |
|
68 else |
|
69 echo "Unable to find spec.sh" |
|
70 echo "Giving up" |
|
71 exit 1 |
|
72 fi |
|
73 |
|
74 export COMPARE_ROOT=/tmp/cimages.$USER/objects |
|
75 mkdir -p $COMPARE_ROOT |
|
76 |
|
77 (${CD} $OLD && ${FIND} . -name '*.o') > $COMPARE_ROOT/list.old |
|
78 (${CD} $NEW && ${FIND} . -name '*.o') > $COMPARE_ROOT/list.new |
|
79 |
|
80 # On macosx JobjC is build in both i386 and x86_64 variant (universial binary) |
|
81 # but new build only builds the x86_64 |
|
82 # Remove the 386 variants from comparison...to avoid "false" positives |
|
83 ${GREP} -v 'JObjC.dst/Objects-normal/i386' $COMPARE_ROOT/list.old > $COMPARE_ROOT/list.old.new |
|
84 ${CP} $COMPARE_ROOT/list.old $COMPARE_ROOT/list.old.full |
|
85 ${CP} $COMPARE_ROOT/list.old.new $COMPARE_ROOT/list.old |
|
86 |
|
87 findnew() { |
|
88 arg_1=$1 |
|
89 arg_2=$2 |
|
90 |
|
91 # special case 1 unpack-cmd => unpackexe |
|
92 arg_1=`${ECHO} $arg_1 | ${SED} 's!unpack-cmd!unpackexe!g'` |
|
93 arg_2=`${ECHO} $arg_2 | ${SED} 's!unpack-cmd!unpackexe!g'` |
|
94 |
|
95 # special case 2 /JObjC.dst/ => /libjobjc/ |
|
96 arg_1=`${ECHO} $arg_1 | ${SED} 's!/JObjC.dst/!/libjobjc/!g'` |
|
97 arg_2=`${ECHO} $arg_2 | ${SED} 's!/JObjC.dst/!/libjobjc/!g'` |
|
98 |
|
99 full=`${ECHO} $arg_1 | ${SED} 's!\.!\\\.!g'` |
|
100 medium=`${ECHO} $arg_1 | ${SED} 's!.*/\([^/]*/[^/]*\)!\1!'` |
|
101 short=`${ECHO} $arg_2 | ${SED} 's!\.!\\\.!g'` |
|
102 if [ "`${GREP} -c "/$full" $COMPARE_ROOT/list.new`" -eq 1 ] |
|
103 then |
|
104 ${ECHO} $NEW/$arg_1 |
|
105 return |
|
106 fi |
|
107 |
|
108 if [ "`${GREP} -c "$medium" $COMPARE_ROOT/list.new`" -eq 1 ] |
|
109 then |
|
110 ${GREP} "$medium" $COMPARE_ROOT/list.new |
|
111 return |
|
112 fi |
|
113 |
|
114 if [ "`${GREP} -c "/$short" $COMPARE_ROOT/list.new`" -eq 1 ] |
|
115 then |
|
116 ${GREP} "/$short" $COMPARE_ROOT/list.new |
|
117 return |
|
118 fi |
|
119 |
|
120 # old style has "dir" before obj{64} |
|
121 dir=`${ECHO} $arg_1 | ${SED} 's!.*/\([^/]*\)/obj[64]*.*!\1!g'` |
|
122 if [ -n "$dir" -a "$dir" != "$arg_1" ] |
|
123 then |
|
124 if [ "`${GREP} $dir $COMPARE_ROOT/list.new | ${GREP} -c "/$short"`" -eq 1 ] |
|
125 then |
|
126 ${GREP} $dir $COMPARE_ROOT/list.new | ${GREP} "/$short" |
|
127 return |
|
128 fi |
|
129 |
|
130 # Try with lib$dir/ |
|
131 if [ "`${GREP} "lib$dir/" $COMPARE_ROOT/list.new | ${GREP} -c "/$short"`" -eq 1 ] |
|
132 then |
|
133 ${GREP} "lib$dir/" $COMPARE_ROOT/list.new | ${GREP} "/$short" |
|
134 return |
|
135 fi |
|
136 |
|
137 # Try with $dir_objs |
|
138 if [ "`${GREP} "${dir}_objs" $COMPARE_ROOT/list.new | ${GREP} -c "/$short"`" -eq 1 ] |
|
139 then |
|
140 ${GREP} "${dir}_objs" $COMPARE_ROOT/list.new | ${GREP} "/$short" |
|
141 return |
|
142 fi |
|
143 fi |
|
144 |
|
145 # check for some specifics... |
|
146 for i in demo hotspot jobjc |
|
147 do |
|
148 if [ "`${ECHO} $full | ${GREP} -c $i`" -gt 0 ] |
|
149 then |
|
150 if [ "`${GREP} $i $COMPARE_ROOT/list.new | ${GREP} -c "/$short"`" -eq 1 ] |
|
151 then |
|
152 ${GREP} $i $COMPARE_ROOT/list.new | ${GREP} "/$short" |
|
153 return |
|
154 fi |
|
155 fi |
|
156 done |
|
157 |
|
158 # check for specific demo |
|
159 demo=`${ECHO} $arg_1 | ${SED} 's!.*/demo/jvmti/\([^/]*\)/.*!\1!g'` |
|
160 if [ -n "$demo" -a "$dir" != "$demo" ] |
|
161 then |
|
162 if [ "`${GREP} $demo $COMPARE_ROOT/list.new | ${GREP} -c "/$short"`" -eq 1 ] |
|
163 then |
|
164 ${GREP} $demo $COMPARE_ROOT/list.new | ${GREP} "/$short" |
|
165 return |
|
166 fi |
|
167 fi |
|
168 |
|
169 return |
|
170 } |
|
171 |
|
172 compare() { |
|
173 old=$1 |
|
174 new=$2 |
|
175 ${DIFF} $old $new > /dev/null |
|
176 res=$? |
|
177 if [ $res -eq 0 ] |
|
178 then |
|
179 ${ECHO} 0 |
|
180 return |
|
181 fi |
|
182 |
|
183 # check if stripped objects gives equality |
|
184 ${CP} $old $COMPARE_ROOT/`basename $old`.old |
|
185 ${CP} $new $COMPARE_ROOT/`basename $old`.new |
|
186 ${POST_STRIP_CMD} $COMPARE_ROOT/`basename $old`.old $COMPARE_ROOT/`basename $old`.new > /dev/null 2>&1 |
|
187 ${DIFF} $COMPARE_ROOT/`basename $old`.old $COMPARE_ROOT/`basename $old`.new > /dev/null |
|
188 res=$? |
|
189 ${RM} $COMPARE_ROOT/`basename $old`.old $COMPARE_ROOT/`basename $old`.new |
|
190 if [ $res -eq 0 ] |
|
191 then |
|
192 ${ECHO} S |
|
193 return |
|
194 fi |
|
195 |
|
196 name=`basename $1 | ${SED} 's!\.o!!'` |
|
197 cntold=`strings $old | ${GREP} -c $name` |
|
198 cntnew=`strings $new | ${GREP} -c $name` |
|
199 |
|
200 if [ $cntold -gt 0 -a $cntnew -gt 0 ] |
|
201 then |
|
202 ${ECHO} F |
|
203 return |
|
204 fi |
|
205 |
|
206 ${ECHO} 1 |
|
207 } |
|
208 |
|
209 for F in `${CAT} $COMPARE_ROOT/list.old` |
|
210 do |
|
211 if [ "${IGNORE}" ] && [ "`${ECHO} $F | ${GREP} ${IGNORE}`" ] |
|
212 then |
|
213 # |
|
214 # skip ignored files |
|
215 # |
|
216 continue; |
|
217 fi |
|
218 |
|
219 if [ "$PATTERN" ] && [ `${ECHO} $F | ${GREP} -c $PATTERN` -eq 0 ] |
|
220 then |
|
221 continue; |
|
222 fi |
|
223 |
|
224 f=`basename $F` |
|
225 o=$OLD/$F |
|
226 n=`findnew $F $f` |
|
227 |
|
228 if [ "$n" ] |
|
229 then |
|
230 n="$NEW/$n" |
|
231 ${ECHO} `compare $o $n` : $f : $o : $n |
|
232 else |
|
233 ${ECHO} "- : $f : $o " |
|
234 fi |
|
235 done |