| #!/usr/bin/env bash |
| # Copyright 2015 The Go Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style |
| # license that can be found in the LICENSE file. |
| |
| # Test that -buildmode=shared can produce a shared library and that |
| # -linkshared can link against it to produce a working executable. |
| |
| set -eu |
| |
| export GOPATH="$(pwd)" |
| |
| die () { |
| echo $@ |
| exit 1 |
| } |
| |
| # Because go install -buildmode=shared $standard_library_package always |
| # installs into $GOROOT, here are some gymnastics to come up with a |
| # unique installsuffix to use in this test that we can clean up |
| # afterwards. |
| rootdir="$(dirname $(go list -f '{{.Target}}' runtime))" |
| template="${rootdir}_XXXXXXXX_dynlink" |
| std_install_dir=$(mktemp -d "$template") |
| |
| cleanup () { |
| rm -rf $std_install_dir ./bin/ ./pkg/ |
| } |
| trap cleanup EXIT |
| |
| mysuffix=$(echo $std_install_dir | sed -e 's/.*_\([^_]*\)_dynlink/\1/') |
| |
| # This is the smallest set of packages we can link into a shared |
| # library. Check they are built into a library with the expected name. |
| minpkgs="runtime runtime/cgo sync/atomic" |
| soname=libruntime,runtime-cgo,sync-atomic.so |
| |
| go install -installsuffix="$mysuffix" -buildmode=shared $minpkgs || die "install -buildmode=shared failed" |
| |
| if [ ! -f "$std_install_dir/$soname" ]; then |
| echo "$std_install_dir/$soname not found!" |
| exit 1 |
| fi |
| |
| # The install command should have created a "shlibname" file for each |
| # package indicating the name of the shared library containing it. |
| for pkg in $minpkgs; do |
| if [ ! -f "$std_install_dir/$pkg.shlibname" ]; then |
| die "no shlibname file for $pkg" |
| fi |
| if [ "$(cat "$std_install_dir/$pkg.shlibname")" != "$soname" ]; then |
| die "shlibname file for $pkg has wrong contents" |
| fi |
| done |
| |
| # Build a trivial program that links against the shared library we |
| # just made and check it runs. |
| go install -installsuffix="$mysuffix" -linkshared trivial || die "build -linkshared failed" |
| ./bin/trivial || die "./bin/trivial failed" |
| |
| # And check that it is actually dynamically linked against the library |
| # we hope it is linked against. |
| a="$(ldd ./bin/trivial)" || die "ldd ./bin/trivial failed: $a" |
| { echo "$a" | grep -q "$std_install_dir/$soname"; } || die "trivial does not appear to be linked against $soname" |