From fdab2f92eab01e8aca980c76cba18c2361cb0fc7 Mon Sep 17 00:00:00 2001 From: David Crawshaw Date: Mon, 13 Apr 2015 11:31:14 -0400 Subject: [PATCH] misc/cgo/testcarchive: test -buildmode=c-archive Change-Id: I1668a6885c45180ff88fe673d04cec7eba395ee7 Reviewed-on: https://go-review.googlesource.com/8861 Reviewed-by: Ian Lance Taylor --- misc/cgo/testcarchive/main.c | 34 ++++++++++++++++++++++++ misc/cgo/testcarchive/src/libgo/libgo.go | 24 +++++++++++++++++ misc/cgo/testcarchive/src/p/p.go | 10 +++++++ misc/cgo/testcarchive/test.bash | 31 +++++++++++++++++++++ src/cmd/dist/test.go | 4 +++ 5 files changed, 103 insertions(+) create mode 100644 misc/cgo/testcarchive/main.c create mode 100644 misc/cgo/testcarchive/src/libgo/libgo.go create mode 100644 misc/cgo/testcarchive/src/p/p.go create mode 100755 misc/cgo/testcarchive/test.bash diff --git a/misc/cgo/testcarchive/main.c b/misc/cgo/testcarchive/main.c new file mode 100644 index 0000000000..404e8f8e36 --- /dev/null +++ b/misc/cgo/testcarchive/main.c @@ -0,0 +1,34 @@ +// 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. + +#include +#include +#include + +typedef struct { char *p; intmax_t n; } GoString; +extern signed char DidInitRun(); +extern signed char DidMainRun(); +extern GoString FromPkg(); + +int main(void) { + GoString res; + + if (DidMainRun()) { + fprintf(stderr, "ERROR: buildmode=c-archive should not run main\n"); + return 2; + } + + if (!DidInitRun()) { + fprintf(stderr, "ERROR: buildmode=c-archive init should run\n"); + return 2; + } + + res = FromPkg(); + if (strcmp(res.p, "str")) { + fprintf(stderr, "ERROR: FromPkg()='%s', want 'str'\n", res.p); + return 2; + } + + return 0; +} diff --git a/misc/cgo/testcarchive/src/libgo/libgo.go b/misc/cgo/testcarchive/src/libgo/libgo.go new file mode 100644 index 0000000000..25ddda3f76 --- /dev/null +++ b/misc/cgo/testcarchive/src/libgo/libgo.go @@ -0,0 +1,24 @@ +// 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. + +package main + +import _ "p" + +import "C" + +var ( + ranInit bool + ranMain bool +) + +func init() { ranInit = true } + +func main() { ranMain = true } + +//export DidInitRun +func DidInitRun() bool { return ranInit } + +//export DidMainRun +func DidMainRun() bool { return ranMain } diff --git a/misc/cgo/testcarchive/src/p/p.go b/misc/cgo/testcarchive/src/p/p.go new file mode 100644 index 0000000000..50275227a5 --- /dev/null +++ b/misc/cgo/testcarchive/src/p/p.go @@ -0,0 +1,10 @@ +// 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. + +package p + +import "C" + +//export FromPkg +func FromPkg() string { return "str" } diff --git a/misc/cgo/testcarchive/test.bash b/misc/cgo/testcarchive/test.bash new file mode 100755 index 0000000000..7c10c00b7c --- /dev/null +++ b/misc/cgo/testcarchive/test.bash @@ -0,0 +1,31 @@ +#!/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. + +set -e + +ccargs="" +if [ "$(go env GOOS)" == "darwin" ]; then + ccargs="-Wl,-no_pie" + # For darwin/arm. + # TODO(crawshaw): Can we do better? + ccargs="$ccargs -framework CoreFoundation" +fi + +# TODO(crawshaw): Consider a go env for exec script name. +bin=./testp +exec_script=go_$(go env GOOS)_$(go env GOARCH)_exec +if [ "$(which $exec_script)" != "" ]; then + bin="$exec_script ./testp" +fi + +GOPATH=$(pwd) go build -buildmode=c-archive src/libgo/libgo.go +$(go env CC) $(go env GOGCCFLAGS) $ccargs -o testp main.c libgo.a +$bin +rm libgo.a testp + +GOPATH=$(pwd) go build -buildmode=c-archive -o libgo.a libgo +$(go env CC) $(go env GOGCCFLAGS) $ccargs -o testp main.c libgo.a +$bin +rm libgo.a testp diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go index 513c8ca3d7..70187b3c20 100644 --- a/src/cmd/dist/test.go +++ b/src/cmd/dist/test.go @@ -272,6 +272,10 @@ func (t *tester) registerTests() { } else if t.hasBash() && t.goos != "android" && !iOS { t.registerTest("testso", "../misc/cgo/testso", "./test.bash") } + if t.goos == "darwin" && t.goarch == "amd64" { + // TODO(crawshaw): add darwin/arm{,64} + t.registerTest("testcarchive", "../misc/cgo/testcarchive", "./test.bash") + } if t.gohostos == "linux" && t.goarch == "amd64" { t.registerTest("testasan", "../misc/cgo/testasan", "go", "run", "main.go") } -- 2.48.1