github.com/peggyl/go@v0.0.0-20151008231540-ae315999c2d5/misc/cgo/testcshared/test.bash (about)

     1  #!/usr/bin/env bash
     2  # Copyright 2015 The Go Authors. All rights reserved.
     3  # Use of this source code is governed by a BSD-style
     4  # license that can be found in the LICENSE file.
     5  
     6  # For testing Android, this script requires adb to push and run compiled
     7  # binaries on a target device.
     8  
     9  set -e
    10  
    11  if [ ! -f src/libgo/libgo.go ]; then
    12  	cwd=$(pwd)
    13  	echo 'misc/cgo/testcshared/test.bash is running in $cwd' 1>&2
    14  	exit 1
    15  fi
    16  
    17  goos=$(go env GOOS)
    18  goarch=$(go env GOARCH)
    19  
    20  # Directory where cgo headers and outputs will be installed.
    21  # The installation directory format varies depending on the platform.
    22  installdir=pkg/${goos}_${goarch}_testcshared_shared
    23  if [ "${goos}/${goarch}" == "android/arm" ] || [ "${goos}/${goarch}" == "darwin/amd64" ]; then
    24  	installdir=pkg/${goos}_${goarch}_testcshared
    25  fi
    26  
    27  # Temporary directory on the android device.
    28  androidpath=/data/local/tmp/testcshared-$$
    29  
    30  function cleanup() {
    31  	rm -rf libgo.$libext libgo2.$libext libgo.h testp testp2 testp3 pkg
    32  
    33  	rm -rf $(go env GOROOT)/${installdir}
    34  
    35  	if [ "$goos" == "android" ]; then
    36  		adb shell rm -rf $androidpath
    37  	fi
    38  }
    39  trap cleanup EXIT
    40  
    41  if [ "$goos" == "android" ]; then
    42  	adb shell mkdir -p "$androidpath"
    43  fi
    44  
    45  function run() {
    46  	case "$goos" in
    47  	"android")
    48  		local args=$@
    49  		output=$(adb shell "cd ${androidpath}; $@")
    50  		output=$(echo $output|tr -d '\r')
    51  		case $output in
    52  			*PASS) echo "PASS";; 
    53  			*) echo "$output";;
    54  		esac
    55  		;;
    56  	*)
    57  		echo $(env $@)
    58  		;;
    59  	esac
    60  }
    61  
    62  function binpush() {
    63  	bin=${1}
    64  	if [ "$goos" == "android" ]; then
    65  		adb push "$bin"  "${androidpath}/${bin}" 2>/dev/null
    66  	fi
    67  }
    68  
    69  rm -rf pkg
    70  
    71  suffix="-installsuffix testcshared"
    72  
    73  libext="so"
    74  if [ "$goos" == "darwin" ]; then
    75  	libext="dylib"
    76  fi
    77  
    78  # Create the header files.
    79  GOPATH=$(pwd) go install -buildmode=c-shared $suffix libgo
    80  
    81  GOPATH=$(pwd) go build -buildmode=c-shared $suffix -o libgo.$libext src/libgo/libgo.go
    82  binpush libgo.$libext
    83  
    84  if [ "$goos" == "linux" ]; then
    85      if readelf -d libgo.$libext | grep TEXTREL >/dev/null; then
    86          echo "libgo.$libext has TEXTREL set"
    87          exit 1
    88      fi
    89  fi
    90  
    91  # test0: exported symbols in shared lib are accessible.
    92  # TODO(iant): using _shared here shouldn't really be necessary.
    93  $(go env CC) $(go env GOGCCFLAGS) -I ${installdir} -o testp main0.c libgo.$libext
    94  binpush testp
    95  
    96  output=$(run LD_LIBRARY_PATH=. ./testp)
    97  if [ "$output" != "PASS" ]; then
    98  	echo "FAIL test0 got ${output}"
    99  	exit 1
   100  fi
   101  
   102  # test1: shared library can be dynamically loaded and exported symbols are accessible.
   103  $(go env CC) $(go env GOGCCFLAGS) -o testp main1.c -ldl
   104  binpush testp
   105  output=$(run ./testp ./libgo.$libext)
   106  if [ "$output" != "PASS" ]; then
   107  	echo "FAIL test1 got ${output}"
   108  	exit 1
   109  fi
   110  
   111  # test2: tests libgo2 which does not export any functions.
   112  GOPATH=$(pwd) go build -buildmode=c-shared $suffix -o libgo2.$libext src/libgo2/libgo2.go
   113  binpush libgo2.$libext
   114  linkflags="-Wl,--no-as-needed"
   115  if [ "$goos" == "darwin" ]; then
   116  	linkflags=""
   117  fi
   118  $(go env CC) $(go env GOGCCFLAGS) -o testp2 main2.c $linkflags libgo2.$libext
   119  binpush testp2
   120  output=$(run LD_LIBRARY_PATH=. ./testp2)
   121  if [ "$output" != "PASS" ]; then
   122  	echo "FAIL test2 got ${output}"
   123  	exit 1
   124  fi
   125  
   126  # test3: tests main.main is exported on android.
   127  if [ "$goos" == "android" ]; then
   128  	$(go env CC) $(go env GOGCCFLAGS) -o testp3 main3.c -ldl
   129  	binpush testp3
   130  	output=$(run ./testp ./libgo.so)
   131  	if [ "$output" != "PASS" ]; then
   132  		echo "FAIL test3 got ${output}"
   133  		exit 1
   134  	fi
   135  fi
   136  echo "ok"