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:
parent
11392a80d9
commit
a29babd07c
31
configure.ac
31
configure.ac
@ -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
53
lang/python/Makefile.am
Normal 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
|
@ -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
135
m4/ax_pkg_swig.m4
Normal 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
64
m4/m4_ax_swig_python.m4
Normal 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])
|
||||||
|
])
|
Loading…
Reference in New Issue
Block a user