Blob Blame History Raw
From 263ae7b08d8ecacd7de671a7f2e6041966b4aff4 Mon Sep 17 00:00:00 2001
From: Lukas Slebodnik <lslebodn@redhat.com>
Date: Tue, 10 Feb 2015 17:22:03 +0100
Subject: [PATCH 96/99] BUILD: Add possibility to build python{2,3} bindings

Resolves:
https://fedorahosted.org/sssd/ticket/2574

Reviewed-by: Stephen Gallagher <sgallagh@redhat.com>
---
 Makefile.am                    | 196 ++++++++++++++++++++++++++++++++---------
 configure.ac                   |  49 +++++++++--
 contrib/sssd.spec.in           |   4 +
 src/conf_macros.m4             |  39 +++++---
 src/tests/pyhbac-test.py       |  22 ++++-
 src/tests/pysss_murmur-test.py |  22 ++++-
 6 files changed, 267 insertions(+), 65 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 697ec14bf6340961fa93612472a54d3f83edfd6c..027d627586aad212ce7f62d6e6b01b7da2ea2126 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -301,12 +301,22 @@ noinst_LTLIBRARIES =
 
 pkglib_LTLIBRARIES =
 
-if BUILD_PYTHON_BINDINGS
-pyexec_LTLIBRARIES = \
-    pysss.la \
-    pyhbac.la \
-    pysss_murmur.la \
-    pysss_nss_idmap.la
+if BUILD_PYTHON2_BINDINGS
+py2exec_LTLIBRARIES = \
+    _py2sss.la \
+    _py2hbac.la \
+    _py2sss_murmur.la \
+    _py2sss_nss_idmap.la \
+    $(NULL)
+endif
+
+if BUILD_PYTHON3_BINDINGS
+py3exec_LTLIBRARIES = \
+    _py3sss.la \
+    _py3hbac.la \
+    _py3sss_murmur.la \
+    _py3sss_nss_idmap.la \
+    $(NULL)
 endif
 
 dist_noinst_SCRIPTS = \
@@ -2833,58 +2843,109 @@ sssd_pac_plugin_la_LDFLAGS = \
     -avoid-version \
     -module
 
-if BUILD_PYTHON_BINDINGS
+# python[23] bindings
 pysss_la_SOURCES = \
     $(SSSD_TOOLS_OBJ) \
     src/python/pysss.c
-pysss_la_CFLAGS = \
-    $(AM_CFLAGS)  \
-    $(PYTHON_CFLAGS)
-pysss_la_LIBADD = \
-    $(SSSD_INTERNAL_LTLIBS) \
-    $(PYTHON_BINDINGS_LIBS) \
-    $(PYTHON_LIBS)
 pysss_la_LDFLAGS = \
     -avoid-version \
     -module
 
+_py2sss_la_SOURCES = $(pysss_la_SOURCES)
+_py2sss_la_CFLAGS = \
+    $(AM_CFLAGS)  \
+    $(PYTHON2_CFLAGS)
+_py2sss_la_LIBADD = \
+    $(SSSD_INTERNAL_LTLIBS) \
+    $(PYTHON_BINDINGS_LIBS) \
+    $(PYTHON2_LIBS)
+_py2sss_la_LDFLAGS = $(pysss_la_LDFLAGS)
+
+_py3sss_la_SOURCES = $(pysss_la_SOURCES)
+_py3sss_la_CFLAGS = \
+    $(AM_CFLAGS)  \
+    $(PYTHON3_CFLAGS)
+_py3sss_la_LIBADD = \
+    $(SSSD_INTERNAL_LTLIBS) \
+    $(PYTHON_BINDINGS_LIBS) \
+    $(PYTHON3_LIBS)
+_py3sss_la_LDFLAGS = $(pysss_la_LDFLAGS)
+
+
 pyhbac_la_SOURCES = \
     src/python/pyhbac.c \
     src/util/sss_python.c
-pyhbac_la_CFLAGS = \
-    $(AM_CFLAGS)  \
-    $(PYTHON_CFLAGS)
-pyhbac_la_LIBADD = \
-    $(PYTHON_LIBS) \
-    libipa_hbac.la
 pyhbac_la_LDFLAGS = \
     -avoid-version \
     -module
 
