Fixed SWIG go for cases when SWIG %import-s another package which is located in a subdirectory.
This commit is contained in:
parent
ece9854e8f
commit
8da4d20308
9 changed files with 135 additions and 7 deletions
|
|
@ -9,6 +9,9 @@ Version 3.0.6 (in progress)
|
||||||
[Guile] Fix generated code for static const char member variables when
|
[Guile] Fix generated code for static const char member variables when
|
||||||
defined and declared inline.
|
defined and declared inline.
|
||||||
|
|
||||||
|
2015-02-09: mishas
|
||||||
|
[Go] Fix %import of files in sub directories.
|
||||||
|
|
||||||
2015-02-05: ianlancetaylor
|
2015-02-05: ianlancetaylor
|
||||||
[Go] Ignore Go specific type maps (goin, goout, etc.) if they are empty.
|
[Go] Ignore Go specific type maps (goin, goout, etc.) if they are empty.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1818,14 +1818,21 @@ go: $(SRCDIR_SRCS)
|
||||||
go_cpp: $(SRCDIR_SRCS)
|
go_cpp: $(SRCDIR_SRCS)
|
||||||
$(SWIG) -go -c++ $(GOOPT) $(GOSWIGARG) $(SWIGOPT) -o $(ICXXSRCS) $(INTERFACEPATH)
|
$(SWIG) -go -c++ $(GOOPT) $(GOSWIGARG) $(SWIGOPT) -o $(ICXXSRCS) $(INTERFACEPATH)
|
||||||
if $(GO12) || $(GO13) || $(GOGCC); then \
|
if $(GO12) || $(GO13) || $(GOGCC); then \
|
||||||
$(CXX) -g -c $(CPPFLAGS) $(CXXFLAGS) $(SRCDIR_SRCS) $(SRCDIR_CXXSRCS) $(ICXXSRCS) $(INCLUDES); \
|
${foreach f,$(SRCDIR_CXXSRCS) $(SRCDIR_SRCS) $(ICXXSRCS), \
|
||||||
|
$(CXX) -g -c $(CPPFLAGS) $(CXXFLAGS) -o ${addsuffix .o,${basename $f}} $f $(INCLUDES); \
|
||||||
|
} \
|
||||||
else \
|
else \
|
||||||
$(CXX) -g -c $(CCSHARED) $(CPPFLAGS) $(CXXFLAGS) $(SRCDIR_SRCS) $(SRCDIR_CXXSRCS) $(ICXXSRCS) $(INCLUDES); \
|
$(CXX) -g -c $(CCSHARED) $(CPPFLAGS) $(CXXFLAGS) $(SRCDIR_SRCS) $(SRCDIR_CXXSRCS) $(ICXXSRCS) $(INCLUDES); \
|
||||||
$(CXXSHARED) $(CXXFLAGS) $(LDFLAGS) $(OBJS) $(IOBJS) $(LIBS) $(CPP_DLLIBS) -o $(LIBPREFIX)$(TARGET)$(SO); \
|
$(CXXSHARED) $(CXXFLAGS) $(LDFLAGS) $(OBJS) $(IOBJS) $(LIBS) $(CPP_DLLIBS) -o $(LIBPREFIX)$(TARGET)$(SO); \
|
||||||
fi
|
fi
|
||||||
$(COMPILETOOL) $(GO) $(GOCOMPILEARG) -I . $(GOSRCS)
|
${foreach f,$(GOSRCS), \
|
||||||
|
$(COMPILETOOL) $(GO) $(GOCOMPILEARG) -I . -o ${addsuffix .$(GOOBJEXT),${basename $f}} $f \
|
||||||
|
}
|
||||||
if ! $(GOGCC) ; then \
|
if ! $(GOGCC) ; then \
|
||||||
$(COMPILETOOL) $(GOTOOL) $(GOC) -I $${GOROOT:-`go env GOROOT`}/pkg/$${GOOS:-`go env GOOS`}_$${GOARCH:-`go env GOARCH`} $(GOCSRCS); \
|
${foreach f,$(GOCSRCS), \
|
||||||
|
$(COMPILETOOL) $(GOTOOL) $(GOC) -I $${GOROOT:-`go env GOROOT`}/pkg/$${GOOS:-`go env GOOS`}_$${GOARCH:-`go env GOARCH`} \
|
||||||
|
-o ${addsuffix .$(GOOBJEXT),${basename $f}} $f; \
|
||||||
|
} \
|
||||||
rm -f $(GOPACKAGE); \
|
rm -f $(GOPACKAGE); \
|
||||||
if $(GO13); then \
|
if $(GO13); then \
|
||||||
cp $(GOGCOBJS) $(GOPACKAGE); \
|
cp $(GOGCOBJS) $(GOPACKAGE); \
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,9 @@ CPP_TEST_CASES = \
|
||||||
go_inout \
|
go_inout \
|
||||||
go_director_inout
|
go_director_inout
|
||||||
|
|
||||||
|
MULTI_CPP_TEST_CASES = \
|
||||||
|
go_subdir_import
|
||||||
|
|
||||||
include $(srcdir)/../common.mk
|
include $(srcdir)/../common.mk
|
||||||
|
|
||||||
.SUFFIXES: .cpptest .ctest .multicpptest
|
.SUFFIXES: .cpptest .ctest .multicpptest
|
||||||
|
|
@ -59,6 +62,25 @@ multi_import.multicpptest:
|
||||||
done
|
done
|
||||||
$(run_multi_testcase)
|
$(run_multi_testcase)
|
||||||
|
|
||||||
|
go_subdir_import.multicpptest:
|
||||||
|
$(setup)
|
||||||
|
mkdir -p testdir/go_subdir_import/
|
||||||
|
$(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile SRCDIR="$(SRCDIR)" CXXSRCS="$(CXXSRCS)" \
|
||||||
|
SWIG_LIB="$(SWIG_LIB)" SWIG="$(SWIG)" LIBS='$(LIBS)' \
|
||||||
|
INTERFACEPATH="go_subdir_import_b.i" \
|
||||||
|
INCLUDES="$(INCLUDES)" SWIGOPT="$(SWIGOPT) -outdir ." NOLINK=true \
|
||||||
|
TARGET="$(TARGETPREFIX)go_subdir_import_b$(TARGETSUFFIX)" INTERFACEDIR="$(INTERFACEDIR)" \
|
||||||
|
INTERFACE="testdir/go_subdir_import/go_subdir_import_b.i" \
|
||||||
|
$(LANGUAGE)$(VARIANT)_cpp;
|
||||||
|
for f in testdir/go_subdir_import/go_subdir_import_c go_subdir_import_a ; do \
|
||||||
|
$(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile SRCDIR="$(SRCDIR)" CXXSRCS="$(CXXSRCS)" \
|
||||||
|
SWIG_LIB="$(SWIG_LIB)" SWIG="$(SWIG)" LIBS='$(LIBS)' \
|
||||||
|
INCLUDES="$(INCLUDES)" SWIGOPT="$(SWIGOPT)" NOLINK=true \
|
||||||
|
TARGET="$(TARGETPREFIX)$${f}$(TARGETSUFFIX)" INTERFACEDIR="$(INTERFACEDIR)" INTERFACE="$$f.i" \
|
||||||
|
$(LANGUAGE)$(VARIANT)_cpp; \
|
||||||
|
done
|
||||||
|
$(run_multi_testcase)
|
||||||
|
|
||||||
# Runs the testcase.
|
# Runs the testcase.
|
||||||
run_testcase = \
|
run_testcase = \
|
||||||
if test -f $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX); then \
|
if test -f $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX); then \
|
||||||
|
|
@ -108,6 +130,7 @@ clean:
|
||||||
rm -f mod_a.go mod_b.go imports_a.go imports_b.go
|
rm -f mod_a.go mod_b.go imports_a.go imports_b.go
|
||||||
rm -f clientdata_prop_a.go clientdata_prop_b.go
|
rm -f clientdata_prop_a.go clientdata_prop_b.go
|
||||||
rm -f multi_import_a.go multi_import_b.go
|
rm -f multi_import_a.go multi_import_b.go
|
||||||
|
rm -rf go_subdir_import_a.go testdir
|
||||||
rm -f packageoption_a.go packageoption_b.go packageoption_c.go
|
rm -f packageoption_a.go packageoption_b.go packageoption_c.go
|
||||||
rm -f import_stl_a.go import_stl_b.go
|
rm -f import_stl_a.go import_stl_b.go
|
||||||
|
|
||||||
|
|
|
||||||
16
Examples/test-suite/go/go_subdir_import_runme.go
Normal file
16
Examples/test-suite/go/go_subdir_import_runme.go
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go_subdir_import_a"
|
||||||
|
"testdir/go_subdir_import/go_subdir_import_b"
|
||||||
|
"testdir/go_subdir_import/go_subdir_import_c"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
b := go_subdir_import_b.NewObjB();
|
||||||
|
c := go_subdir_import_c.NewObjC();
|
||||||
|
v := go_subdir_import_a.AddFive(b, c)
|
||||||
|
if v != 50 {
|
||||||
|
panic(0)
|
||||||
|
}
|
||||||
|
}
|
||||||
3
Examples/test-suite/go_subdir_import.list
Normal file
3
Examples/test-suite/go_subdir_import.list
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
testdir/go_subdir_import/go_subdir_import_c
|
||||||
|
go_subdir_import_b
|
||||||
|
go_subdir_import_a
|
||||||
37
Examples/test-suite/go_subdir_import_a.i
Normal file
37
Examples/test-suite/go_subdir_import_a.i
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
/* File : go_subdir_import_a.i */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This files helps check the case where the SWIG-generated .go file needs to
|
||||||
|
* import another, SWIG-generated, module that is in a relative subdirectory.
|
||||||
|
* This case might happen for two different reasons:
|
||||||
|
* 1) Importing a module for which the .i file is in a subdirectory relatively
|
||||||
|
* to this file (this is tested here with go_subdir_import_c).
|
||||||
|
* 2) Importing a module whos module name is a path (this is tested here with
|
||||||
|
* go_subdir_import_b).
|
||||||
|
*
|
||||||
|
* This file is the "root" file that imports the two modules which will be
|
||||||
|
* generated (by swig) in a relative subdirectory.
|
||||||
|
*/
|
||||||
|
%module go_subdir_import_a
|
||||||
|
|
||||||
|
%import(module="testdir/go_subdir_import/go_subdir_import_c") "testdir/go_subdir_import/go_subdir_import_c.i"
|
||||||
|
%import "go_subdir_import_b.i"
|
||||||
|
|
||||||
|
%{
|
||||||
|
class ObjC {
|
||||||
|
public:
|
||||||
|
int getInt() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ObjB {
|
||||||
|
public:
|
||||||
|
int getInt() const;
|
||||||
|
};
|
||||||
|
%}
|
||||||
|
|
||||||
|
%inline %{
|
||||||
|
int AddFive(const ObjB& b, const ObjC& c) {
|
||||||
|
return b.getInt() + c.getInt() + 5;
|
||||||
|
}
|
||||||
|
%}
|
||||||
|
|
||||||
12
Examples/test-suite/go_subdir_import_b.i
Normal file
12
Examples/test-suite/go_subdir_import_b.i
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
/* File : go_subdir_import_b.i */
|
||||||
|
%module "testdir/go_subdir_import/go_subdir_import_b"
|
||||||
|
|
||||||
|
%inline %{
|
||||||
|
class ObjB {
|
||||||
|
public:
|
||||||
|
int getInt() const {
|
||||||
|
return 27;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
%}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
/* File : go_subdir_import_c.i */
|
||||||
|
%module go_subdir_import_c
|
||||||
|
|
||||||
|
%inline %{
|
||||||
|
class ObjC {
|
||||||
|
public:
|
||||||
|
int getInt() const {
|
||||||
|
return 18;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
%}
|
||||||
|
|
||||||
|
|
@ -554,7 +554,7 @@ private:
|
||||||
|
|
||||||
// Output module initialization code.
|
// Output module initialization code.
|
||||||
|
|
||||||
Printf(f_go_begin, "\npackage %s\n\n", package);
|
Printf(f_go_begin, "\npackage %s\n\n", getModuleName(package));
|
||||||
|
|
||||||
if (gccgo_flag) {
|
if (gccgo_flag) {
|
||||||
Printf(f_go_runtime, "func SwigCgocall()\n");
|
Printf(f_go_runtime, "func SwigCgocall()\n");
|
||||||
|
|
@ -2058,7 +2058,7 @@ private:
|
||||||
Printv(f_go_wrappers, "type ", name, " int\n", NULL);
|
Printv(f_go_wrappers, "type ", name, " int\n", NULL);
|
||||||
} else {
|
} else {
|
||||||
String *nw = NewString("");
|
String *nw = NewString("");
|
||||||
Printv(nw, imported_package, ".", name, NULL);
|
Printv(nw, getModuleName(imported_package), ".", name, NULL);
|
||||||
Setattr(n, "go:enumname", nw);
|
Setattr(n, "go:enumname", nw);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -5096,7 +5096,7 @@ private:
|
||||||
Setattr(undefined_types, t, t);
|
Setattr(undefined_types, t, t);
|
||||||
} else {
|
} else {
|
||||||
String *nw = NewString("");
|
String *nw = NewString("");
|
||||||
Printv(nw, Getattr(cnmod, "name"), ".", ret, NULL);
|
Printv(nw, getModuleName(Getattr(cnmod, "name")), ".", ret, NULL);
|
||||||
Delete(ret);
|
Delete(ret);
|
||||||
ret = nw;
|
ret = nw;
|
||||||
}
|
}
|
||||||
|
|
@ -5282,7 +5282,7 @@ private:
|
||||||
Append(ret, ex);
|
Append(ret, ex);
|
||||||
} else {
|
} else {
|
||||||
ret = NewString("");
|
ret = NewString("");
|
||||||
Printv(ret, Getattr(cnmod, "name"), ".Swigcptr", ex, NULL);
|
Printv(ret, getModuleName(Getattr(cnmod, "name")), ".Swigcptr", ex, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Delete(ty);
|
Delete(ty);
|
||||||
|
|
@ -5603,6 +5603,21 @@ private:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
* getModuleName
|
||||||
|
*
|
||||||
|
* Return the name of a module. This is different from module path:
|
||||||
|
* "some/path/to/module" -> "module".
|
||||||
|
* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
String *getModuleName(String *module_path) {
|
||||||
|
char *suffix = strrchr(Char(module_path), '/');
|
||||||
|
if (suffix == NULL) {
|
||||||
|
return module_path;
|
||||||
|
}
|
||||||
|
return Str(suffix + 1);
|
||||||
|
}
|
||||||
|
|
||||||
}; /* class GO */
|
}; /* class GO */
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
/* -----------------------------------------------------------------------------
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue