--- /dev/null 2012-06-05 09:41:31.162991907 +0200 +++ new/common/bin/compare-objects.sh 2012-07-06 00:58:06.695662537 +0200 @@ -0,0 +1,235 @@ +#!/bin/bash +# +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# MANUAL +# +# ./common/bin/compare-objects.sh old_jdk_build_dir new_jdk_build_dir +# +# Compares object files +# + +if [ "x$1" = "x-h" ] || [ "x$1" = "x--help" ] || [ "x$1" == "x" ]; then + echo "bash ./common/bin/compare-build.sh old_jdk_build_dir new_jdk_build_dir" + echo "" + echo "Compare object files" + echo "" + exit 10 +fi + +####### +# +# List of files (grep patterns) that are ignored +# +# 1) hotspot object files +IGNORE="-e hotspot" + +# 2) various build artifacts: sizer.32.o sizer.64.o dummyodbc.o +# these are produced during build and then e.g run to produce other data +# i.e not directly put into build => safe to ignore +IGNORE="${IGNORE} -e sizer.32.o -e sizer.64.o" +IGNORE="${IGNORE} -e dummyodbc.o" +IGNORE="${IGNORE} -e genSolarisConstants.o" +IGNORE="${IGNORE} -e genUnixConstants.o" + +OLD="$1" +NEW="$2" +shift; shift +PATTERN="$*" + +if [ -f $NEW/spec.sh ]; then + . $NEW/spec.sh +elif [ -f $NEW/../../spec.sh ]; then + . $NEW/../../spec.sh +elif [ -f $OLD/spec.sh ]; then + . $OLD/spec.sh +elif [ -f $OLD/../../spec.sh ]; then + . $OLD/../../spec.sh +else + echo "Unable to find spec.sh" + echo "Giving up" + exit 1 +fi + +export COMPARE_ROOT=/tmp/cimages.$USER/objects +mkdir -p $COMPARE_ROOT + +(${CD} $OLD && ${FIND} . -name '*.o') > $COMPARE_ROOT/list.old +(${CD} $NEW && ${FIND} . -name '*.o') > $COMPARE_ROOT/list.new + +# On macosx JobjC is build in both i386 and x86_64 variant (universial binary) +# but new build only builds the x86_64 +# Remove the 386 variants from comparison...to avoid "false" positives +${GREP} -v 'JObjC.dst/Objects-normal/i386' $COMPARE_ROOT/list.old > $COMPARE_ROOT/list.old.new +${CP} $COMPARE_ROOT/list.old $COMPARE_ROOT/list.old.full +${CP} $COMPARE_ROOT/list.old.new $COMPARE_ROOT/list.old + +findnew() { + arg_1=$1 + arg_2=$2 + + # special case 1 unpack-cmd => unpackexe + arg_1=`${ECHO} $arg_1 | ${SED} 's!unpack-cmd!unpackexe!g'` + arg_2=`${ECHO} $arg_2 | ${SED} 's!unpack-cmd!unpackexe!g'` + + # special case 2 /JObjC.dst/ => /libjobjc/ + arg_1=`${ECHO} $arg_1 | ${SED} 's!/JObjC.dst/!/libjobjc/!g'` + arg_2=`${ECHO} $arg_2 | ${SED} 's!/JObjC.dst/!/libjobjc/!g'` + + full=`${ECHO} $arg_1 | ${SED} 's!\.!\\\.!g'` + medium=`${ECHO} $arg_1 | ${SED} 's!.*/\([^/]*/[^/]*\)!\1!'` + short=`${ECHO} $arg_2 | ${SED} 's!\.!\\\.!g'` + if [ "`${GREP} -c "/$full" $COMPARE_ROOT/list.new`" -eq 1 ] + then + ${ECHO} $NEW/$arg_1 + return + fi + + if [ "`${GREP} -c "$medium" $COMPARE_ROOT/list.new`" -eq 1 ] + then + ${GREP} "$medium" $COMPARE_ROOT/list.new + return + fi + + if [ "`${GREP} -c "/$short" $COMPARE_ROOT/list.new`" -eq 1 ] + then + ${GREP} "/$short" $COMPARE_ROOT/list.new + return + fi + + # old style has "dir" before obj{64} + dir=`${ECHO} $arg_1 | ${SED} 's!.*/\([^/]*\)/obj[64]*.*!\1!g'` + if [ -n "$dir" -a "$dir" != "$arg_1" ] + then + if [ "`${GREP} $dir $COMPARE_ROOT/list.new | ${GREP} -c "/$short"`" -eq 1 ] + then + ${GREP} $dir $COMPARE_ROOT/list.new | ${GREP} "/$short" + return + fi + + # Try with lib$dir/ + if [ "`${GREP} "lib$dir/" $COMPARE_ROOT/list.new | ${GREP} -c "/$short"`" -eq 1 ] + then + ${GREP} "lib$dir/" $COMPARE_ROOT/list.new | ${GREP} "/$short" + return + fi + + # Try with $dir_objs + if [ "`${GREP} "${dir}_objs" $COMPARE_ROOT/list.new | ${GREP} -c "/$short"`" -eq 1 ] + then + ${GREP} "${dir}_objs" $COMPARE_ROOT/list.new | ${GREP} "/$short" + return + fi + fi + + # check for some specifics... + for i in demo hotspot jobjc + do + if [ "`${ECHO} $full | ${GREP} -c $i`" -gt 0 ] + then + if [ "`${GREP} $i $COMPARE_ROOT/list.new | ${GREP} -c "/$short"`" -eq 1 ] + then + ${GREP} $i $COMPARE_ROOT/list.new | ${GREP} "/$short" + return + fi + fi + done + + # check for specific demo + demo=`${ECHO} $arg_1 | ${SED} 's!.*/demo/jvmti/\([^/]*\)/.*!\1!g'` + if [ -n "$demo" -a "$dir" != "$demo" ] + then + if [ "`${GREP} $demo $COMPARE_ROOT/list.new | ${GREP} -c "/$short"`" -eq 1 ] + then + ${GREP} $demo $COMPARE_ROOT/list.new | ${GREP} "/$short" + return + fi + fi + + return +} + +compare() { + old=$1 + new=$2 + ${DIFF} $old $new > /dev/null + res=$? + if [ $res -eq 0 ] + then + ${ECHO} 0 + return + fi + + # check if stripped objects gives equality + ${CP} $old $COMPARE_ROOT/`basename $old`.old + ${CP} $new $COMPARE_ROOT/`basename $old`.new + ${POST_STRIP_CMD} $COMPARE_ROOT/`basename $old`.old $COMPARE_ROOT/`basename $old`.new > /dev/null 2>&1 + ${DIFF} $COMPARE_ROOT/`basename $old`.old $COMPARE_ROOT/`basename $old`.new > /dev/null + res=$? + ${RM} $COMPARE_ROOT/`basename $old`.old $COMPARE_ROOT/`basename $old`.new + if [ $res -eq 0 ] + then + ${ECHO} S + return + fi + + name=`basename $1 | ${SED} 's!\.o!!'` + cntold=`strings $old | ${GREP} -c $name` + cntnew=`strings $new | ${GREP} -c $name` + + if [ $cntold -gt 0 -a $cntnew -gt 0 ] + then + ${ECHO} F + return + fi + + ${ECHO} 1 +} + +for F in `${CAT} $COMPARE_ROOT/list.old` +do + if [ "${IGNORE}" ] && [ "`${ECHO} $F | ${GREP} ${IGNORE}`" ] + then + # + # skip ignored files + # + continue; + fi + + if [ "$PATTERN" ] && [ `${ECHO} $F | ${GREP} -c $PATTERN` -eq 0 ] + then + continue; + fi + + f=`basename $F` + o=$OLD/$F + n=`findnew $F $f` + + if [ "$n" ] + then + n="$NEW/$n" + ${ECHO} `compare $o $n` : $f : $o : $n + else + ${ECHO} "- : $f : $o " + fi +done