Merge pull request #207 from johan-hake/johanhake/fix-206-swig-relative-import

Fix issue with relative import when using single header file import [Python]
This commit is contained in:
William S Fulton 2014-09-30 20:22:55 +01:00
commit a06dff17ad
25 changed files with 193 additions and 1 deletions

View file

@ -11,7 +11,8 @@ import_packages_subdirs = \
from_init2 \
from_init3 \
relativeimport1 \
relativeimport1
relativeimport2 \
relativeimport3
check: build
if test "x$(SRCDIR)" != x; then \

View file

@ -0,0 +1,25 @@
TOP = ../../..
SWIG = $(realpath $(TOP)/../preinst-swig)
SWIGOPT =
LIBS =
PY3 =
ifeq (,$(PY3))
PKG1DIR = "py2"
else
PKG1DIR = "py3"
endif
check: build
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' python_run
build:
cd $(PKG1DIR) && $(MAKE) SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT) -relativeimport' LIBS='$(LIBS)' build
static:
cd $(PKG1DIR) && $(MAKE) SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT) -relativeimport' LIBS='$(LIBS)' static
clean:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' python_clean
cd py2 && $(MAKE) clean
cd py3 && $(MAKE) clean

View file

@ -0,0 +1,22 @@
This example tests the %import directive and -relativeimport swig option.
Use 'python runme.py' to run a test.
Overview:
---------
The example defines 2 different extension modules--each wrapping a separate C++
class.
pyX/pkg2/pkg3/foo.i - Pkg3_Foo class
pyX/pkg2/bar.i - Pkg2_Bar class derived from Pkg3_Foo
The code is processed by swig with -relativeimport flag. The runtime test
imports pyX.pkg2.bar module.
If everything works well, the module pyX.pkg2.bar shall load properly.
Unix:
-----
- Run make
- Run the test as described above

View file

@ -0,0 +1,14 @@
TOP = ../../../..
SWIG = $(realpath $(TOP)/../preinst-swig)
SWIGOPT =
LIBS =
build:
cd pkg2 && $(MAKE) SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' LIBS='$(LIBS)' build
static:
cd pkg2 && $(MAKE) SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' LIBS='$(LIBS)' static
clean:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' python_clean
cd pkg2 && $(MAKE) clean

View file

@ -0,0 +1,18 @@
TOP = ../../../../..
SWIG = $(realpath $(TOP)/../preinst-swig)
SWIGOPT =
LIBS =
build:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' \
LIBS='$(LIBS)' TARGET='bar' INTERFACE='bar.i' python_cpp
cd pkg3 && $(MAKE) SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' LIBS='$(LIBS)' build
static:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' \
LIBS='$(LIBS)' TARGET='bar' INTERFACE='bar.i' python_cpp
cd pkg3 && $(MAKE) SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' LIBS='$(LIBS)' static
clean:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' TARGET='bar' python_clean
cd pkg3 && $(MAKE) clean

View file

@ -0,0 +1,5 @@
#ifndef PY2_PKG2_BAR_HPP
#define PY2_PKG2_BAR_HPP
#include "../../py2/pkg2/pkg3/foo.hpp"
struct Pkg2_Bar : Pkg3_Foo {};
#endif /* PY2_PKG2_BAR_HPP */

View file

@ -0,0 +1,6 @@
%module(package="py2.pkg2") bar
%{
#include "../../py2/pkg2/bar.hpp"
%}
%import (module="foo", package="py2.pkg2.pkg3") "../../py2/pkg2/pkg3/foo.hpp"
%include "../../py2/pkg2/bar.hpp"

View file

@ -0,0 +1,15 @@
TOP = ../../../../../..
SWIG = $(realpath $(TOP)/../preinst-swig)
SWIGOPT =
LIBS =
build:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' \
LIBS='$(LIBS)' TARGET='foo' INTERFACE='foo.i' python_cpp
static:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' \
LIBS='$(LIBS)' TARGET='foo' INTERFACE='foo.i' python_cpp_static
clean:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' TARGET='foo' python_clean

