mirror of
https://github.com/golang/go
synced 2024-11-12 07:40:23 -07:00
misc/cgo/testshared: add basic test for -buildmode=shared/-linkshared
Just a first basic test, I'll extend this to test more but want to get an opinion on basic approach first. Change-Id: Idab9ebd7d9960b000b81a01a1e53258bf4bce755 Reviewed-on: https://go-review.googlesource.com/9386 Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
98e0556231
commit
0774f6dbfd
4
misc/cgo/testshared/src/trivial/trivial.go
Normal file
4
misc/cgo/testshared/src/trivial/trivial.go
Normal file
@ -0,0 +1,4 @@
|
||||
package main
|
||||
|
||||
func main() {
|
||||
}
|
64
misc/cgo/testshared/test.bash
Executable file
64
misc/cgo/testshared/test.bash
Executable file
@ -0,0 +1,64 @@
|
||||
#!/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"
|
9
src/cmd/dist/test.go
vendored
9
src/cmd/dist/test.go
vendored
@ -281,6 +281,9 @@ func (t *tester) registerTests() {
|
||||
if t.buildmode("c-shared") {
|
||||
t.registerTest("testcshared", "../misc/cgo/testcshared", "./test.bash")
|
||||
}
|
||||
if t.buildmode("shared") {
|
||||
t.registerTest("testshared", "../misc/cgo/testshared", "./test.bash")
|
||||
}
|
||||
if t.gohostos == "linux" && t.goarch == "amd64" {
|
||||
t.registerTest("testasan", "../misc/cgo/testasan", "go", "run", "main.go")
|
||||
}
|
||||
@ -399,6 +402,12 @@ func (t *tester) buildmode(mode string) bool {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
case "shared":
|
||||
switch pair {
|
||||
case "linux-amd64":
|
||||
return true
|
||||
}
|
||||
return false
|
||||
default:
|
||||
log.Fatal("internal error: unknown buildmode %s", mode)
|
||||
return false
|
||||
|
Loading…
Reference in New Issue
Block a user