xref: /aosp_15_r20/external/grpc-grpc-java/compiler/check-artifact.sh (revision e07d83d3ffcef9ecfc9f7f475418ec639ff0e5fe)
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