--- /dev/null
+// 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 <stdint.h>
+#include <stdio.h>
+#include <string.h>
+
+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;
+}
--- /dev/null
+// 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 }
--- /dev/null
+// 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" }
--- /dev/null
+#!/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
} 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")
}