From 67ebc53b0f7193dab53bb03e3536b0e81c78e2c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingo=20Kl=C3=B6cker?= Date: Thu, 6 Jun 2024 11:38:28 +0200 Subject: [PATCH] build,python: Support building Python bindings as nested package * autogen-all.sh (packages): Add lang/python. * configure.ac: Add python to available languages if subdir exists. Add python to nested languages if enabled to generate corresponding make targets. Call configure script of nested python package recursively. * lang/python/configure.ac: Check if Python bindings are built as nested package and set GPGME_CFLAGS and GPGME_LIBS accordingly. * lang/python/setup.py.in: Define some variables where they are used first. Extract library directories from GPGME_LIBS variable similar to the extraction of include directories from GPGME_CFLAGS. Adjust library locations in case of win32 the same way as the include locations. Prefer gpgme.h in the include directories from GPGME_CFLAGS over the one in the prefix, so that the correct gpgme.h is taken in case of nested builds. -- This re-adds the ability to build the Python bindings together with gpgme with a single `configure && make` command (if building from git). GnuPG-bug-id: 7110 --- autogen-all.sh | 2 +- configure.ac | 10 +++++++++- lang/python/configure.ac | 22 ++++++++++++++++++++-- lang/python/setup.py.in | 37 +++++++++++++++++++------------------ 4 files changed, 49 insertions(+), 22 deletions(-) diff --git a/autogen-all.sh b/autogen-all.sh index 88fb15f7..83af1f0b 100755 --- a/autogen-all.sh +++ b/autogen-all.sh @@ -15,7 +15,7 @@ prog=$(basename "$0") -packages=". lang/cpp lang/qt" +packages=". lang/cpp lang/qt lang/python" fatal () { echo "${prog}:" "$*" >&2 diff --git a/configure.ac b/configure.ac index 7ec79226..03324be3 100644 --- a/configure.ac +++ b/configure.ac @@ -238,7 +238,7 @@ have_macos_system=no build_w32_glib=no available_languages="cl" default_languages="cl" -for lang in cpp qt; do +for lang in cpp qt python; do if test -d $srcdir/lang/$lang; then available_languages="$available_languages $lang" fi @@ -364,6 +364,10 @@ LIST_MEMBER("qt", $enabled_languages) if test "$found" = "1"; then nested_languages="$nested_languages qt" fi +LIST_MEMBER("python", $enabled_languages) +if test "$found" = "1"; then + nested_languages="$nested_languages python" +fi AC_SUBST(NESTED_LANGUAGES, $nested_languages) @@ -851,6 +855,10 @@ LIST_MEMBER("qt", $enabled_languages) if test "$found" = "1"; then AC_CONFIG_SUBDIRS([lang/qt]) fi +LIST_MEMBER("python", $enabled_languages) +if test "$found" = "1"; then + AC_CONFIG_SUBDIRS([lang/python]) +fi AC_OUTPUT diff --git a/lang/python/configure.ac b/lang/python/configure.ac index 34033ed3..116d7d0b 100644 --- a/lang/python/configure.ac +++ b/lang/python/configure.ac @@ -409,8 +409,26 @@ AM_CONDITIONAL(USE_GPGRT_CONFIG, [test -n "$GPGRT_CONFIG" \ # And for gpgme. have_gpgme=no -AM_PATH_GPGME("$NEED_GPGME_VERSION", - have_gpgme=yes, have_gpgme=no) +builddir=`pwd` +# Check if Python bindings are built as nested package of gpgme +if test "${srcdir%/lang/python}/lang/python" == "$srcdir" -a \ + "${builddir%/lang/python}/lang/python" == "$builddir"; then + AC_MSG_CHECKING(for GpgME - assuming nested build) + gpgme_build_dir=${builddir%/lang/python} + if test -f "$gpgme_build_dir/src/gpgme.h"; then + GPGME_CFLAGS="-I$gpgme_build_dir/src" + GPGME_LIBS="-L$gpgme_build_dir/src/.libs -lgpgme" + have_gpgme=yes + AC_MSG_RESULT(yes) + else + AC_MSG_RESULT(no) + fi +fi + +if test "$have_gpgme" = "no"; then + AM_PATH_GPGME("$NEED_GPGME_VERSION", + have_gpgme=yes, have_gpgme=no) +fi # diff --git a/lang/python/setup.py.in b/lang/python/setup.py.in index fe20b0ef..3d44341d 100755 --- a/lang/python/setup.py.in +++ b/lang/python/setup.py.in @@ -33,10 +33,6 @@ import shutil import subprocess import sys -# Out-of-tree build of the gpg bindings. -gpgme_h = '' -include_dirs = [os.getcwd()] -library_dirs = [] if hasattr(subprocess, 'DEVNULL'): devnull = subprocess.DEVNULL @@ -52,12 +48,17 @@ major, minor, patch = map(int, version.split('.')) if not (major > 1 or (major == 1 and minor >= 7)): sys.exit('Need at least GPGME version 1.7, found {}.'.format(version_raw)) -define_macros = [] +library_dirs = [] +libs = [] if '@GPGME_LIBS@': - libs = '@GPGME_LIBS@'.split(' ') -else: - libs = [] + for item in '@GPGME_LIBS@'.split(' '): + if item.startswith('-L'): + library_dirs.append(item[2:]) + else: + libs.append(item) +include_dirs = [os.getcwd()] +define_macros = [] if '@GPGME_CFLAGS@': for item in '@GPGME_CFLAGS@'.split(' '): if item.startswith('-I'): @@ -87,23 +88,23 @@ if uname_s.startswith('MINGW32'): extra_dirs.append(os.path.join(tgt, item)) break include_dirs += extra_dirs - for item in [x[2:] for x in libs if x.startswith('-L')]: + extra_dirs = [] + for item in library_dirs: for ln, mnt, tgt in tmplist: if item.startswith(mnt): item = os.path.normpath(item[ln:]) while item[0] == os.path.sep: item = item[1:] - library_dirs.append(os.path.join(tgt, item)) + extra_dirs.append(os.path.join(tgt, item)) break + library_dirs += extra_dirs -if not gpgme_h: - if os.path.exists(os.path.join('@prefix@', 'include', 'gpgme.h')): - gpgme_h = os.path.join('@prefix@', 'include', 'gpgme.h') - else: - for include_dir in (include_dirs or ['/usr/include']): - if os.path.exists(os.path.join(include_dir, 'gpgme.h')): - gpgme_h = os.path.join(include_dir, 'gpgme.h') - break +gpgme_h = None +for include_dir in (include_dirs + + [os.path.join('@prefix@', 'include'), '/usr/include']): + if os.path.exists(os.path.join(include_dir, 'gpgme.h')): + gpgme_h = os.path.join(include_dir, 'gpgme.h') + break if not gpgme_h: sys.exit('gpgme.h not found.')