summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam S Fulton <wsf@fultondesigns.co.uk>2016-01-28 20:03:54 +0000
committerWilliam S Fulton <wsf@fultondesigns.co.uk>2016-01-28 20:03:54 +0000
commit2817e02e35d45501f3f7f87028f6b35c3e6f0491 (patch)
tree8466ad1476fecf48e892b8bc5f0a11c9d5f21cb3
parent15b75a74c5c11e4bbdf75f7b525e16c7cfc792f5 (diff)
parent3a9f26045e136d0289d7e2ca28ee5c3fc7e543c3 (diff)
downloadswig-2817e02e35d45501f3f7f87028f6b35c3e6f0491.tar.gz
Merge branch 'ahnolds-clean_osx_go'
* ahnolds-clean_osx_go: Go test-suite should now work on OSX Don't write empty swigargs structs Fail if nocgo version fails Handle weak linking on OSX Conflicts: CHANGES.current
-rw-r--r--.travis.yml3
-rw-r--r--CHANGES.current9
-rw-r--r--Examples/test-suite/go/Makefile.in14
-rw-r--r--Source/Modules/go.cxx9
4 files changed, 26 insertions, 9 deletions
diff --git a/.travis.yml b/.travis.yml
index 97cfc2df1..2d174676f 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -162,9 +162,6 @@ matrix:
- compiler: gcc
os: linux
env: SWIGLANG=python SWIG_FEATURES=-O
- - compiler: clang
- os: osx
- env: SWIGLANG=go
before_install:
- date -u
- uname -a
diff --git a/CHANGES.current b/CHANGES.current
index 90297e917..2a0017822 100644
--- a/CHANGES.current
+++ b/CHANGES.current
@@ -8,6 +8,15 @@ Version 3.0.9 (in progress)
2016-01-27: steeve
[Go] Ensure structs are properly packed between gc and GCC/clang.
+2016-01-23: ahnolds
+ [Go] Enable support for the Go test-suite on OSX:
+ * The linker on OSX requires that all symbols (even weak symbols)
+ are defined at link time. Because the function _cgo_topofstack is
+ only defined starting in Go version 1.4, we explicitly mark it as
+ undefined for older versions of Go on OSX.
+ * Avoid writing empty swigargs structs, since empty structs are not
+ allowed in extern "C" blocks.
+
2016-01-12: olly
[Javascript] Look for "nodejs" as well as "node", as it's packaged
as the former on Debian.
diff --git a/Examples/test-suite/go/Makefile.in b/Examples/test-suite/go/Makefile.in
index 7fb97eb02..01989b0d3 100644
--- a/Examples/test-suite/go/Makefile.in
+++ b/Examples/test-suite/go/Makefile.in
@@ -11,6 +11,8 @@ GO12 = @GO12@
GO13 = @GO13@
GO15 = @GO15@
GOC = @GOC@
+GOVERSIONOPTION = @GOVERSIONOPTION@
+host = @host@
SCRIPTSUFFIX = _runme.go
GOCOMPILEARG = `if $(GO15); then echo tool compile; elif $(GO1); then echo tool $(GOC:c=g); fi`
@@ -20,6 +22,8 @@ GOPACK = `if $(GO1) ; then echo go tool pack; else echo gopack; fi`
GOOBJEXT = `if $(GO15); then echo o; else echo $(GOC:c=); fi`
+OSXOLDGOLINKFLAGS = `if [ -n "\`$(GO) $(GOVERSIONOPTION) | grep -E 'go1($|.0|.1|.2|.3)'\`" ] && [ -n "\`echo $(host) | grep darwin\`" ]; then echo "-Wl,-U,__cgo_topofstack"; fi`
+
SO = @SO@
srcdir = @srcdir@
@@ -50,7 +54,7 @@ INCLUDES = -I$(abs_top_srcdir)/$(EXAMPLES)/$(TEST_SUITE)
SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \
INCLUDES='$(INCLUDES)' SWIGOPT='$(SWIGOPT)' NOLINK=true \
TARGET='$(TARGETPREFIX)$*$(TARGETSUFFIX)' INTERFACEDIR='$(INTERFACEDIR)' INTERFACE='$*.i' \
- $(LANGUAGE)$(VARIANT)_cpp_nocgo; \
+ $(LANGUAGE)$(VARIANT)_cpp_nocgo && \
$(run_testcase_cpp); \
fi
@@ -63,7 +67,7 @@ INCLUDES = -I$(abs_top_srcdir)/$(EXAMPLES)/$(TEST_SUITE)
SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \
INCLUDES='$(INCLUDES)' SWIGOPT='$(SWIGOPT)' NOLINK=true \
TARGET='$(TARGETPREFIX)$*$(TARGETSUFFIX)' INTERFACEDIR='$(INTERFACEDIR)' INTERFACE='$*.i' \
- $(LANGUAGE)$(VARIANT)_nocgo; \
+ $(LANGUAGE)$(VARIANT)_nocgo && \
$(run_testcase); \
fi
@@ -121,7 +125,7 @@ run_testcase = \
$(COMPILETOOL) $(GCCGO) -o $*_runme $(SCRIPTPREFIX)$*_runme.@OBJEXT@ $*.a; \
elif $(GO12) || $(GO13) || $(GO15); then \
$(COMPILETOOL) $(GO) $(GOCOMPILEARG) -I . $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) && \
- $(COMPILETOOL) $(GOTOOL) $(GOLD) -linkmode external -extld $(CC) -extldflags "$(CFLAGS)" -o $*_runme $(SCRIPTPREFIX)$*_runme.$(GOOBJEXT); \
+ $(COMPILETOOL) $(GOTOOL) $(GOLD) -linkmode external -extld $(CC) -extldflags "$(CFLAGS) $(OSXOLDGOLINKFLAGS)" -o $*_runme $(SCRIPTPREFIX)$*_runme.$(GOOBJEXT); \
else \
$(COMPILETOOL) $(GO) $(GOCOMPILEARG) -I . $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) && \
$(COMPILETOOL) $(GOTOOL) $(GOLD) -L . -r $${GOROOT:-`go env GOROOT`}/pkg/$${GOOS:-`go env GOOS`}_$${GOARCH:-`go env GOARCH`}:. -o $*_runme $(SCRIPTPREFIX)$*_runme.$(GOOBJEXT); \
@@ -136,7 +140,7 @@ run_testcase_cpp = \
$(COMPILETOOL) $(GCCGO) -o $*_runme $(SCRIPTPREFIX)$*_runme.@OBJEXT@ $*.a -lstdc++; \
elif $(GO12) || $(GO13) || $(GO15); then \
$(COMPILETOOL) $(GO) $(GOCOMPILEARG) -I . $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) && \
- $(COMPILETOOL) $(GOTOOL) $(GOLD) -linkmode external -extld $(CXX) -extldflags "$(CXXFLAGS)" -o $*_runme $(SCRIPTPREFIX)$*_runme.$(GOOBJEXT); \
+ $(COMPILETOOL) $(GOTOOL) $(GOLD) -linkmode external -extld $(CXX) -extldflags "$(CXXFLAGS) $(OSXOLDGOLINKFLAGS)" -o $*_runme $(SCRIPTPREFIX)$*_runme.$(GOOBJEXT); \
else \
$(COMPILETOOL) $(GO) $(GOCOMPILEARG) -I . $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) && \
$(COMPILETOOL) $(GOTOOL) $(GOLD) -L . -r $${GOROOT:-`go env GOROOT`}/pkg/$${GOOS:-`go env GOOS`}_$${GOARCH:-`go env GOARCH`}:. -o $*_runme $(SCRIPTPREFIX)$*_runme.$(GOOBJEXT); \
@@ -152,7 +156,7 @@ run_multi_testcase = \
$(COMPILETOOL) $(GCCGO) -o $*_runme $(SCRIPTPREFIX)$*_runme.@OBJEXT@ `for f in $$files; do echo $$f.a; done` -lstdc++; \
elif $(GO12) || $(GO13) || $(GO15); then \
$(COMPILETOOL) $(GO) $(GOCOMPILEARG) -I . $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) && \
- $(COMPILETOOL) $(GOTOOL) $(GOLD) -L . -linkmode external -extld $(CXX) -extldflags "$(CXXFLAGS)" -o $*_runme $(SCRIPTPREFIX)$*_runme.$(GOOBJEXT); \
+ $(COMPILETOOL) $(GOTOOL) $(GOLD) -L . -linkmode external -extld $(CXX) -extldflags "$(CXXFLAGS) $(OSXOLDGOLINKFLAGS)" -o $*_runme $(SCRIPTPREFIX)$*_runme.$(GOOBJEXT); \
else \
$(COMPILETOOL) $(GO) $(GOCOMPILEARG) -I . $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) && \
$(COMPILETOOL) $(GOTOOL) $(GOLD) -L . -r $${GOROOT:-`go env GOROOT`}/pkg/$${GOOS:-`go env GOOS`}_$${GOARCH:-`go env GOARCH`}:. -o $*_runme $(SCRIPTPREFIX)$*_runme.$(GOOBJEXT); \
diff --git a/Source/Modules/go.cxx b/Source/Modules/go.cxx
index a4445a95d..002247fe5 100644
--- a/Source/Modules/go.cxx
+++ b/Source/Modules/go.cxx
@@ -2112,6 +2112,7 @@ private:
emit_attach_parmmaps(parms, f);
int parm_count = emit_num_arguments(parms);
int required_count = emit_num_required(parms);
+ bool needs_swigargs = false;
emit_return_variable(n, result, f);
@@ -2125,6 +2126,7 @@ private:
String *swigargs = NewString("\tstruct swigargs {\n");
if (parm_count > required_count) {
+ needs_swigargs = true;
Printv(swigargs, "\t\tintgo _swig_optargc;\n", NULL);
}
@@ -2136,6 +2138,7 @@ private:
SwigType *pt = Getattr(p, "type");
String *ct = gcCTypeForGoValue(p, pt, ln);
Printv(swigargs, "\t\t\t", ct, ";\n", NULL);
+ needs_swigargs = true;
Delete(ct);
String *gn = NewStringf("_swig_go_%d", i);
@@ -2152,6 +2155,7 @@ private:
String *ct = gcCTypeForGoValue(n, result, ln);
Delete(ln);
Printv(swigargs, "\t\t", ct, ";\n", NULL);
+ needs_swigargs = true;
Delete(ct);
ln = NewString("_swig_go_result");
@@ -2208,7 +2212,10 @@ private:
cleanupFunction(n, f, parms);
- Printv(f->locals, swigargs, NULL);
+ if (needs_swigargs)
+ {
+ Printv(f->locals, swigargs, NULL);
+ }
Printv(f->code, "}\n", NULL);