python: Integrate into the build system.

* configure.ac: Make Python bindings configurable, add new Makefile.
* lang/python/Makefile.am: New file.
* lang/python/setup.py: Integrate into the build system.
* m4/ax_pkg_swig.m4: New file from the autoconf archive.
* m4/m4_ax_swig_python.m4: Likewise.

Signed-off-by: Justus Winter <justus@gnupg.org>
This commit is contained in:
Justus Winter 2016-05-11 11:42:00 +02:00
parent 11392a80d9
commit a29babd07c
5 changed files with 294 additions and 31 deletions

View File

@ -587,6 +587,32 @@ AC_SUBST(emacs_local_vars_begin, [['Local][ ][Variables:']])
AC_SUBST(emacs_local_vars_read_only, ['buffer-read-only: t']) AC_SUBST(emacs_local_vars_read_only, ['buffer-read-only: t'])
AC_SUBST(emacs_local_vars_end, ['End:']) AC_SUBST(emacs_local_vars_end, ['End:'])
# Bindings.
AC_ARG_ENABLE([python],
AC_HELP_STRING([--enable-python],
[build the Python3 bindings]),
[enable_python=$enableval],
[enable_python=auto])
AX_PKG_SWIG
if test -z "$SWIG"; then
if test $enable_python = yes; then
die=yes
AC_MSG_NOTICE([[
***
*** You need SWIG to build the Python bindings.
***]])
else
enable_python=no
fi
else
if test $enable_python = auto; then
enable_python=yes
fi
fi
if test $enable_python = yes; then
AM_PATH_PYTHON([3.2])
AX_SWIG_PYTHON
fi
# Last check. # Last check.
die=no die=no
@ -632,7 +658,8 @@ AC_CONFIG_FILES(Makefile src/Makefile
src/versioninfo.rc src/versioninfo.rc
src/gpgme.h) src/gpgme.h)
AC_CONFIG_FILES(src/gpgme-config, chmod +x src/gpgme-config) AC_CONFIG_FILES(src/gpgme-config, chmod +x src/gpgme-config)
AC_CONFIG_FILES([lang/Makefile lang/cl/Makefile lang/cl/gpgme.asd]) AC_CONFIG_FILES([lang/Makefile lang/cl/Makefile lang/cl/gpgme.asd
lang/python/Makefile])
AC_OUTPUT AC_OUTPUT
echo " echo "
@ -644,6 +671,8 @@ echo "
UI Server: $uiserver UI Server: $uiserver
FD Passing: $use_descriptor_passing FD Passing: $use_descriptor_passing
GPGME Pthread: $have_pthread GPGME Pthread: $have_pthread
Python bindings: $enable_python
" "
if test "x${gpg_config_script_warn}" != x; then if test "x${gpg_config_script_warn}" != x; then
cat <<G10EOF cat <<G10EOF

53
lang/python/Makefile.am Normal file
View File

@ -0,0 +1,53 @@
# Makefile.am for the Python bindings.
# Copyright (C) 2016 g10 Code GmbH
#
# This file is part of GPGME.
#
# GPGME is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# GPGME is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
# Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this program; if not, see <http://www.gnu.org/licenses/>.
EXTRA_DIST = README.rst
# Cleanup gpgme.h from deprecated functions and typedefs.
gpgme.h: ../../src/gpgme.h
$(PYTHON) $(srcdir)/gpgme-h-clean.py $< >$@
# For VPATH builds we need to copy some files because Python's
# distutils are not VPATH-aware.
copystamp: $(srcdir)/pyme $(srcdir)/helpers.c $(srcdir)/helpers.h
if test "$(srcdir)" != "$(builddir)" ; then cp -a $^ . ; fi
touch $@
gpgme_wrap.c pyme/pygpgme.py: gpgme.i gpgme.h copystamp
$(SWIG) -python -py3 $(SWIGOPT) \
-o $(builddir)/gpgme_wrap.c -outdir $(builddir)/pyme \
$<
all-local: gpgme_wrap.c pyme/pygpgme.py copystamp
$(PYTHON) $(srcdir)/setup.py build --verbose
clean-local:
rm -rf -- build gpgme.h gpgme_wrap.c pyme/pygpgme.py copystamp
if test "$(srcdir)" != "$(builddir)" ; then \
rm -rf pyme helpers.c helpers.h ; \
fi
install-exec-local:
$(PYTHON) $(srcdir)/setup.py install \
--prefix $(DESTDIR)$(prefix) \
--record $(DESTDIR)$(pythondir)/pyme/install_files.txt \
--verbose
uninstall-local:
xargs <$(DESTDIR)$(pythondir)/pyme/install_files.txt -- rm -rf --
rm -rf -- $(DESTDIR)$(pythondir)/pyme

View File

