From a2a873bbc931ff553e2c08a345c9c045e85da0b5 Mon Sep 17 00:00:00 2001 From: Nate Bargmann Date: Sat, 22 Jul 2017 21:44:57 -0500 Subject: [PATCH] Update ax_python_devel.m4 macro Also reorder its call in configure.ac which now allows the PYTHON_VERSION environment variable to be recognized and processed correctly by the build system. Correctly add PYTHON_LIBS (correct ouput variable of AX_PYTHON_DEVEL) to the Makefile for the Python bindings. Update README.python for use of PYTHON_VERSION. --- bindings/Makefile.am | 8 +++--- bindings/README.python | 60 ++++++++++++++++++++++++++------------- bindings/py3test.py | 4 +-- bindings/pytest.py | 6 ++-- configure.ac | 3 +- macros/ax_python_devel.m4 | 39 +++++++++++++------------ 6 files changed, 73 insertions(+), 47 deletions(-) diff --git a/bindings/Makefile.am b/bindings/Makefile.am index e2067bf13..bf299b062 100644 --- a/bindings/Makefile.am +++ b/bindings/Makefile.am @@ -3,7 +3,7 @@ # more information on swig at http://www.swig.org # -AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/bindings @TCL_INCLUDE_SPEC@ @PYTHON_CPPFLAGS@ +AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/bindings $(PYTHON_CPPFLAGS) @TCL_INCLUDE_SPEC@ AM_CFLAGS = -fno-strict-aliasing @@ -88,7 +88,7 @@ nodist_pyexec_PYTHON = Hamlib.py nodist__Hamlib_la_SOURCES = hamlibpy_wrap.c _Hamlib_la_LDFLAGS = -no-undefined -module -avoid-version -_Hamlib_la_LIBADD = $(top_builddir)/src/libhamlib.la +_Hamlib_la_LIBADD = $(top_builddir)/src/libhamlib.la $(PYTHON_LIBS) _Hamlib_ladir = $(pyexecdir) _Hamlib_la_LTLIBRARIES = $(pyexec_ltlib) @@ -100,8 +100,8 @@ check-py: all-py Hamlib.py: hamlibpy_wrap.c hamlibpy_wrap.c: hamlib.swg $(SWGDEP) - $(SWIG) -python @AM_CPPFLAGS@ -I$(top_srcdir)/bindings -o $@ \ - `test -f hamlib.swg || echo '$(srcdir)/'`hamlib.swg + $(SWIG) -python $(AM_CPPFLAGS) -I$(top_srcdir)/bindings \ + -o $@ `test -f hamlib.swg || echo '$(srcdir)/'`hamlib.swg install-py: clean-py: diff --git a/bindings/README.python b/bindings/README.python index 7621e3185..a122dadc7 100644 --- a/bindings/README.python +++ b/bindings/README.python @@ -37,6 +37,9 @@ its bindings first: make make install +NOTE: Over time Python3 will become the default Python interpreter on most +distributions and the extra step will be needed for Python2 as detailed below. + At this point the Hamlib binaries, development files, and Python2 bindings will be installed to their customary locations under $HOME/local. @@ -44,21 +47,20 @@ Examination of the configure script's output will confirm that Python2 is found and used as this extract shows: checking whether to build python binding and demo... yes -checking for a Python interpreter with version >= 2.1... python checking for python... /usr/bin/python -checking for python version... 2.7 -checking for python platform... linux2 -checking for python script directory... ${prefix}/lib64/python2.7/site-packages -checking for python extension module directory... ${exec_prefix}/lib64/python2.7/site-packages -checking for python2.7... (cached) /usr/bin/python checking for a version of Python >= '2.1.0'... yes checking for the distutils Python package... yes checking for Python include path... -I/usr/include/python2.7 checking for Python library path... -L/usr/lib64 -lpython2.7 checking for Python site-packages path... /usr/lib64/python2.7/site-packages -checking python extra libraries... -lpthread -ldl -lutil +checking python extra libraries... -lpthread -ldl -lutil -lm checking python extra linking flags... -Xlinker -export-dynamic checking consistency of all components of python development environment... yes +checking whether /usr/bin/python version is >= 2.1... yes +checking for /usr/bin/python version... 2.7 +checking for /usr/bin/python platform... linux2 +checking for /usr/bin/python script directory... ${prefix}/lib64/python2.7/site-packages +checking for /usr/bin/python extension module directory... ${exec_prefix}/lib64/python2.7/site-packages At this point the file pytest.py in the source bindings directory may be run as a test. If an error is given that the Hamlib module cannot be @@ -66,37 +68,52 @@ found, see below. The next step is to configure and build for Python3: + ../hamlib/configure --with-python-binding PYTHON_VERSION='3.6' --prefix=$HOME/local + +If that doesn't work try: + ../hamlib/configure --with-python-binding PYTHON=`which python3` --prefix=$HOME/local + +then do the build: + + cd bindings make -Here the PYTHON environment variable is set to the first python3 executable -found in the path (python3 may be a symbolic link, which is fine). This -may be unwanted behavior if multiple versions of Python are installed. +NOTE: By changing the current directory to 'bindings', only the new Python3 +module will be compiled, which speeds things up considerably. + +Here the PYTHON_VERSION environment variable is set to the Major.minor version +of Python we wish to build against. The build system should be able to set +everything correctly from this environment variable. If not, try the second +example line which sets the PYTHON environment variable to the first python3 +executable found in the path (python3 may be a symbolic link, which is fine). +This may be unwanted behavior if multiple versions of Python are installed so +a specific version with the full path may also be provided. Python3 was found as shown in this configure output extract: checking whether to build python binding and demo... yes -checking whether /usr/bin/python3 version is >= 2.1... yes -checking for /usr/bin/python3 version... 3.6 -checking for /usr/bin/python3 platform... linux -checking for /usr/bin/python3 script directory... ${prefix}/lib64/python3.6/site-packages -checking for /usr/bin/python3 extension module directory... ${exec_prefix}/lib64/python3.6/site-packages -checking for python3.6... /usr/bin/python3 +checking for python3.6... /usr/bin/python3.6 checking for a version of Python >= '2.1.0'... yes checking for the distutils Python package... yes checking for Python include path... -I/usr/include/python3.6m checking for Python library path... -L/usr/lib64 -lpython3.6m checking for Python site-packages path... /usr/lib64/python3.6/site-packages -checking python extra libraries... -lpthread -ldl -lutil +checking python extra libraries... -lpthread -ldl -lutil -lm checking python extra linking flags... -Xlinker -export-dynamic checking consistency of all components of python development environment... yes +checking whether /usr/bin/python3.6 version is >= 2.1... yes +checking for /usr/bin/python3.6 version... 3.6 +checking for /usr/bin/python3.6 platform... linux +checking for /usr/bin/python3.6 script directory... ${prefix}/lib64/python3.6/site-packages +checking for /usr/bin/python3.6 extension module directory... ${exec_prefix}/lib64/python3.6/site-packages Since all the Makefiles were regenerated by the second run of configure, hamlib will be compiled again. -Next install the Python3 bindings: +Next install only the Python3 bindings (still in 'bindings' as the current +directory): - cd bindings make install In this case, only the generated files in 'bindings' will be installed @@ -162,6 +179,11 @@ interpreter was started from and various system directories. Far more information than this is available in the relevant Python documentation, but this should get your scripts working. +Removing (uninstalling) the bindings can be done from the 'bindings' +directory. Just be sure that 'configure' is run with the options for either +Python2 or Python3 first so that 'bindings/Makefile' will generated for the +version to be removed. + As always, feedback is welcome: Hamlib Developers diff --git a/bindings/py3test.py b/bindings/py3test.py index 3334b755e..6471d6c9e 100755 --- a/bindings/py3test.py +++ b/bindings/py3test.py @@ -55,7 +55,7 @@ def StartUp(): print("Model:\t\t\t%s" % my_rig.caps.model_name) print("Manufacturer:\t\t%s" % my_rig.caps.mfg_name) print("Backend version:\t%s" % my_rig.caps.version) - print("Backend license:\t%s" % my_rig.caps.copyright) + print("Backend status:\t\t%s" % Hamlib.rig_strstatus(my_rig.caps.status)) print("Rig info:\t\t%s" % my_rig.get_info()) my_rig.set_level("VOX", 1) @@ -75,7 +75,7 @@ def StartUp(): print("status:\t\t\t%s - %s" % (my_rig.error_status, Hamlib.rigerror(my_rig.error_status))) - print("AF level:\t\t%s" % my_rig.get_level_f(Hamlib.RIG_LEVEL_AF)) + print("AF level:\t\t%0.2f" % my_rig.get_level_f(Hamlib.RIG_LEVEL_AF)) print("strength:\t\t%s" % my_rig.get_level_i(Hamlib.RIG_LEVEL_STRENGTH)) print("status:\t\t\t%s" % my_rig.error_status) print("status(str):\t\t%s" % Hamlib.rigerror(my_rig.error_status)) diff --git a/bindings/pytest.py b/bindings/pytest.py index 9716b2251..3d7b4beb8 100755 --- a/bindings/pytest.py +++ b/bindings/pytest.py @@ -19,7 +19,7 @@ def StartUp(): Hamlib.rig_set_debug(Hamlib.RIG_DEBUG_NONE) # Init RIG_MODEL_DUMMY - my_rig = Hamlib.Rig (Hamlib.RIG_MODEL_DUMMY) + my_rig = Hamlib.Rig(Hamlib.RIG_MODEL_DUMMY) my_rig.set_conf("rig_pathname", "/dev/Rig") my_rig.set_conf("retry", "5") @@ -55,7 +55,7 @@ def StartUp(): print "Model:\t\t\t", my_rig.caps.model_name print "Manufacturer:\t\t", my_rig.caps.mfg_name print "Backend version:\t", my_rig.caps.version - print "Backend license:\t", my_rig.caps.copyright + print "Backend status:\t\t", Hamlib.rig_strstatus(my_rig.caps.status) print "Rig info:\t\t", my_rig.get_info() my_rig.set_level("VOX", 1) @@ -70,7 +70,7 @@ def StartUp(): print "Setting AF to %0.2f...." % (af) - my_rig.set_level ("AF", af) + my_rig.set_level("AF", af) print "status:\t\t\t%s - %s" % (my_rig.error_status, Hamlib.rigerror(my_rig.error_status)) diff --git a/configure.ac b/configure.ac index e313ca6ba..b0afeca9f 100644 --- a/configure.ac +++ b/configure.ac @@ -508,8 +508,9 @@ AC_MSG_RESULT([$cf_with_python_binding]) dnl AX_PYTHON_DEVEL from macros/ax_python_devel.m4 AS_IF([test x"${cf_with_python_binding}" = "xyes"],[ + dnl Order matters! AX_PYTHON_DEVEL must be first for PYTHON_VERSION to be honored. + AX_PYTHON_DEVEL([">='2.1'"]) AM_PATH_PYTHON([2.1],, [:]) - AX_PYTHON_DEVEL BINDING_LIST="${BINDING_LIST} python" BINDING_ALL="${BINDING_ALL} all-py" diff --git a/macros/ax_python_devel.m4 b/macros/ax_python_devel.m4 index c82ba9af7..44dbd83e0 100644 --- a/macros/ax_python_devel.m4 +++ b/macros/ax_python_devel.m4 @@ -1,5 +1,5 @@ # =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_python_devel.html +# https://www.gnu.org/software/autoconf-archive/ax_python_devel.html # =========================================================================== # # SYNOPSIS @@ -12,8 +12,8 @@ # in your configure.ac. # # This macro checks for Python and tries to get the include path to -# 'Python.h'. It provides the $(PYTHON_CPPFLAGS) and $(PYTHON_LDFLAGS) -# output variables. It also exports $(PYTHON_EXTRA_LIBS) and +# 'Python.h'. It provides the $(PYTHON_CPPFLAGS) and $(PYTHON_LIBS) output +# variables. It also exports $(PYTHON_EXTRA_LIBS) and # $(PYTHON_EXTRA_LDFLAGS) for embedding Python in your code. # # You can search for some particular version of Python by passing a @@ -52,7 +52,7 @@ # Public License for more details. # # You should have received a copy of the GNU General Public License along -# with this program. If not, see . +# with this program. If not, see . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure @@ -67,7 +67,7 @@ # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. -#serial 15 +#serial 21 AU_ALIAS([AC_PYTHON_DEVEL], [AX_PYTHON_DEVEL]) AC_DEFUN([AX_PYTHON_DEVEL],[ @@ -99,7 +99,7 @@ AC_DEFUN([AX_PYTHON_DEVEL],[ This version of the AC@&t@_PYTHON_DEVEL macro doesn't work properly with versions of Python before 2.1.0. You may need to re-run configure, setting the -variables PYTHON_CPPFLAGS, PYTHON_LDFLAGS, PYTHON_SITE_PKG, +variables PYTHON_CPPFLAGS, PYTHON_LIBS, PYTHON_SITE_PKG, PYTHON_EXTRA_LIBS and PYTHON_EXTRA_LDFLAGS by hand. Moreover, to disable this check, set PYTHON_NOVERSIONCHECK to something else than an empty string. @@ -137,7 +137,7 @@ variable to configure. See ``configure --help'' for reference. # AC_MSG_CHECKING([for the distutils Python package]) ac_distutils_result=`$PYTHON -c "import distutils" 2>&1` - if test -z "$ac_distutils_result"; then + if test $? -eq 0; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) @@ -172,7 +172,7 @@ $ac_distutils_result]) # Check for Python library path # AC_MSG_CHECKING([for Python library path]) - if test -z "$PYTHON_LDFLAGS"; then + if test -z "$PYTHON_LIBS"; then # (makes two attempts to ensure we've got a version number # from the interpreter) ac_python_version=`cat<