From 9cf5646bb465b7d3d68bfe6d4711feb43d565051 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Tue, 23 Nov 2021 23:58:38 +0200 Subject: [PATCH] bpo-45847: Port _gdbm to PY_STDLIB_MOD (GH-29720) --- Modules/Setup.stdlib.in | 5 ++ configure | 119 ++++++++++++++++++++++++++++++++-------- configure.ac | 53 +++++++++++------- pyconfig.h.in | 3 - setup.py | 8 +-- 5 files changed, 136 insertions(+), 52 deletions(-) diff --git a/Modules/Setup.stdlib.in b/Modules/Setup.stdlib.in index 9f66d531fef..9de0096c067 100644 --- a/Modules/Setup.stdlib.in +++ b/Modules/Setup.stdlib.in @@ -66,6 +66,11 @@ @MODULE__LZMA_TRUE@_lzma _lzmamodule.c @MODULE_ZLIB_TRUE@zlib zlibmodule.c +# dbm/gdbm +# dbm needs either libndbm, libgdbm_compat, or libdb 5.x +# gdbm module needs -lgdbm +@MODULE__GDBM_TRUE@_gdbm _gdbmmodule.c + # hashing builtins, can be disabled with --without-builtin-hashlib-hashes @MODULE__MD5_TRUE@_md5 md5module.c @MODULE__SHA1_TRUE@_sha1 sha1module.c diff --git a/configure b/configure index ac0a1f320b2..630102585e8 100755 --- a/configure +++ b/configure @@ -658,6 +658,8 @@ MODULE__SQLITE3_FALSE MODULE__SQLITE3_TRUE MODULE_NIS_FALSE MODULE_NIS_TRUE +MODULE__GDBM_FALSE +MODULE__GDBM_TRUE MODULE__DECIMAL_FALSE MODULE__DECIMAL_TRUE MODULE__CRYPT_FALSE @@ -807,6 +809,8 @@ DTRACE_OBJS DTRACE_HEADERS DFLAGS DTRACE +GDBM_LIBS +GDBM_CFLAGS TCLTK_LIBS TCLTK_INCLUDES LIBSQLITE3_LIBS @@ -1044,6 +1048,8 @@ LIBNSL_CFLAGS LIBNSL_LIBS LIBSQLITE3_CFLAGS LIBSQLITE3_LIBS +GDBM_CFLAGS +GDBM_LIBS ZLIB_CFLAGS ZLIB_LIBS BZIP2_CFLAGS @@ -1832,6 +1838,8 @@ Some influential environment variables: C compiler flags for LIBSQLITE3, overriding pkg-config LIBSQLITE3_LIBS linker flags for LIBSQLITE3, overriding pkg-config + GDBM_CFLAGS C compiler flags for gdbm + GDBM_LIBS additional linker flags for gdbm ZLIB_CFLAGS C compiler flags for ZLIB, overriding pkg-config ZLIB_LIBS linker flags for ZLIB, overriding pkg-config BZIP2_CFLAGS @@ -11668,8 +11676,17 @@ else TCLTK_LIBS="$with_tcltk_libs" fi -# check for _gdbmmodulec dependencies -for ac_header in gdbm.h + + +save_CFLAGS=$CFLAGS +save_CPPFLAGS=$CPPFLAGS +save_LDFLAGS=$LDFLAGS +save_LIBS=$LIBS + + + CPPFLAGS="$GDBM_CFLAGS $CFLAGS" + LDFLAGS="$GDBM_LIBS $LDFLAGS" + for ac_header in gdbm.h do : ac_fn_c_check_header_mongrel "$LINENO" "gdbm.h" "ac_cv_header_gdbm_h" "$ac_includes_default" if test "x$ac_cv_header_gdbm_h" = xyes; then : @@ -11677,8 +11694,7 @@ if test "x$ac_cv_header_gdbm_h" = xyes; then : #define HAVE_GDBM_H 1 _ACEOF - LIBS_SAVE=$LIBS - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdbm_open in -lgdbm" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdbm_open in -lgdbm" >&5 $as_echo_n "checking for gdbm_open in -lgdbm... " >&6; } if ${ac_cv_lib_gdbm_gdbm_open+:} false; then : $as_echo_n "(cached) " >&6 @@ -11715,21 +11731,29 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gdbm_gdbm_open" >&5 $as_echo "$ac_cv_lib_gdbm_gdbm_open" >&6; } if test "x$ac_cv_lib_gdbm_gdbm_open" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBGDBM 1 -_ACEOF - LIBS="-lgdbm $LIBS" + have_gdbm=yes + GDBM_LIBS="$GDBM_LIBS -lgdbm" +else + have_gdbm=no fi - LIBS=$LIBS_SAVE +else + have_gdbm=no fi done +CFLAGS=$save_CFLAGS +CPPFLAGS=$save_CPPFLAGS +LDFLAGS=$save_LDFLAGS +LIBS=$save_LIBS + + + # check for _dbmmodule.c dependencies for ac_header in ndbm.h do : @@ -12009,22 +12033,33 @@ $as_echo_n "checking for --with-dbmliborder... " >&6; } # Check whether --with-dbmliborder was given. if test "${with_dbmliborder+set}" = set; then : withval=$with_dbmliborder; -if test x$with_dbmliborder = xyes -then -as_fn_error $? "proper usage is --with-dbmliborder=db1:db2:..." "$LINENO" 5 else - as_save_IFS=$IFS - IFS=: - for db in $with_dbmliborder; do - if test x$db != xndbm && test x$db != xgdbm && test x$db != xbdb - then - as_fn_error $? "proper usage is --with-dbmliborder=db1:db2:..." "$LINENO" 5 - fi - done - IFS=$as_save_IFS -fi + with_dbmliborder=ndbm:gdbm:bdb fi + +have_gdbm_dbmliborder=no +as_save_IFS=$IFS +IFS=: +for db in $with_dbmliborder; do + case $db in #( + ndbm) : + ;; #( + gdbm) : + have_gdbm_dbmliborder=yes ;; #( + bdb) : + ;; #( + *) : + with_dbmliborder=error + ;; +esac +done +IFS=$as_save_IFS +if test "x$with_dbmliborder" = xerror; then : + + as_fn_error $? "proper usage is --with-dbmliborder=db1:db2:... (ndbm:gdbm:bdb)" "$LINENO" 5 + +fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_dbmliborder" >&5 $as_echo "$with_dbmliborder" >&6; } @@ -21725,6 +21760,42 @@ fi $as_echo "$py_cv_module__decimal" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _gdbm" >&5 +$as_echo_n "checking for stdlib extension module _gdbm... " >&6; } + case $py_stdlib_not_available in #( + *_gdbm*) : + py_cv_module__gdbm=n/a ;; #( + *) : + if test "$have_gdbm_dbmliborder" = yes; then : + if test "$have_gdbm" = yes; then : + py_cv_module__gdbm=yes +else + py_cv_module__gdbm=missing +fi +else + py_cv_module__gdbm=disabled +fi + ;; +esac + as_fn_append MODULE_BLOCK "MODULE__GDBM=$py_cv_module__gdbm$as_nl" + if test "x$py_cv_module__gdbm" = xyes; then : + + as_fn_append MODULE_BLOCK "MODULE__GDBM_CFLAGS=$GDBM_CFLAGS$as_nl" + as_fn_append MODULE_BLOCK "MODULE__GDBM_LDFLAGS=$GDBM_LIBS$as_nl" + +fi + if test "$py_cv_module__gdbm" = yes; then + MODULE__GDBM_TRUE= + MODULE__GDBM_FALSE='#' +else + MODULE__GDBM_TRUE='#' + MODULE__GDBM_FALSE= +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__gdbm" >&5 +$as_echo "$py_cv_module__gdbm" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module nis" >&5 $as_echo_n "checking for stdlib extension module nis... " >&6; } case $py_stdlib_not_available in #( @@ -22650,6 +22721,10 @@ if test -z "${MODULE__DECIMAL_TRUE}" && test -z "${MODULE__DECIMAL_FALSE}"; then as_fn_error $? "conditional \"MODULE__DECIMAL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${MODULE__GDBM_TRUE}" && test -z "${MODULE__GDBM_FALSE}"; then + as_fn_error $? "conditional \"MODULE__GDBM\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${MODULE_NIS_TRUE}" && test -z "${MODULE_NIS_FALSE}"; then as_fn_error $? "conditional \"MODULE_NIS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 diff --git a/configure.ac b/configure.ac index 92afdf39fef..34a2c694ddf 100644 --- a/configure.ac +++ b/configure.ac @@ -3303,11 +3303,19 @@ else TCLTK_LIBS="$with_tcltk_libs" fi -# check for _gdbmmodulec dependencies -AC_CHECK_HEADERS([gdbm.h], [ - LIBS_SAVE=$LIBS - AC_CHECK_LIB([gdbm], [gdbm_open]) - LIBS=$LIBS_SAVE +dnl check for _gdbmmodule dependencies +dnl NOTE: gdbm does not provide a pkgconf file. +AC_ARG_VAR([GDBM_CFLAGS], [C compiler flags for gdbm]) +AC_ARG_VAR([GDBM_LIBS], [additional linker flags for gdbm]) +WITH_SAVE_ENV([ + CPPFLAGS="$GDBM_CFLAGS $CFLAGS" + LDFLAGS="$GDBM_LIBS $LDFLAGS" + AC_CHECK_HEADERS([gdbm.h], [ + AC_CHECK_LIB([gdbm], [gdbm_open], [ + have_gdbm=yes + GDBM_LIBS="$GDBM_LIBS -lgdbm" + ], [have_gdbm=no]) + ], [have_gdbm=no]) ]) # check for _dbmmodule.c dependencies @@ -3375,21 +3383,23 @@ AC_CHECK_HEADERS([db.h], [ AC_MSG_CHECKING(for --with-dbmliborder) AC_ARG_WITH(dbmliborder, AS_HELP_STRING([--with-dbmliborder=db1:db2:...], [override order to check db backends for dbm; a valid value is a colon separated string with the backend names `ndbm', `gdbm' and `bdb'.]), -[ -if test x$with_dbmliborder = xyes -then -AC_MSG_ERROR([proper usage is --with-dbmliborder=db1:db2:...]) -else - as_save_IFS=$IFS - IFS=: - for db in $with_dbmliborder; do - if test x$db != xndbm && test x$db != xgdbm && test x$db != xbdb - then - AC_MSG_ERROR([proper usage is --with-dbmliborder=db1:db2:...]) - fi - done - IFS=$as_save_IFS -fi]) +[], [with_dbmliborder=ndbm:gdbm:bdb]) + +have_gdbm_dbmliborder=no +as_save_IFS=$IFS +IFS=: +for db in $with_dbmliborder; do + AS_CASE([$db], + [ndbm], [], + [gdbm], [have_gdbm_dbmliborder=yes], + [bdb], [], + [with_dbmliborder=error] + ) +done +IFS=$as_save_IFS +AS_VAR_IF([with_dbmliborder], [error], [ + AC_MSG_ERROR([proper usage is --with-dbmliborder=db1:db2:... (ndbm:gdbm:bdb)]) +]) AC_MSG_RESULT($with_dbmliborder) # Templates for things AC_DEFINEd more than once. @@ -6279,6 +6289,9 @@ PY_STDLIB_MOD([_crypt], [], [test "$ac_cv_crypt_crypt" = yes], [$LIBCRYPT_CFLAGS], [$LIBCRYPT_LIBS]) PY_STDLIB_MOD([_decimal], [], [], [$LIBMPDEC_CFLAGS], [$LIBMPDEC_LDFLAGS]) +PY_STDLIB_MOD([_gdbm], + [test "$have_gdbm_dbmliborder" = yes], [test "$have_gdbm" = yes], + [$GDBM_CFLAGS], [$GDBM_LIBS]) PY_STDLIB_MOD([nis], [], [test "$have_nis" = yes -a "$ac_cv_header_rpc_rpc_h" = yes], [$LIBNSL_CFLAGS], [$LIBNSL_LIBS]) diff --git a/pyconfig.h.in b/pyconfig.h.in index c9c58656f58..bb9ae4c3dbc 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -604,9 +604,6 @@ /* Define to 1 if you have the `dld' library (-ldld). */ #undef HAVE_LIBDLD -/* Define to 1 if you have the `gdbm' library (-lgdbm). */ -#undef HAVE_LIBGDBM - /* Define to 1 if you have the `gdbm_compat' library (-lgdbm_compat). */ #undef HAVE_LIBGDBM_COMPAT diff --git a/setup.py b/setup.py index 7972bac46c1..98a20150c1e 100644 --- a/setup.py +++ b/setup.py @@ -1256,11 +1256,9 @@ class PyBuildExt(build_ext): # libdb, gdbm and ndbm headers and libraries have_ndbm_h = sysconfig.get_config_var("HAVE_NDBM_H") - have_gdbm_h = sysconfig.get_config_var("HAVE_GDBM_H") have_gdbm_ndbm_h = sysconfig.get_config_var("HAVE_GDBM_NDBM_H") have_gdbm_dash_ndbm_h = sysconfig.get_config_var("HAVE_GDBM_DASH_NDBM_H") have_libndbm = sysconfig.get_config_var("HAVE_LIBNDBM") - have_libgdbm = sysconfig.get_config_var("HAVE_LIBGDBM") have_libgdbm_compat = sysconfig.get_config_var("HAVE_LIBGDBM_COMPAT") have_libdb = sysconfig.get_config_var("HAVE_LIBDB") @@ -1318,11 +1316,7 @@ class PyBuildExt(build_ext): self.missing.append('_dbm') # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm: - if 'gdbm' in dbm_order and have_libgdbm: - self.add(Extension('_gdbm', ['_gdbmmodule.c'], - libraries=['gdbm'])) - else: - self.missing.append('_gdbm') + self.addext(Extension('_gdbm', ['_gdbmmodule.c'])) def detect_sqlite(self): sources = [