nbdkit/0010-Fix-build-for-Python-3...

118 lines
3.9 KiB
Diff

From fe8e47a7295900951e4510bdf582dc6b836efad5 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 3 Oct 2016 13:55:26 +0100
Subject: [PATCH 10/11] Fix build for Python 3.
Python 3 does not have PyString_FromString. Use a near-equivalent
instead.
To build for Python 3 you must point the PYTHON environment variable
to the Python 3 interpreter when configuring. For example:
PYTHON=/usr/bin/python3 ./configure
---
README | 10 ++++++++++
configure.ac | 13 ++++++++++++-
plugins/python/nbdkit-python-plugin.pod | 9 +++++++++
plugins/python/python.c | 9 +++++++++
4 files changed, 40 insertions(+), 1 deletion(-)
diff --git a/README b/README
index 135c8d5..2723d5e 100644
--- a/README
+++ b/README
@@ -102,6 +102,16 @@ Optionally run this as root to install everything:
make install
+Python
+------
+
+By default nbdkit uses the Python version of the Python interpreter
+called "python" on the current $PATH. To use another version of
+Python you may need to set the PYTHON environment variable when
+configuring. For example:
+
+ PYTHON=/usr/bin/python3 ./configure
+
Tests
-----
diff --git a/configure.ac b/configure.ac
index c064420..a475e8e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -201,7 +201,18 @@ AS_IF([test "x$PYTHON" != "xno" && test "x$enable_python" != "xno"],[
])
])
- dnl XXX Could check these actually work.
+ dnl Check for various functions needed by the bindings.
+ old_LIBS="$LIBS"
+
+ PYTHON_BLDLIBRARY=`$PYTHON -c "import distutils.sysconfig; \
+ print (distutils.sysconfig.get_config_var('BLDLIBRARY'))"`
+ AC_CHECK_LIB([c],[PyString_FromString],
+ [AC_DEFINE([HAVE_PYSTRING_FROMSTRING],1,
+ [Found PyString_FromString in libpython.])],
+ [],[$PYTHON_BLDLIBRARY])
+
+ LIBS="$old_LIBS"
+
])
AM_CONDITIONAL([HAVE_PYTHON],[test "x$enable_python" != "xno" && test "x$PYTHON" != "xno"])
AC_SUBST([PYTHON_CFLAGS])
diff --git a/plugins/python/nbdkit-python-plugin.pod b/plugins/python/nbdkit-python-plugin.pod
index 70d3e17..9b0f0ef 100644
--- a/plugins/python/nbdkit-python-plugin.pod
+++ b/plugins/python/nbdkit-python-plugin.pod
@@ -16,6 +16,15 @@ L<nbdkit(1)>, allowing you to write nbdkit plugins in Python.
Broadly speaking, Python nbdkit plugins work like C ones, so you should
read L<nbdkit-plugin(3)> first.
+=head2 PYTHON 2 AND PYTHON 3
+
+The Python plugin has to be compiled for either Python 2 or Python 3
+when building nbdkit. You can set the C<PYTHON> environment variable
+to the desired interpreter, otherwise nbdkit will use the interpreter
+called C<python> on the current C<$PATH>. For example:
+
+ PYTHON=/usr/bin/python3 ./configure
+
=head2 USING A PYTHON NBDKIT PLUGIN
Assuming you have a Python script which is an nbdkit plugin, you run it
diff --git a/plugins/python/python.c b/plugins/python/python.c
index fcbb9f2..0504715 100644
--- a/plugins/python/python.c
+++ b/plugins/python/python.c
@@ -133,7 +133,11 @@ py_config (const char *key, const char *value)
/* Note that because closeit flag == 1, fp is now closed. */
/* The script should define a module called __main__. */
+#ifdef HAVE_PYSTRING_FROMSTRING
modname = PyString_FromString ("__main__");
+#else
+ modname = PyUnicode_FromString ("__main__");
+#endif
module = PyImport_Import (modname);
Py_DECREF (modname);
if (!module) {
@@ -154,8 +158,13 @@ py_config (const char *key, const char *value)
PyErr_Clear ();
args = PyTuple_New (2);
+#ifdef HAVE_PYSTRING_FROMSTRING
PyTuple_SetItem (args, 0, PyString_FromString (key));
PyTuple_SetItem (args, 1, PyString_FromString (value));
+#else
+ PyTuple_SetItem (args, 0, PyUnicode_FromString (key));
+ PyTuple_SetItem (args, 1, PyUnicode_FromString (value));
+#endif
r = PyObject_CallObject (fn, args);
Py_DECREF (fn);
Py_DECREF (args);
--
2.7.4