+_py2hbac_la_SOURCES = $(pyhbac_la_SOURCES)
+_py2hbac_la_CFLAGS = \
+    $(AM_CFLAGS)  \
+    $(PYTHON2_CFLAGS)
+_py2hbac_la_LIBADD = \
+    $(PYTHON2_LIBS) \
+    libipa_hbac.la
+_py2hbac_la_LDFLAGS = $(pyhbac_la_LDFLAGS)
+
+_py3hbac_la_SOURCES = $(pyhbac_la_SOURCES)
+_py3hbac_la_CFLAGS = \
+    $(AM_CFLAGS)  \
+    $(PYTHON3_CFLAGS)
+_py3hbac_la_LIBADD = \
+    $(PYTHON3_LIBS) \
+    libipa_hbac.la
+_py3hbac_la_LDFLAGS = $(pyhbac_la_LDFLAGS)
+
+
 pysss_murmur_la_SOURCES = \
     src/python/pysss_murmur.c \
     src/util/murmurhash3.c
-pysss_murmur_la_CFLAGS = \
-    $(AM_CFLAGS)  \
-    $(PYTHON_CFLAGS)
-pysss_murmur_la_LIBADD = \
-    $(PYTHON_LIBS)
 pysss_murmur_la_LDFLAGS = \
     -avoid-version \
     -module
 
+_py2sss_murmur_la_SOURCES = $(pysss_murmur_la_SOURCES)
+_py2sss_murmur_la_CFLAGS = \
+    $(AM_CFLAGS)  \
+    $(PYTHON2_CFLAGS)
+_py2sss_murmur_la_LIBADD = \
+    $(PYTHON2_LIBS)
+_py2sss_murmur_la_LDFLAGS = $(pysss_murmur_la_LDFLAGS)
+
+_py3sss_murmur_la_SOURCES = $(pysss_murmur_la_SOURCES)
+_py3sss_murmur_la_CFLAGS = \
+    $(AM_CFLAGS)  \
+    $(PYTHON3_CFLAGS)
+_py3sss_murmur_la_LIBADD = \
+    $(PYTHON3_LIBS)
+_py3sss_murmur_la_LDFLAGS = $(pysss_murmur_la_LDFLAGS)
+
+
 pysss_nss_idmap_la_SOURCES = \
     src/python/pysss_nss_idmap.c
-pysss_nss_idmap_la_CFLAGS = \
-    $(AM_CFLAGS)  \
-    $(PYTHON_CFLAGS)
-pysss_nss_idmap_la_LIBADD = \
-    $(PYTHON_LIBS) \
-    libsss_nss_idmap.la
 pysss_nss_idmap_la_LDFLAGS = \
     -avoid-version \
     -module
-endif
+
+_py2sss_nss_idmap_la_SOURCES = $(pysss_nss_idmap_la_SOURCES)
+_py2sss_nss_idmap_la_CFLAGS = \
+    $(AM_CFLAGS)  \
+    $(PYTHON2_CFLAGS)
+_py2sss_nss_idmap_la_LIBADD = \
+    $(PYTHON2_LIBS) \
+    libsss_nss_idmap.la
+_py2sss_nss_idmap_la_LDFLAGS = $(pysss_nss_idmap_la_LDFLAGS)
+
+_py3sss_nss_idmap_la_SOURCES = $(pysss_nss_idmap_la_SOURCES)
+_py3sss_nss_idmap_la_CFLAGS = \
+    $(AM_CFLAGS)  \
+    $(PYTHON3_CFLAGS)
+_py3sss_nss_idmap_la_LIBADD = \
+    $(PYTHON3_LIBS) \
+    libsss_nss_idmap.la
+_py3sss_nss_idmap_la_LDFLAGS = $(pysss_nss_idmap_la_LDFLAGS)
+# end of python[23] bindings
 
 if BUILD_CIFS_IDMAP_PLUGIN
 cifs_idmap_sss_la_SOURCES = \
@@ -3046,17 +3107,51 @@ SSSSCONFIG_MODULES =
 endif
 
 all-local: ldb_mod_test_dir $(SSSDCONFIG_MODULES)
-if BUILD_PYTHON_BINDINGS
-	cd $(builddir)/src/config; $(PYTHON) setup.py build --build-base $(abs_builddir)/src/config
+if BUILD_PYTHON2_BINDINGS
+	cd $(builddir)/src/config; \
+	$(PYTHON2) setup.py build --build-base $(abs_builddir)/src/config
+endif
+if BUILD_PYTHON3_BINDINGS
+	cd $(builddir)/src/config; \
+	$(PYTHON3) setup.py build --build-base $(abs_builddir)/src/config
 endif
 
 install-exec-hook: installsssddirs
