--- /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 cgosotest
+
+// This test verifies that Go can access C variables
+// in shared object file via cgo.
+
+/*
+// intentionally write the same LDFLAGS differently
+// to test correct handling of LDFLAGS.
+#cgo windows CFLAGS: -DIMPORT_DLL
+#cgo linux LDFLAGS: -L. -lcgosotest
+#cgo dragonfly LDFLAGS: -L. -l cgosotest
+#cgo freebsd LDFLAGS: -L. -l cgosotest
+#cgo openbsd LDFLAGS: -L. -l cgosotest
+#cgo solaris LDFLAGS: -L. -lcgosotest
+#cgo netbsd LDFLAGS: -L. libcgosotest.so
+#cgo darwin LDFLAGS: -L. libcgosotest.dylib
+#cgo windows LDFLAGS: -L. libcgosotest.dll
+
+#include "cgoso_c.h"
+
+const char* getVar() {
+ return exported_var;
+}
+*/
+import "C"
+
+import "fmt"
+
+func Test() {
+ const want = "Hello world"
+ got := C.GoString(C.getVar())
+ if got != want {
+ panic(fmt.Sprintf("testExportedVar: got %q, but want %q", got, want))
+ }
+ got = C.GoString(C.exported_var)
+ if got != want {
+ panic(fmt.Sprintf("testExportedVar: got %q, but want %q", got, want))
+ }
+}
--- /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.
+
+// +build ignore
+
+const char *exported_var = "Hello world";
--- /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.
+
+// +build ignore
+
+#ifdef WIN32
+#if defined(EXPORT_DLL)
+# define VAR __declspec(dllexport)
+#elif defined(IMPORT_DLL)
+# define VAR __declspec(dllimport)
+#endif
+#else
+# define VAR
+#endif
+
+VAR const char *exported_var;
--- /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.
+
+// +build ignore
+
+package main
+
+import "."
+
+func main() {
+ cgosotest.Test()
+}
t.tests = append(t.tests, distTest{
name: "testso",
heading: "../misc/cgo/testso",
- fn: t.cgoTestSO,
+ fn: func() error {
+ return t.cgoTestSO("misc/cgo/testso")
+ },
})
+ if t.goos == "darwin" {
+ fmt.Println("Skipping misc/cgo/testsovar test. See issue 10360 for details.")
+ } else {
+ t.tests = append(t.tests, distTest{
+ name: "testsovar",
+ heading: "../misc/cgo/testsovar",
+ fn: func() error {
+ return t.cgoTestSO("misc/cgo/testsovar")
+ },
+ })
+ }
}
if t.supportedBuildmode("c-archive") {
t.registerTest("testcarchive", "../misc/cgo/testcarchive", "./test.bash")
return true
}
-func (t *tester) cgoTestSO() error {
- dir := filepath.Join(t.goroot, "misc/cgo/testso")
+func (t *tester) cgoTestSO(testpath string) error {
+ dir := filepath.Join(t.goroot, testpath)
// build shared object
output, err := exec.Command("go", "env", "CC").Output()
args = append(args, "-undefined", "suppress", "-flat_namespace")
case "windows":
ext = "dll"
+ args = append(args, "-DEXPORT_DLL")
}
sofname := "libcgosotest." + ext
args = append(args, "-o", sofname, "cgoso_c.c")