@ -22,31 +22,23 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# END OF COPYRIGHT # # END OF COPYRIGHT #
from distutils.core import setup, Extension from distutils.core import setup, Extension
from distutils.command.build_ext import build_ext
import os, os.path, sys import os, os.path, sys
import subprocess import subprocess
sys.path.append("pyme") sys.path.insert(0, os.path.dirname(__file__))
import version import pyme.version
def getconfig(what): def getconfig(what):
try: confdata = subprocess.Popen(["../../src/gpgme-config", "--%s" % what],
process = subprocess.Popen(["gpgme-config", "--%s" % what], stdout=subprocess.PIPE).communicate()[0]
stdout=subprocess.PIPE)
confdata = process.communicate()[0]
except OSError as e:
if e.errno == os.errno.ENOENT:
raise RuntimeError("Could not call gpgme-config, perhaps install libgpgme-dev")
else:
raise
return [x for x in confdata.decode('utf-8').split() if x != ''] return [x for x in confdata.decode('utf-8').split() if x != '']
include_dirs = [os.getcwd()] include_dirs = [os.getcwd()]
define_macros = [] define_macros = []
library_dirs = [] library_dirs = ["../../src/.libs"] # XXX uses libtool internals
libs = getconfig('libs') libs = getconfig('libs')
for item in getconfig('cflags'): for item in getconfig('cflags'):
if item.startswith("-I"): if item.startswith("-I"):
include_dirs.append(item[2:]) include_dirs.append(item[2:])
@ -82,16 +74,6 @@ if uname_s.startswith("MINGW32"):
library_dirs.append(os.path.join(tgt, item)) library_dirs.append(os.path.join(tgt, item))
break break
try:
subprocess.call("swig")
except OSError as e:
if e.errno == os.errno.ENOENT:
raise RuntimeError("Could not call swig, perhaps install swig.")
else:
raise
subprocess.call(["make swig"], shell=True)
swige = Extension("pyme._pygpgme", ["gpgme_wrap.c", "helpers.c"], swige = Extension("pyme._pygpgme", ["gpgme_wrap.c", "helpers.c"],
include_dirs = include_dirs, include_dirs = include_dirs,
define_macros = define_macros, define_macros = define_macros,
@ -99,15 +81,15 @@ swige = Extension("pyme._pygpgme", ["gpgme_wrap.c", "helpers.c"],
extra_link_args = libs) extra_link_args = libs)
setup(name = "pyme", setup(name = "pyme",
version = version.versionstr, version=pyme.version.versionstr,
description = version.description, description=pyme.version.description,
author = version.author, author=pyme.version.author,
author_email = version.author_email, author_email=pyme.version.author_email,
url = version.homepage, url=pyme.version.homepage,
ext_modules=[swige], ext_modules=[swige],
packages = ['pyme', 'pyme.constants', 'pyme.constants.data', packages = ['pyme', 'pyme.constants', 'pyme.constants.data',
'pyme.constants.keylist', 'pyme.constants.sig'], 'pyme.constants.keylist', 'pyme.constants.sig'],
license = version.copyright + \ license=pyme.version.copyright + \
", Licensed under the GPL version 2 and the LGPL version 2.1" ", Licensed under the GPL version 2 and the LGPL version 2.1"
) )

135
m4/ax_pkg_swig.m4 Normal file
View File

@ -0,0 +1,135 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_pkg_swig.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_PKG_SWIG([major.minor.micro], [action-if-found], [action-if-not-found])
#
# DESCRIPTION
#
# This macro searches for a SWIG installation on your system. If found,
# then SWIG is AC_SUBST'd; if not found, then $SWIG is empty. If SWIG is
# found, then SWIG_LIB is set to the SWIG library path, and AC_SUBST'd.
#
# You can use the optional first argument to check if the version of the
# available SWIG is greater than or equal to the value of the argument. It
# should have the format: N[.N[.N]] (N is a number between 0 and 999. Only
# the first N is mandatory.) If the version argument is given (e.g.
# 1.3.17), AX_PKG_SWIG checks that the swig package is this version number
# or higher.
#
# As usual, action-if-found is executed if SWIG is found, otherwise
# action-if-not-found is executed.
#
# In configure.in, use as:
#
# AX_PKG_SWIG(1.3.17, [], [ AC_MSG_ERROR([SWIG is required to build..]) ])
# AX_SWIG_ENABLE_CXX
# AX_SWIG_MULTI_MODULE_SUPPORT
# AX_SWIG_PYTHON
#
# LICENSE
#
# Copyright (c) 2008 Sebastian Huber <sebastian-huber@web.de>
# Copyright (c) 2008 Alan W. Irwin
# Copyright (c) 2008 Rafael Laboissiere <rafael@laboissiere.net>
# Copyright (c) 2008 Andrew Collier
# Copyright (c) 2011 Murray Cumming <murrayc@openismus.com>
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# As a special exception, the respective Autoconf Macro's copyright owner
# gives unlimited permission to copy, distribute and modify the configure
# scripts that are the output of Autoconf when processing the Macro. You
# need not follow the terms of the GNU General Public License when using
# or distributing such scripts, even though portions of the text of the
# Macro appear in them. The GNU General Public License (GPL) does govern
# all other use of the material that constitutes the Autoconf Macro.
#
# This special exception to the GPL applies to versions of the Autoconf
# Macro released by the Autoconf Archive. When you make and distribute a
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.
#serial 11
AC_DEFUN([AX_PKG_SWIG],[
# Ubuntu has swig 2.0 as /usr/bin/swig2.0
AC_PATH_PROGS([SWIG],[swig swig2.0])
if test -z "$SWIG" ; then
m4_ifval([$3],[$3],[:])
elif test -n "$1" ; then
AC_MSG_CHECKING([SWIG version])
[swig_version=`$SWIG -version 2>&1 | grep 'SWIG Version' | sed 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/g'`]
AC_MSG_RESULT([$swig_version])
if test -n "$swig_version" ; then
# Calculate the required version number components
[required=$1]
[required_major=`echo $required | sed 's/[^0-9].*//'`]
if test -z "$required_major" ; then
[required_major=0]
fi
[required=`echo $required | sed 's/[0-9]*[^0-9]//'`]
[required_minor=`echo $required | sed 's/[^0-9].*//'`]
if test -z "$required_minor" ; then
[required_minor=0]
fi
[required=`echo $required | sed 's/[0-9]*[^0-9]//'`]
[required_patch=`echo $required | sed 's/[^0-9].*//'`]
if test -z "$required_patch" ; then
[required_patch=0]
fi
# Calculate the available version number components
[available=$swig_version]
[available_major=`echo $available | sed 's/[^0-9].*//'`]
if test -z "$available_major" ; then
[available_major=0]
fi
[available=`echo $available | sed 's/[0-9]*[^0-9]//'`]
[available_minor=`echo $available | sed 's/[^0-9].*//'`]
if test -z "$available_minor" ; then
[available_minor=0]
fi
[available=`echo $available | sed 's/[0-9]*[^0-9]//'`]
[available_patch=`echo $available | sed 's/[^0-9].*//'`]
if test -z "$available_patch" ; then
[available_patch=0]
fi
# Convert the version tuple into a single number for easier comparison.
# Using base 100 should be safe since SWIG internally uses BCD values
# to encode its version number.
required_swig_vernum=`expr $required_major \* 10000 \
\+ $required_minor \* 100 \+ $required_patch`
available_swig_vernum=`expr $available_major \* 10000 \
\+ $available_minor \* 100 \+ $available_patch`
if test $available_swig_vernum -lt $required_swig_vernum; then
AC_MSG_WARN([SWIG version >= $1 is required. You have $swig_version.])
SWIG=''
m4_ifval([$3],[$3],[])
else
AC_MSG_CHECKING([for SWIG library])
SWIG_LIB=`$SWIG -swiglib`
AC_MSG_RESULT([$SWIG_LIB])
m4_ifval([$2],[$2],[])
fi
else
AC_MSG_WARN([cannot determine SWIG version])
SWIG=''
m4_ifval([$3],[$3],[])
fi
fi
AC_SUBST([SWIG_LIB])
])

64
m4/m4_ax_swig_python.m4 Normal file
View File

@ -0,0 +1,64 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_swig_python.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_SWIG_PYTHON([use-shadow-classes = {no, yes}])
#
# DESCRIPTION
#
# Checks for Python and provides the $(AX_SWIG_PYTHON_CPPFLAGS), and
# $(AX_SWIG_PYTHON_OPT) output variables.
#
# $(AX_SWIG_PYTHON_OPT) contains all necessary SWIG options to generate
# code for Python. Shadow classes are enabled unless the value of the
# optional first argument is exactly 'no'. If you need multi module
# support (provided by the AX_SWIG_MULTI_MODULE_SUPPORT macro) use
# $(AX_SWIG_PYTHON_LIBS) to link against the appropriate library. It
# contains the SWIG Python runtime library that is needed by the type
# check system for example.
#
# LICENSE
#
# Copyright (c) 2008 Sebastian Huber <sebastian-huber@web.de>
# Copyright (c) 2008 Alan W. Irwin
# Copyright (c) 2008 Rafael Laboissiere <rafael@laboissiere.net>
# Copyright (c) 2008 Andrew Collier
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# As a special exception, the respective Autoconf Macro's copyright owner
# gives unlimited permission to copy, distribute and modify the configure
# scripts that are the output of Autoconf when processing the Macro. You
# need not follow the terms of the GNU General Public License when using
# or distributing such scripts, even though portions of the text of the
# Macro appear in them. The GNU General Public License (GPL) does govern
# all other use of the material that constitutes the Autoconf Macro.
#
# This special exception to the GPL applies to versions of the Autoconf
# Macro released by the Autoconf Archive. When you make and distribute a
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.
#serial 10
AU_ALIAS([SWIG_PYTHON], [AX_SWIG_PYTHON])
AC_DEFUN([AX_SWIG_PYTHON],[
AC_REQUIRE([AX_PKG_SWIG])
AC_REQUIRE([AX_PYTHON_DEVEL])
test "x$1" != "xno" || swig_shadow=" -noproxy"
AC_SUBST([AX_SWIG_PYTHON_OPT],[-python$swig_shadow])
AC_SUBST([AX_SWIG_PYTHON_CPPFLAGS],[$PYTHON_CPPFLAGS])
])