-if BUILD_PYTHON_BINDINGS
+if BUILD_PYTHON2_BINDINGS
 	if [ "$(DESTDIR)" = "" ]; then \
-		cd $(builddir)/src/config; $(PYTHON) setup.py build --build-base $(abs_builddir)/src/config install $(DISTSETUPOPTS) --prefix=$(PYTHON_PREFIX) --record=$(abs_builddir)/src/config/.files; \
+		cd $(builddir)/src/config; \
+		$(PYTHON2) setup.py build --build-base $(abs_builddir)/src/config \
+			install $(DISTSETUPOPTS) --prefix=$(PYTHON2_PREFIX) \
+			--record=$(abs_builddir)/src/config/.files2; \
 	else \
-		cd $(builddir)/src/config; $(PYTHON) setup.py build --build-base $(abs_builddir)/src/config install $(DISTSETUPOPTS) --prefix=$(PYTHON_PREFIX) --root=$(DESTDIR) --record=$(abs_builddir)/src/config/.files; \
+		cd $(builddir)/src/config; \
+		$(PYTHON2) setup.py build --build-base $(abs_builddir)/src/config \
+			install $(DISTSETUPOPTS) --prefix=$(PYTHON2_PREFIX) \
+			--record=$(abs_builddir)/src/config/.files2 --root=$(DESTDIR); \
 	fi
+	cd $(DESTDIR)$(py2execdir) && \
+		$(LN_S) _py2sss.so pysss.so ; \
+		$(LN_S) _py2hbac.so pyhbac.so ; \
+		$(LN_S) _py2sss_murmur.so pysss_murmur.so ; \
+		$(LN_S) _py2sss_nss_idmap.so pysss_nss_idmap.so
+endif
+if BUILD_PYTHON3_BINDINGS
+	if [ "$(DESTDIR)" = "" ]; then \
+		cd $(builddir)/src/config; \
+		$(PYTHON3) setup.py build --build-base $(abs_builddir)/src/config \
+			install $(DISTSETUPOPTS) --prefix=$(PYTHON3_PREFIX) \
+			--record=$(abs_builddir)/src/config/.files3; \
+	else \
+		cd $(builddir)/src/config; \
+		$(PYTHON3) setup.py build --build-base $(abs_builddir)/src/config \
+			install $(DISTSETUPOPTS) --prefix=$(PYTHON3_PREFIX) \
+			--record=$(abs_builddir)/src/config/.files3 --root=$(DESTDIR); \
+	fi
+	cd $(DESTDIR)$(py3execdir) && \
+		$(LN_S) _py3sss.so pysss.so ; \
+		$(LN_S) _py3hbac.so pyhbac.so ; \
+		$(LN_S) _py3sss_murmur.so pysss_murmur.so ; \
+		$(LN_S) _py3sss_nss_idmap.so pysss_nss_idmap.so
 endif
 	for doc in $(SSSD_DOCS); do \
 		$(MKDIR_P) $$doc $(DESTDIR)/$(docdir); \
@@ -3090,16 +3185,20 @@ install-data-hook:
 	fi
 
 uninstall-hook:
-	if [ -f $(abs_builddir)/src/config/.files ]; then \
-	    cat $(abs_builddir)/src/config/.files | xargs -iq rm -f $(DESTDIR)/q; \
-	    rm $(abs_builddir)/src/config/.files ; \
+	if [ -f $(abs_builddir)/src/config/.files2 ]; then \
+	    cat $(abs_builddir)/src/config/.files2 | xargs -iq rm -f $(DESTDIR)/q; \
+	    rm $(abs_builddir)/src/config/.files2 ; \
+	fi
+	if [ -f $(abs_builddir)/src/config/.files3 ]; then \
+	    cat $(abs_builddir)/src/config/.files3 | xargs -iq rm -f $(DESTDIR)/q; \
+	    rm $(abs_builddir)/src/config/.files3 ; \
 	fi
 	for doc in $(SSSD_DOCS); do \
 		rm -Rf $(DESTDIR)/$(docdir)/$$doc; \
 	done;
 
 clean-local:
-if BUILD_PYTHON_BINDINGS
+if BUILD_PYTHON2_BINDINGS
 	if [ ! $(srcdir)/src/config/SSSDConfig/ipachangeconf.py -ef $(builddir)/src/config/SSSDConfig/ipachangeconf.py ]; then \
 		rm -f $(builddir)/src/config/SSSDConfig/ipachangeconf.py ; \
 	fi
