1*e07d83d3SAndroid Build Coastguard Worker#!/bin/bash 2*e07d83d3SAndroid Build Coastguard Worker 3*e07d83d3SAndroid Build Coastguard Worker# Check that the codegen artifacts are of correct architecture and don't have 4*e07d83d3SAndroid Build Coastguard Worker# unexpected dependencies. 5*e07d83d3SAndroid Build Coastguard Worker# To be run from Gradle. 6*e07d83d3SAndroid Build Coastguard Worker# Usage: check-artifact <OS> <ARCH> 7*e07d83d3SAndroid Build Coastguard Worker# <OS> and <ARCH> are ${os.detected.name} and ${os.detected.arch} from 8*e07d83d3SAndroid Build Coastguard Worker# osdetector-gradle-plugin 9*e07d83d3SAndroid Build Coastguard WorkerOS=$1 10*e07d83d3SAndroid Build Coastguard WorkerARCH=$2 11*e07d83d3SAndroid Build Coastguard Worker 12*e07d83d3SAndroid Build Coastguard Workerif [[ $# < 2 ]]; then 13*e07d83d3SAndroid Build Coastguard Worker echo "No arguments provided. This script is intended to be run from Gradle." 14*e07d83d3SAndroid Build Coastguard Worker exit 1 15*e07d83d3SAndroid Build Coastguard Workerfi 16*e07d83d3SAndroid Build Coastguard Worker 17*e07d83d3SAndroid Build Coastguard Worker# Under Cygwin, bash doesn't have these in PATH when called from Gradle which 18*e07d83d3SAndroid Build Coastguard Worker# runs in Windows version of Java. 19*e07d83d3SAndroid Build Coastguard Workerexport PATH="/bin:/usr/bin:$PATH" 20*e07d83d3SAndroid Build Coastguard Worker 21*e07d83d3SAndroid Build Coastguard WorkerE_PARAM_ERR=98 22*e07d83d3SAndroid Build Coastguard WorkerE_ASSERT_FAILED=99 23*e07d83d3SAndroid Build Coastguard Worker 24*e07d83d3SAndroid Build Coastguard Worker# Usage: fail ERROR_MSG 25*e07d83d3SAndroid Build Coastguard Workerfail() 26*e07d83d3SAndroid Build Coastguard Worker{ 27*e07d83d3SAndroid Build Coastguard Worker echo "ERROR: $1" 28*e07d83d3SAndroid Build Coastguard Worker echo 29*e07d83d3SAndroid Build Coastguard Worker exit $E_ASSERT_FAILED 30*e07d83d3SAndroid Build Coastguard Worker} 31*e07d83d3SAndroid Build Coastguard Worker 32*e07d83d3SAndroid Build Coastguard Worker# Usage: assertEq VAL1 VAL2 $LINENO 33*e07d83d3SAndroid Build Coastguard WorkerassertEq () 34*e07d83d3SAndroid Build Coastguard Worker{ 35*e07d83d3SAndroid Build Coastguard Worker lineno=$3 36*e07d83d3SAndroid Build Coastguard Worker if [ -z "$lineno" ]; then 37*e07d83d3SAndroid Build Coastguard Worker echo "lineno not given" 38*e07d83d3SAndroid Build Coastguard Worker exit $E_PARAM_ERR 39*e07d83d3SAndroid Build Coastguard Worker fi 40*e07d83d3SAndroid Build Coastguard Worker 41*e07d83d3SAndroid Build Coastguard Worker if [[ "$1" != "$2" ]]; then 42*e07d83d3SAndroid Build Coastguard Worker echo "Assertion failed: \"$1\" == \"$2\"" 43*e07d83d3SAndroid Build Coastguard Worker echo "File \"$0\", line $lineno" # Give name of file and line number. 44*e07d83d3SAndroid Build Coastguard Worker exit $E_ASSERT_FAILED 45*e07d83d3SAndroid Build Coastguard Worker fi 46*e07d83d3SAndroid Build Coastguard Worker} 47*e07d83d3SAndroid Build Coastguard Worker 48*e07d83d3SAndroid Build Coastguard Worker# Checks the artifact is for the expected architecture 49*e07d83d3SAndroid Build Coastguard Worker# Usage: checkArch <path-to-protoc> 50*e07d83d3SAndroid Build Coastguard WorkercheckArch () 51*e07d83d3SAndroid Build Coastguard Worker{ 52*e07d83d3SAndroid Build Coastguard Worker echo 53*e07d83d3SAndroid Build Coastguard Worker echo "Checking format of $1" 54*e07d83d3SAndroid Build Coastguard Worker if [[ "$OS" == windows || "$OS" == linux ]]; then 55*e07d83d3SAndroid Build Coastguard Worker format="$(objdump -f "$1" | grep -o "file format .*$" | grep -o "[^ ]*$")" 56*e07d83d3SAndroid Build Coastguard Worker echo Format=$format 57*e07d83d3SAndroid Build Coastguard Worker if [[ "$OS" == linux ]]; then 58*e07d83d3SAndroid Build Coastguard Worker if [[ "$ARCH" == x86_32 ]]; then 59*e07d83d3SAndroid Build Coastguard Worker assertEq "$format" "elf32-i386" $LINENO 60*e07d83d3SAndroid Build Coastguard Worker elif [[ "$ARCH" == x86_64 ]]; then 61*e07d83d3SAndroid Build Coastguard Worker assertEq "$format" "elf64-x86-64" $LINENO 62*e07d83d3SAndroid Build Coastguard Worker elif [[ "$ARCH" == aarch_64 ]]; then 63*e07d83d3SAndroid Build Coastguard Worker assertEq "$format" "elf64-little" $LINENO 64*e07d83d3SAndroid Build Coastguard Worker elif [[ "$ARCH" == loongarch_64 ]]; then 65*e07d83d3SAndroid Build Coastguard Worker echo $format 66*e07d83d3SAndroid Build Coastguard Worker assertEq "$format" "elf64-loongarch" $LINENO 67*e07d83d3SAndroid Build Coastguard Worker elif [[ "$ARCH" == ppcle_64 ]]; then 68*e07d83d3SAndroid Build Coastguard Worker format="$(powerpc64le-linux-gnu-objdump -f "$1" | grep -o "file format .*$" | grep -o "[^ ]*$")" 69*e07d83d3SAndroid Build Coastguard Worker echo Format=$format 70*e07d83d3SAndroid Build Coastguard Worker assertEq "$format" "elf64-powerpcle" $LINENO 71*e07d83d3SAndroid Build Coastguard Worker elif [[ "$ARCH" == s390_64 ]]; then 72*e07d83d3SAndroid Build Coastguard Worker format="$(s390x-linux-gnu-objdump -f "$1" | grep -o "file format .*$" | grep -o "[^ ]*$")" 73*e07d83d3SAndroid Build Coastguard Worker echo Format=$format 74*e07d83d3SAndroid Build Coastguard Worker assertEq "$format" "elf64-s390" $LINENO 75*e07d83d3SAndroid Build Coastguard Worker else 76*e07d83d3SAndroid Build Coastguard Worker fail "Unsupported arch: $ARCH" 77*e07d83d3SAndroid Build Coastguard Worker fi 78*e07d83d3SAndroid Build Coastguard Worker else 79*e07d83d3SAndroid Build Coastguard Worker # $OS == windows 80*e07d83d3SAndroid Build Coastguard Worker if [[ "$ARCH" == x86_32 ]]; then 81*e07d83d3SAndroid Build Coastguard Worker assertEq "$format" "pei-i386" $LINENO 82*e07d83d3SAndroid Build Coastguard Worker elif [[ "$ARCH" == x86_64 ]]; then 83*e07d83d3SAndroid Build Coastguard Worker assertEq "$format" "pei-x86-64" $LINENO 84*e07d83d3SAndroid Build Coastguard Worker else 85*e07d83d3SAndroid Build Coastguard Worker fail "Unsupported arch: $ARCH" 86*e07d83d3SAndroid Build Coastguard Worker fi 87*e07d83d3SAndroid Build Coastguard Worker fi 88*e07d83d3SAndroid Build Coastguard Worker elif [[ "$OS" == osx ]]; then 89*e07d83d3SAndroid Build Coastguard Worker format="$(file -b "$1" | grep -o "[^ ]*$")" 90*e07d83d3SAndroid Build Coastguard Worker echo Format=$format 91*e07d83d3SAndroid Build Coastguard Worker if [[ "$ARCH" == x86_32 ]]; then 92*e07d83d3SAndroid Build Coastguard Worker assertEq "$format" "i386" $LINENO 93*e07d83d3SAndroid Build Coastguard Worker elif [[ "$ARCH" == x86_64 ]]; then 94*e07d83d3SAndroid Build Coastguard Worker assertEq "$format" "x86_64" $LINENO 95*e07d83d3SAndroid Build Coastguard Worker else 96*e07d83d3SAndroid Build Coastguard Worker fail "Unsupported arch: $ARCH" 97*e07d83d3SAndroid Build Coastguard Worker fi 98*e07d83d3SAndroid Build Coastguard Worker else 99*e07d83d3SAndroid Build Coastguard Worker fail "Unsupported system: $OS" 100*e07d83d3SAndroid Build Coastguard Worker fi 101*e07d83d3SAndroid Build Coastguard Worker echo 102*e07d83d3SAndroid Build Coastguard Worker} 103*e07d83d3SAndroid Build Coastguard Worker 104*e07d83d3SAndroid Build Coastguard Worker# Checks the dependencies of the artifact. Artifacts should only depend on 105*e07d83d3SAndroid Build Coastguard Worker# system libraries. 106*e07d83d3SAndroid Build Coastguard Worker# Usage: checkDependencies <path-to-protoc> 107*e07d83d3SAndroid Build Coastguard WorkercheckDependencies () 108*e07d83d3SAndroid Build Coastguard Worker{ 109*e07d83d3SAndroid Build Coastguard Worker echo "Checking dependencies of $1" 110*e07d83d3SAndroid Build Coastguard Worker if [[ "$OS" == windows ]]; then 111*e07d83d3SAndroid Build Coastguard Worker dump_cmd='objdump -x '"$1"' | fgrep "DLL Name"' 112*e07d83d3SAndroid Build Coastguard Worker white_list="KERNEL32\.dll\|msvcrt\.dll\|USER32\.dll" 113*e07d83d3SAndroid Build Coastguard Worker elif [[ "$OS" == linux ]]; then 114*e07d83d3SAndroid Build Coastguard Worker dump_cmd='ldd '"$1" 115*e07d83d3SAndroid Build Coastguard Worker if [[ "$ARCH" == x86_32 ]]; then 116*e07d83d3SAndroid Build Coastguard Worker white_list="linux-gate\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|ld-linux\.so\.2" 117*e07d83d3SAndroid Build Coastguard Worker elif [[ "$ARCH" == x86_64 ]]; then 118*e07d83d3SAndroid Build Coastguard Worker white_list="linux-vdso\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|ld-linux-x86-64\.so\.2" 119*e07d83d3SAndroid Build Coastguard Worker elif [[ "$ARCH" == aarch_64 ]]; then 120*e07d83d3SAndroid Build Coastguard Worker dump_cmd='aarch64-linux-gnu-objdump -x '"$1"' |grep "NEEDED"' 121*e07d83d3SAndroid Build Coastguard Worker white_list="linux-vdso\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|ld-linux-aarch64\.so\.1" 122*e07d83d3SAndroid Build Coastguard Worker elif [[ "$ARCH" == loongarch_64 ]]; then 123*e07d83d3SAndroid Build Coastguard Worker dump_cmd='objdump -x '"$1"' | grep NEEDED' 124*e07d83d3SAndroid Build Coastguard Worker white_list="linux-vdso\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|ld\.so\.1" 125*e07d83d3SAndroid Build Coastguard Worker elif [[ "$ARCH" == ppcle_64 ]]; then 126*e07d83d3SAndroid Build Coastguard Worker dump_cmd='powerpc64le-linux-gnu-objdump -x '"$1"' |grep "NEEDED"' 127*e07d83d3SAndroid Build Coastguard Worker white_list="linux-vdso64\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|ld64\.so\.2" 128*e07d83d3SAndroid Build Coastguard Worker elif [[ "$ARCH" == s390_64 ]]; then 129*e07d83d3SAndroid Build Coastguard Worker dump_cmd='s390x-linux-gnu-objdump -x '"$1"' |grep "NEEDED"' 130*e07d83d3SAndroid Build Coastguard Worker white_list="linux-vdso64\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|ld64\.so\.1" 131*e07d83d3SAndroid Build Coastguard Worker fi 132*e07d83d3SAndroid Build Coastguard Worker elif [[ "$OS" == osx ]]; then 133*e07d83d3SAndroid Build Coastguard Worker dump_cmd='otool -L '"$1"' | fgrep dylib' 134*e07d83d3SAndroid Build Coastguard Worker white_list="libz\.1\.dylib\|libc++.1.dylib\|libstdc++\.6\.dylib\|libSystem\.B\.dylib" 135*e07d83d3SAndroid Build Coastguard Worker fi 136*e07d83d3SAndroid Build Coastguard Worker if [[ -z "$white_list" || -z "$dump_cmd" ]]; then 137*e07d83d3SAndroid Build Coastguard Worker fail "Unsupported platform $OS-$ARCH." 138*e07d83d3SAndroid Build Coastguard Worker fi 139*e07d83d3SAndroid Build Coastguard Worker echo "Checking for expected dependencies ..." 140*e07d83d3SAndroid Build Coastguard Worker eval $dump_cmd | grep -i "$white_list" || fail "doesn't show any expected dependencies" 141*e07d83d3SAndroid Build Coastguard Worker echo "Checking for unexpected dependencies ..." 142*e07d83d3SAndroid Build Coastguard Worker eval $dump_cmd | grep -i -v "$white_list" 143*e07d83d3SAndroid Build Coastguard Worker ret=$? 144*e07d83d3SAndroid Build Coastguard Worker if [[ $ret == 0 ]]; then 145*e07d83d3SAndroid Build Coastguard Worker fail "found unexpected dependencies (listed above)." 146*e07d83d3SAndroid Build Coastguard Worker elif [[ $ret != 1 ]]; then 147*e07d83d3SAndroid Build Coastguard Worker fail "Error when checking dependencies." 148*e07d83d3SAndroid Build Coastguard Worker fi # grep returns 1 when "not found", which is what we expect 149*e07d83d3SAndroid Build Coastguard Worker echo "Dependencies look good." 150*e07d83d3SAndroid Build Coastguard Worker echo 151*e07d83d3SAndroid Build Coastguard Worker} 152*e07d83d3SAndroid Build Coastguard Worker 153*e07d83d3SAndroid Build Coastguard WorkerFILE="build/artifacts/java_plugin/protoc-gen-grpc-java.exe" 154*e07d83d3SAndroid Build Coastguard WorkercheckArch "$FILE" && checkDependencies "$FILE" 155