github.com/huandu/go@v0.0.0-20151114150818-04e615e41150/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  # test0: exported symbols in shared lib are accessible.
    85  # TODO(iant): using _shared here shouldn't really be necessary.
    86  $(go env CC) $(go env GOGCCFLAGS) -I ${installdir} -o testp main0.c libgo.$libext
    87  binpush testp
    88  
    89  output=$(run LD_LIBRARY_PATH=. ./testp)
    90  if [ "$output" != "PASS" ]; then
    91  	echo "FAIL test0 got ${output}"
    92  	exit 1
    93  fi
    94  
    95  # test1: shared library can be dynamically loaded and exported symbols are accessible.
    96  $(go env CC) $(go env GOGCCFLAGS) -o testp main1.c -ldl
    97  binpush testp
    98  output=$(run ./testp ./libgo.$libext)
    99  if [ "$output" != "PASS" ]; then
   100  	echo "FAIL test1 got ${output}"
   101  	exit 1
   102  fi
   103  
   104  # test2: tests libgo2 which does not export any functions.
   105  GOPATH=$(pwd) go build -buildmode=c-shared $suffix -o libgo2.$libext src/libgo2/libgo2.go
   106  binpush libgo2.$libext
   107  linkflags="-Wl,--no-as-needed"
   108  if [ "$goos" == "darwin" ]; then
   109  	linkflags=""
   110  fi
   111  $(go env CC) $(go env GOGCCFLAGS) -o testp2 main2.c $linkflags libgo2.$libext
   112  binpush testp2
   113  output=$(run LD_LIBRARY_PATH=. ./testp2)
   114  if [ "$output" != "PASS" ]; then
   115  	echo "FAIL test2 got ${output}"
   116  	exit 1
   117  fi
   118  
   119  # test3: tests main.main is exported on android.
   120  if [ "$goos" == "android" ]; then
   121  	$(go env CC) $(go env GOGCCFLAGS) -o testp3 main3.c -ldl
   122  	binpush testp3
   123  	output=$(run ./testp ./libgo.so)
   124  	if [ "$output" != "PASS" ]; then
   125  		echo "FAIL test3 got ${output}"
   126  		exit 1
   127  	fi
   128  fi
   129  echo "ok"