@@ -3110,7 +3209,20 @@ if BUILD_PYTHON_BINDINGS
 
 	rm -f $(builddir)/src/config/SSSDConfig/*.pyc
 
-	cd $(builddir)/src/config; $(PYTHON) setup.py build --build-base $(abs_builddir)/src/config clean --all
+	cd $(builddir)/src/config; $(PYTHON2) setup.py build --build-base $(abs_builddir)/src/config clean --all
+endif
+if BUILD_PYTHON3_BINDINGS
+	if [ ! $(srcdir)/src/config/SSSDConfig/ipachangeconf.py -ef $(builddir)/src/config/SSSDConfig/ipachangeconf.py ]; then \
+		rm -f $(builddir)/src/config/SSSDConfig/ipachangeconf.py ; \
+	fi
+
+	if [ ! $(srcdir)/src/config/SSSDConfig/ipachangeconf.py -ef $(builddir)/src/config/SSSDConfig/ipachangeconf.py ]; then \
+		rm -f $(builddir)/src/config/SSSDConfig/sssd_upgrade_config.py ; \
+	fi
+
+	rm -f $(builddir)/src/config/SSSDConfig/__pycache__/*.pyc
+
+	cd $(builddir)/src/config; $(PYTHON3) setup.py build --build-base $(abs_builddir)/src/config clean --all
 endif
 	for doc in $(SSSD_DOCS); do \
 		rm -Rf $$doc; \
diff --git a/configure.ac b/configure.ac
index f72e448528edcffb855504a38a179c400f98ac42..e30405f3a17ffd2c9899b6eb17af85ec9bc15234 100644
--- a/configure.ac
+++ b/configure.ac
@@ -117,7 +117,8 @@ WITH_KRB5_PLUGIN_PATH
 WITH_KRB5_RCACHE_DIR
 WITH_KRB5AUTHDATA_PLUGIN_PATH
 WITH_KRB5_CONF
-WITH_PYTHON_BINDINGS
+WITH_PYTHON2_BINDINGS
+WITH_PYTHON3_BINDINGS
 WITH_CIFS_PLUGIN_PATH
 WITH_SELINUX
 WITH_NSCD
@@ -247,16 +248,52 @@ AM_CONDITIONAL([HAVE_PROFILE_CATALOGS], [test "x$HAVE_PROFILE_CATALOGS" != "x"])
 AM_CONDITIONAL([HAVE_MANPAGES], [test "x$HAVE_MANPAGES" != "x"])
 AM_CONDITIONAL([HAVE_PO4A], [test "x$PO4A" != "xno"])
 
-if test x$HAVE_PYTHON_BINDINGS != x; then
+if test x$HAVE_PYTHON2_BINDINGS = x1; then
+    AC_PATH_PROG(PYTHON2, python2)
+    PYTHON=$PYTHON2
     AM_PATH_PYTHON([2.6])
-    AM_PYTHON_CONFIG([python])
+    AM_PYTHON_CONFIG([python2])
     AM_CHECK_PYTHON_HEADERS([],
-                            AC_MSG_ERROR([Could not find python headers]))
+                            AC_MSG_ERROR([Could not find python2 headers]))
     AM_CHECK_PYTHON_COMPAT
-    AC_SUBST([PYTHON_CFLAGS])
-    AC_SUBST([PYTHON_LIBS])
+
+    AC_SUBST([py2execdir], [$pyexecdir])
+    AC_SUBST([python2dir], [$pythondir])
+    AC_SUBST([PYTHON2_CFLAGS], [$PYTHON_CFLAGS])
+    AC_SUBST([PYTHON2_LIBS], [$PYTHON_LIBS])
+    AC_SUBST([PYTHON2_INCLUDES], [$PYTHON_INCLUDES])
+    AC_SUBST([PYTHON2_VERSION], [$PYTHON_VERSION])
+    AC_SUBST([PYTHON2_PREFIX], [$PYTHON_PREFIX])
+    AC_SUBST([PYTHON2_EXEC_PREFIX], [$PYTHON_EXEC_PREFIX])
+
+    SSS_CLEAN_PYTHON_VARIABLES
 fi
 
+if test x$HAVE_PYTHON3_BINDINGS = x1; then
+    AC_PATH_PROG(PYTHON3, python3)
+    PYTHON=$PYTHON3
+    AM_PATH_PYTHON([3.3])
+    AM_PYTHON_CONFIG([python3])
+    AM_CHECK_PYTHON_HEADERS([],
+                            AC_MSG_ERROR([Could not find python3 headers]))
+    AM_CHECK_PYTHON_COMPAT
+
+    AC_SUBST([py3execdir], [$pyexecdir])
+    AC_SUBST([python3dir], [$pythondir])
+    AC_SUBST([PYTHON3_CFLAGS], [$PYTHON_CFLAGS])
+    AC_SUBST([PYTHON3_LIBS], [$PYTHON_LIBS])
+    AC_SUBST([PYTHON3_INCLUDES], [$PYTHON_INCLUDES])
+    AC_SUBST([PYTHON3_VERSION], [$PYTHON_VERSION])
+    AC_SUBST([PYTHON3_PREFIX], [$PYTHON_PREFIX])
+    AC_SUBST([PYTHON3_EXEC_PREFIX], [$PYTHON_EXEC_PREFIX])
+
+    SSS_CLEAN_PYTHON_VARIABLES
+fi
+
+AM_CONDITIONAL([BUILD_PYTHON_BINDINGS],
+               [test x"$with_python2_bindings" = xyes \
+                     -o x"$with_python3_bindings" = xyes])
+
 if test x$HAVE_SELINUX != x; then
     AM_CHECK_SELINUX
     AM_CHECK_SELINUX_LOGIN_DIR
diff --git a/contrib/sssd.spec.in b/contrib/sssd.spec.in
index 66c209a4619b942ca262e4a4f2bd43731beae788..847b6cf2a36f5323cdfad77dd5ef5772b261c2b9 100644
--- a/contrib/sssd.spec.in
+++ b/contrib/sssd.spec.in
@@ -781,10 +781,12 @@ rm -rf $RPM_BUILD_ROOT
 %files -n python-sss
 %defattr(-,root,root,-)
 %{python_sitearch}/pysss.so
+%{python_sitearch}/_py2sss.so
 
 %files -n python-sss-murmur
 %defattr(-,root,root,-)
 %{python_sitearch}/pysss_murmur.so
+%{python_sitearch}/_py2sss_murmur.so
 
 %files -n libsss_idmap
 %defattr(-,root,root,-)
@@ -825,10 +827,12 @@ rm -rf $RPM_BUILD_ROOT
 %files -n python-libsss_nss_idmap
 %defattr(-,root,root,-)
 %{python_sitearch}/pysss_nss_idmap.so
+%{python_sitearch}/_py2sss_nss_idmap.so
 
 %files -n python-libipa_hbac
 %defattr(-,root,root,-)
 %{python_sitearch}/pyhbac.so
+%{python_sitearch}/_py2hbac.so
 
 %files libwbclient
 %defattr(-,root,root,-)
diff --git a/src/conf_macros.m4 b/src/conf_macros.m4
index 027490e524f321b9d444395e788aa7476dd916e9..ff49f84421ac6be8a2a5f5840283485ea16d671d 100644
--- a/src/conf_macros.m4
+++ b/src/conf_macros.m4
@@ -360,21 +360,38 @@ AC_DEFUN([WITH_KRB5_CONF],
     AC_DEFINE_UNQUOTED([KRB5_CONF_PATH], ["$KRB5_CONF_PATH"], [KRB5 configuration file])
   ])
 
-AC_DEFUN([WITH_PYTHON_BINDINGS],
-  [ AC_ARG_WITH([python-bindings],
-                [AC_HELP_STRING([--with-python-bindings],
-                                [Whether to build python bindings [yes]]
-                               )
+AC_DEFUN([WITH_PYTHON2_BINDINGS],
+  [ AC_ARG_WITH([python2-bindings],
+                [AC_HELP_STRING([--with-python2-bindings],
+                                [Whether to build python2 bindings [yes]])
                 ],
                 [],
-                with_python_bindings=yes
+                [with_python2_bindings=yes]
                )
-    if test x"$with_python_bindings" = xyes; then
-        HAVE_PYTHON_BINDINGS=1
-        AC_SUBST(HAVE_PYTHON_BINDINGS)
-        AC_DEFINE_UNQUOTED(HAVE_PYTHON_BINDINGS, 1, [Build with python bindings])
+    if test x"$with_python2_bindings" = xyes; then
+        AC_SUBST([HAVE_PYTHON2_BINDINGS], [1])
+        AC_DEFINE_UNQUOTED([HAVE_PYTHON2_BINDINGS], [1],
+                           [Build with python2 bindings])
     fi
-    AM_CONDITIONAL([BUILD_PYTHON_BINDINGS], [test x"$with_python_bindings" = xyes])
+    AM_CONDITIONAL([BUILD_PYTHON2_BINDINGS],
+                   [test x"$with_python2_bindings" = xyes])
+  ])
+
+AC_DEFUN([WITH_PYTHON3_BINDINGS],
+  [ AC_ARG_WITH([python3-bindings],
+                [AC_HELP_STRING([--with-python3-bindings],
+                                [Whether to build python3 bindings [yes]])
+                ],
+                [],
+                [with_python3_bindings=no]
+               )
+    if test x"$with_python3_bindings" = xyes; then
+        AC_SUBST([HAVE_PYTHON3_BINDINGS], [1])
+        AC_DEFINE_UNQUOTED([HAVE_PYTHON3_BINDINGS], [1],
+                           [Build with python3 bindings])
+    fi
+    AM_CONDITIONAL([BUILD_PYTHON3_BINDINGS],
+                   [test x"$with_python3_bindings" = xyes])
   ])
 
 AC_DEFUN([WITH_SELINUX],
diff --git a/src/tests/pyhbac-test.py b/src/tests/pyhbac-test.py
index 0abc5703dedb2466b4d99718b5b524951b8af95c..83958d7bffcccea375c79166ee7dfca6f9956cff 100755
--- a/src/tests/pyhbac-test.py
+++ b/src/tests/pyhbac-test.py
@@ -6,10 +6,9 @@ import sys
 import os
 import copy
 import sys
+import errno
 
-srcdir = os.getenv('builddir')
-if not srcdir:
-    srcdir = "."
+srcdir = os.getenv('builddir') or "."
 MODPATH = srcdir + "/.libs" #FIXME - is there a way to get this from libtool?
 
 if sys.version_info[0] > 2:
@@ -41,6 +40,23 @@ class PyHbacImport(unittest.TestCase):
     def testImport(self):
         " Import the module and assert it comes from tree "
         try:
+            cwd_backup = os.getcwd()
+
+            try:
+                os.unlink(MODPATH + "/pyhbac.so")
+            except OSError as e:
+                if e.errno == errno.ENOENT:
+                    pass
+                else:
+                    raise e
+
+            os.chdir(MODPATH)
+            if sys.version_info[0] > 2:
+                os.symlink("_py3hbac.so", "pyhbac.so")
+            else:
+                os.symlink("_py2hbac.so", "pyhbac.so")
+            os.chdir(cwd_backup)
+
             import pyhbac
         except ImportError as e:
             print("Could not load the pyhbac module. Please check if it is compiled", file=sys.stderr)
diff --git a/src/tests/pysss_murmur-test.py b/src/tests/pysss_murmur-test.py
index 0b28f45e67cb4b033516a585867085dba7b412e6..faa8bb2d33b9d94d380b8f7045ba45aa06ac4793 100755
--- a/src/tests/pysss_murmur-test.py
+++ b/src/tests/pysss_murmur-test.py
@@ -23,10 +23,9 @@ import unittest
 import sys
 import os
 import copy
+import errno
 
-srcdir = os.getenv('builddir')
-if not srcdir:
-    srcdir = "."
+srcdir = os.getenv('builddir') or "."
 MODPATH = srcdir + "/.libs" #FIXME - is there a way to get this from libtool?
 
 def compat_assertItemsEqual(this, expected_seq, actual_seq, msg=None):
@@ -57,6 +56,23 @@ class PySssMurmurImport(unittest.TestCase):
     def testImport(self):
         " Import the module and assert it comes from tree "
         try:
+            cwd_backup = os.getcwd()
+
+            try:
+                os.unlink(MODPATH + "/pysss_murmur.so")
+            except OSError as e:
+                if e.errno == errno.ENOENT:
+                    pass
+                else:
+                    raise e
+
+            os.chdir(MODPATH)
+            if sys.version_info[0] > 2:
+                os.symlink("_py3sss_murmur.so", "pysss_murmur.so")
+            else:
+                os.symlink("_py2sss_murmur.so", "pysss_murmur.so")
+            os.chdir(cwd_backup)
+
             import pysss_murmur
         except ImportError as e:
             print("Could not load the pysss_murmur module. Please check if it is compiled", file=sys.stderr)
-- 
2.4.0