1#! /bin/bash 2 3set_env() 4{ 5 cd /home/worker 6 HGDIR=/home/worker 7 OUTPUTDIR=$(pwd)$(echo "/output") 8 DATE=$(date "+TB [%Y-%m-%d %H:%M:%S]") 9 10 if [ ! -d "${OUTPUTDIR}" ]; then 11 echo "Creating output dir" 12 mkdir "${OUTPUTDIR}" 13 fi 14 15 if [ ! -d "nspr" ]; then 16 for i in 0 2 5; do 17 sleep $i 18 hg clone -r "default" "https://hg.mozilla.org/projects/nspr" "${HGDIR}/nspr" && break 19 rm -rf nspr 20 done 21 fi 22 23 if [[ -f nss/nspr.patch && "$ALLOW_NSPR_PATCH" == "1" ]]; then 24 pushd nspr 25 cat ../nss/nspr.patch | patch -p1 26 popd 27 fi 28 29 cd nss 30 ./build.sh -v -c 31 cd .. 32} 33 34check_abi() 35{ 36 set_env 37 set +e #reverses set -e from build.sh to allow possible hg clone failures 38 if [[ "$1" != --nobuild ]]; then # Start nobuild block 39 40 echo "######## NSS ABI CHECK ########" 41 echo "######## creating temporary HG clones ########" 42 43 rm -rf ${HGDIR}/baseline 44 mkdir ${HGDIR}/baseline 45 BASE_NSS=`cat ${HGDIR}/nss/automation/abi-check/previous-nss-release` #Reads the version number of the last release from the respective file 46 NSS_CLONE_RESULT=0 47 for i in 0 2 5; do 48 sleep $i 49 hg clone -u "${BASE_NSS}" "https://hg.mozilla.org/projects/nss" "${HGDIR}/baseline/nss" 50 if [ $? -eq 0 ]; then 51 NSS_CLONE_RESULT=0 52 break 53 fi 54 rm -rf "${HGDIR}/baseline/nss" 55 NSS_CLONE_RESULT=1 56 done 57 if [ ${NSS_CLONE_RESULT} -ne 0 ]; then 58 echo "invalid tag in automation/abi-check/previous-nss-release" 59 return 1 60 fi 61 62 BASE_NSPR=NSPR_$(head -1 ${HGDIR}/baseline/nss/automation/release/nspr-version.txt | cut -d . -f 1-2 | tr . _)_BRANCH 63 hg clone -u "${BASE_NSPR}" "https://hg.mozilla.org/projects/nspr" "${HGDIR}/baseline/nspr" 64 NSPR_CLONE_RESULT=$? 65 66 if [ ${NSPR_CLONE_RESULT} -ne 0 ]; then 67 rm -rf "${HGDIR}/baseline/nspr" 68 for i in 0 2 5; do 69 sleep $i 70 hg clone -u "default" "https://hg.mozilla.org/projects/nspr" "${HGDIR}/baseline/nspr" && break 71 rm -rf "${HGDIR}/baseline/nspr" 72 done 73 echo "Nonexisting tag ${BASE_NSPR} derived from ${BASE_NSS} automation/release/nspr-version.txt" 74 echo "Using default branch instead." 75 fi 76 77 echo "######## building baseline NSPR/NSS ########" 78 echo "${HGDIR}/baseline/nss/build.sh" 79 cd ${HGDIR}/baseline/nss 80 ./build.sh -v -c 81 cd ${HGDIR} 82 else # Else nobuild block 83 echo "######## using existing baseline NSPR/NSS build ########" 84 fi # End nobuild block 85 86 set +e #reverses set -e from build.sh to allow abidiff failures 87 88 echo "######## Starting abidiff procedure ########" 89 abi_diff 90} 91 92#Slightly modified from builbot-slave/build.sh 93abi_diff() 94{ 95 ABI_PROBLEM_FOUND=0 96 ABI_REPORT=${OUTPUTDIR}/abi-diff.txt 97 rm -f ${ABI_REPORT} 98 PREVDIST=${HGDIR}/baseline/dist 99 NEWDIST=${HGDIR}/dist 100 # libnssdbm3.so isn't built by default anymore, skip it. 101 ALL_SOs="libfreebl3.so libfreeblpriv3.so libnspr4.so libnss3.so libnssckbi.so libnsssysinit.so libnssutil3.so libplc4.so libplds4.so libsmime3.so libsoftokn3.so libssl3.so" 102 for SO in ${ALL_SOs}; do 103 if [ ! -f ${HGDIR}/nss/automation/abi-check/expected-report-$SO.txt ]; then 104 touch ${HGDIR}/nss/automation/abi-check/expected-report-$SO.txt 105 fi 106 abidiff --hd1 $PREVDIST/public/ --hd2 $NEWDIST/public \ 107 $PREVDIST/*/lib/$SO $NEWDIST/*/lib/$SO \ 108 > ${HGDIR}/nss/automation/abi-check/new-report-temp$SO.txt 109 RET=$? 110 cat ${HGDIR}/nss/automation/abi-check/new-report-temp$SO.txt \ 111 | grep -v "^Functions changes summary:" \ 112 | grep -v "^Variables changes summary:" \ 113 | sed -e 's/__anonymous_enum__[0-9]*/__anonymous_enum__/g' \ 114 > ${HGDIR}/nss/automation/abi-check/new-report-$SO.txt 115 rm -f ${HGDIR}/nss/automation/abi-check/new-report-temp$SO.txt 116 117 ABIDIFF_ERROR=$((($RET & 0x01) != 0)) 118 ABIDIFF_USAGE_ERROR=$((($RET & 0x02) != 0)) 119 ABIDIFF_ABI_CHANGE=$((($RET & 0x04) != 0)) 120 ABIDIFF_ABI_INCOMPATIBLE_CHANGE=$((($RET & 0x08) != 0)) 121 ABIDIFF_UNKNOWN_BIT_SET=$((($RET & 0xf0) != 0)) 122 123 # If abidiff reports an error, or a usage error, or if it sets a result 124 # bit value this script doesn't know yet about, we'll report failure. 125 # For ABI changes, we don't yet report an error. We'll compare the 126 # result report with our whitelist. This allows us to silence changes 127 # that we're already aware of and have been declared acceptable. 128 129 REPORT_RET_AS_FAILURE=0 130 if [ $ABIDIFF_ERROR -ne 0 ]; then 131 echo "abidiff reported ABIDIFF_ERROR." 132 REPORT_RET_AS_FAILURE=1 133 fi 134 if [ $ABIDIFF_USAGE_ERROR -ne 0 ]; then 135 echo "abidiff reported ABIDIFF_USAGE_ERROR." 136 REPORT_RET_AS_FAILURE=1 137 fi 138 if [ $ABIDIFF_UNKNOWN_BIT_SET -ne 0 ]; then 139 echo "abidiff reported ABIDIFF_UNKNOWN_BIT_SET." 140 REPORT_RET_AS_FAILURE=1 141 fi 142 143 if [ $ABIDIFF_ABI_CHANGE -ne 0 ]; then 144 echo "Ignoring abidiff result ABI_CHANGE, instead we'll check for non-whitelisted differences." 145 fi 146 if [ $ABIDIFF_ABI_INCOMPATIBLE_CHANGE -ne 0 ]; then 147 echo "Ignoring abidiff result ABIDIFF_ABI_INCOMPATIBLE_CHANGE, instead we'll check for non-whitelisted differences." 148 fi 149 150 if [ $REPORT_RET_AS_FAILURE -ne 0 ]; then 151 ABI_PROBLEM_FOUND=1 152 echo "abidiff {$PREVDIST , $NEWDIST} for $SO FAILED with result $RET, or failed writing to ${HGDIR}/nss/automation/abi-check/new-report-$SO.txt" 153 fi 154 if [ ! -f ${HGDIR}/nss/automation/abi-check/expected-report-$SO.txt ]; then 155 ABI_PROBLEM_FOUND=1 156 echo "FAILED to access report file: ${HGDIR}/nss/automation/abi-check/expected-report-$SO.txt" 157 fi 158 159 diff -wB -u ${HGDIR}/nss/automation/abi-check/expected-report-$SO.txt \ 160 ${HGDIR}/nss/automation/abi-check/new-report-$SO.txt >> ${ABI_REPORT} 161 if [ ! -f ${ABI_REPORT} ]; then 162 ABI_PROBLEM_FOUND=1 163 echo "FAILED to compare exepcted and new report: ${HGDIR}/nss/automation/abi-check/new-report-$SO.txt" 164 fi 165 done 166 167 if [ -s ${ABI_REPORT} ]; then 168 echo "FAILED: there are new unexpected ABI changes" 169 cat ${ABI_REPORT} 170 return 1 171 elif [ $ABI_PROBLEM_FOUND -ne 0 ]; then 172 echo "FAILED: failure executing the ABI checks" 173 cat ${ABI_REPORT} 174 return 1 175 fi 176 177 return 0 178} 179 180check_abi $1 181