View file

@ -0,0 +1,4 @@
#ifndef PY2_PKG2_PKG3_FOO_HPP
#define PY2_PKG2_PKG3_FOO_HPP
struct Pkg3_Foo {};
#endif /* PY2_PKG2_PKG3_FOO_HPP */

View file

@ -0,0 +1,5 @@
%module(package="py2.pkg2.pkg3") foo
%{
#include "../../../py2/pkg2/pkg3/foo.hpp"
%}
%include "../../../py2/pkg2/pkg3/foo.hpp"

View file

@ -0,0 +1,14 @@
TOP = ../../../..
SWIG = $(realpath $(TOP)/../preinst-swig)
SWIGOPT =
LIBS =
build:
cd pkg2 && $(MAKE) SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' LIBS='$(LIBS)' build
static:
cd pkg2 && $(MAKE) SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' LIBS='$(LIBS)' static
clean:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' python_clean
cd pkg2 && $(MAKE) clean

View file

@ -0,0 +1,18 @@
TOP = ../../../../..
SWIG = $(realpath $(TOP)/../preinst-swig)
SWIGOPT =
LIBS =
build:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' \
LIBS='$(LIBS)' TARGET='bar' INTERFACE='bar.i' python_cpp
cd pkg3 && $(MAKE) SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' LIBS='$(LIBS)' build
static:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' \
LIBS='$(LIBS)' TARGET='bar' INTERFACE='bar.i' python_cpp
cd pkg3 && $(MAKE) SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' LIBS='$(LIBS)' static
clean:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' TARGET='bar' python_clean
cd pkg3 && $(MAKE) clean

View file

@ -0,0 +1,5 @@
#ifndef PY3_PKG2_BAR_HPP
#define PY3_PKG2_BAR_HPP
#include "../../py3/pkg2/pkg3/foo.hpp"
struct Pkg2_Bar : Pkg3_Foo {};
#endif /* PY3_PKG2_BAR_HPP */

View file

@ -0,0 +1,6 @@
%module(package="py3.pkg2") bar
%{
#include "../../py3/pkg2/bar.hpp"
%}
%import (module="foo", package="py3.pkg2.pkg3") "../../py3/pkg2/pkg3/foo.hpp"
%include "../../py3/pkg2/bar.hpp"

View file

@ -0,0 +1,15 @@
TOP = ../../../../../..
SWIG = $(realpath $(TOP)/../preinst-swig)
SWIGOPT =
LIBS =
build:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' \
LIBS='$(LIBS)' TARGET='foo' INTERFACE='foo.i' python_cpp
static:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SWIG='$(SWIG)' SWIGOPT='$(SWIGOPT)' \
LIBS='$(LIBS)' TARGET='foo' INTERFACE='foo.i' python_cpp_static
clean:
$(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' TARGET='foo' python_clean

View file

@ -0,0 +1,4 @@
#ifndef PY3_PKG2_PKG3_FOO_HPP
#define PY3_PKG2_PKG3_FOO_HPP
struct Pkg3_Foo {};
#endif /* PY3_PKG2_PKG3_FOO_HPP */

View file

@ -0,0 +1,5 @@
%module(package="py3.pkg2.pkg3") foo
%{
#include "../../../py3/pkg2/pkg3/foo.hpp"
%}
%include "../../../py3/pkg2/pkg3/foo.hpp"

View file

@ -0,0 +1,9 @@
# Test import of modules content from within __init__.py
print "Testing %module(package=...) with -relativeimport"
import sys
if sys.version_info < (3,0):
import py2.pkg2.bar
print " Finished importing py2.pkg2.bar"
else:
import py3.pkg2.bar
print " Finished importing py3.pkg2.bar"

View file

@ -1880,6 +1880,7 @@ include_directive: includetype options string BEGINFILE {
Node *nint = new_node("import");
Node *mnode = new_node("module");
Setattr(mnode,"name", mname);
Setattr(mnode,"options",$2);
appendChild(nint,mnode);
Delete(mnode);
appendChild(nint,firstChild($$));