Skip to content

Commit 9cf5646

Browse files
authored
bpo-45847: Port _gdbm to PY_STDLIB_MOD (GH-29720)
1 parent b9e9292 commit 9cf5646

File tree

5 files changed

+136
-52
lines changed

5 files changed

+136
-52
lines changed

Modules/Setup.stdlib.in

+5
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@
6666
@MODULE__LZMA_TRUE@_lzma _lzmamodule.c
6767
@MODULE_ZLIB_TRUE@zlib zlibmodule.c
6868

69+
# dbm/gdbm
70+
# dbm needs either libndbm, libgdbm_compat, or libdb 5.x
71+
# gdbm module needs -lgdbm
72+
@MODULE__GDBM_TRUE@_gdbm _gdbmmodule.c
73+
6974
# hashing builtins, can be disabled with --without-builtin-hashlib-hashes
7075
@MODULE__MD5_TRUE@_md5 md5module.c
7176
@MODULE__SHA1_TRUE@_sha1 sha1module.c

configure

+97-22
Original file line numberDiff line numberDiff line change
@@ -658,6 +658,8 @@ MODULE__SQLITE3_FALSE
658658
MODULE__SQLITE3_TRUE
659659
MODULE_NIS_FALSE
660660
MODULE_NIS_TRUE
661+
MODULE__GDBM_FALSE
662+
MODULE__GDBM_TRUE
661663
MODULE__DECIMAL_FALSE
662664
MODULE__DECIMAL_TRUE
663665
MODULE__CRYPT_FALSE
@@ -807,6 +809,8 @@ DTRACE_OBJS
807809
DTRACE_HEADERS
808810
DFLAGS
809811
DTRACE
812+
GDBM_LIBS
813+
GDBM_CFLAGS
810814
TCLTK_LIBS
811815
TCLTK_INCLUDES
812816
LIBSQLITE3_LIBS
@@ -1044,6 +1048,8 @@ LIBNSL_CFLAGS
10441048
LIBNSL_LIBS
10451049
LIBSQLITE3_CFLAGS
10461050
LIBSQLITE3_LIBS
1051+
GDBM_CFLAGS
1052+
GDBM_LIBS
10471053
ZLIB_CFLAGS
10481054
ZLIB_LIBS
10491055
BZIP2_CFLAGS
@@ -1832,6 +1838,8 @@ Some influential environment variables:
18321838
C compiler flags for LIBSQLITE3, overriding pkg-config
18331839
LIBSQLITE3_LIBS
18341840
linker flags for LIBSQLITE3, overriding pkg-config
1841+
GDBM_CFLAGS C compiler flags for gdbm
1842+
GDBM_LIBS additional linker flags for gdbm
18351843
ZLIB_CFLAGS C compiler flags for ZLIB, overriding pkg-config
18361844
ZLIB_LIBS linker flags for ZLIB, overriding pkg-config
18371845
BZIP2_CFLAGS
@@ -11668,17 +11676,25 @@ else
1166811676
TCLTK_LIBS="$with_tcltk_libs"
1166911677
fi
1167011678

11671-
# check for _gdbmmodulec dependencies
11672-
for ac_header in gdbm.h
11679+
11680+
11681+
save_CFLAGS=$CFLAGS
11682+
save_CPPFLAGS=$CPPFLAGS
11683+
save_LDFLAGS=$LDFLAGS
11684+
save_LIBS=$LIBS
11685+
11686+
11687+
CPPFLAGS="$GDBM_CFLAGS $CFLAGS"
11688+
LDFLAGS="$GDBM_LIBS $LDFLAGS"
11689+
for ac_header in gdbm.h
1167311690
do :
1167411691
ac_fn_c_check_header_mongrel "$LINENO" "gdbm.h" "ac_cv_header_gdbm_h" "$ac_includes_default"
1167511692
if test "x$ac_cv_header_gdbm_h" = xyes; then :
1167611693
cat >>confdefs.h <<_ACEOF
1167711694
#define HAVE_GDBM_H 1
1167811695
_ACEOF
1167911696

11680-
LIBS_SAVE=$LIBS
11681-
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdbm_open in -lgdbm" >&5
11697+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdbm_open in -lgdbm" >&5
1168211698
$as_echo_n "checking for gdbm_open in -lgdbm... " >&6; }
1168311699
if ${ac_cv_lib_gdbm_gdbm_open+:} false; then :
1168411700
$as_echo_n "(cached) " >&6
@@ -11715,21 +11731,29 @@ fi
1171511731
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gdbm_gdbm_open" >&5
1171611732
$as_echo "$ac_cv_lib_gdbm_gdbm_open" >&6; }
1171711733
if test "x$ac_cv_lib_gdbm_gdbm_open" = xyes; then :
11718-
cat >>confdefs.h <<_ACEOF
11719-
#define HAVE_LIBGDBM 1
11720-
_ACEOF
1172111734

11722-
LIBS="-lgdbm $LIBS"
11735+
have_gdbm=yes
11736+
GDBM_LIBS="$GDBM_LIBS -lgdbm"
1172311737

11738+
else
11739+
have_gdbm=no
1172411740
fi
1172511741

11726-
LIBS=$LIBS_SAVE
1172711742

11743+
else
11744+
have_gdbm=no
1172811745
fi
1172911746

1173011747
done
1173111748

1173211749

11750+
CFLAGS=$save_CFLAGS
11751+
CPPFLAGS=$save_CPPFLAGS
11752+
LDFLAGS=$save_LDFLAGS
11753+
LIBS=$save_LIBS
11754+
11755+
11756+
1173311757
# check for _dbmmodule.c dependencies
1173411758
for ac_header in ndbm.h
1173511759
do :
@@ -12009,22 +12033,33 @@ $as_echo_n "checking for --with-dbmliborder... " >&6; }
1200912033
# Check whether --with-dbmliborder was given.
1201012034
if test "${with_dbmliborder+set}" = set; then :
1201112035
withval=$with_dbmliborder;
12012-
if test x$with_dbmliborder = xyes
12013-
then
12014-
as_fn_error $? "proper usage is --with-dbmliborder=db1:db2:..." "$LINENO" 5
1201512036
else
12016-
as_save_IFS=$IFS
12017-
IFS=:
12018-
for db in $with_dbmliborder; do
12019-
if test x$db != xndbm && test x$db != xgdbm && test x$db != xbdb
12020-
then
12021-
as_fn_error $? "proper usage is --with-dbmliborder=db1:db2:..." "$LINENO" 5
12022-
fi
12023-
done
12024-
IFS=$as_save_IFS
12025-
fi
12037+
with_dbmliborder=ndbm:gdbm:bdb
1202612038
fi
1202712039

12040+
12041+
have_gdbm_dbmliborder=no
12042+
as_save_IFS=$IFS
12043+
IFS=:
12044+
for db in $with_dbmliborder; do
12045+
case $db in #(
12046+
ndbm) :
12047+
;; #(
12048+
gdbm) :
12049+
have_gdbm_dbmliborder=yes ;; #(
12050+
bdb) :
12051+
;; #(
12052+
*) :
12053+
with_dbmliborder=error
12054+
;;
12055+
esac
12056+
done
12057+
IFS=$as_save_IFS
12058+
if test "x$with_dbmliborder" = xerror; then :
12059+
12060+
as_fn_error $? "proper usage is --with-dbmliborder=db1:db2:... (ndbm:gdbm:bdb)" "$LINENO" 5
12061+
12062+
fi
1202812063
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_dbmliborder" >&5
1202912064
$as_echo "$with_dbmliborder" >&6; }
1203012065

@@ -21725,6 +21760,42 @@ fi
2172521760
$as_echo "$py_cv_module__decimal" >&6; }
2172621761

2172721762

21763+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _gdbm" >&5
21764+
$as_echo_n "checking for stdlib extension module _gdbm... " >&6; }
21765+
case $py_stdlib_not_available in #(
21766+
*_gdbm*) :
21767+
py_cv_module__gdbm=n/a ;; #(
21768+
*) :
21769+
if test "$have_gdbm_dbmliborder" = yes; then :
21770+
if test "$have_gdbm" = yes; then :
21771+
py_cv_module__gdbm=yes
21772+
else
21773+
py_cv_module__gdbm=missing
21774+
fi
21775+
else
21776+
py_cv_module__gdbm=disabled
21777+
fi
21778+
;;
21779+
esac
21780+
as_fn_append MODULE_BLOCK "MODULE__GDBM=$py_cv_module__gdbm$as_nl"
21781+
if test "x$py_cv_module__gdbm" = xyes; then :
21782+
21783+
as_fn_append MODULE_BLOCK "MODULE__GDBM_CFLAGS=$GDBM_CFLAGS$as_nl"
21784+
as_fn_append MODULE_BLOCK "MODULE__GDBM_LDFLAGS=$GDBM_LIBS$as_nl"
21785+
21786+
fi
21787+
if test "$py_cv_module__gdbm" = yes; then
21788+
MODULE__GDBM_TRUE=
21789+
MODULE__GDBM_FALSE='#'
21790+
else
21791+
MODULE__GDBM_TRUE='#'
21792+
MODULE__GDBM_FALSE=
21793+
fi
21794+
21795+
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__gdbm" >&5
21796+
$as_echo "$py_cv_module__gdbm" >&6; }
21797+
21798+
2172821799
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module nis" >&5
2172921800
$as_echo_n "checking for stdlib extension module nis... " >&6; }
2173021801
case $py_stdlib_not_available in #(
@@ -22650,6 +22721,10 @@ if test -z "${MODULE__DECIMAL_TRUE}" && test -z "${MODULE__DECIMAL_FALSE}"; then
2265022721
as_fn_error $? "conditional \"MODULE__DECIMAL\" was never defined.
2265122722
Usually this means the macro was only invoked conditionally." "$LINENO" 5
2265222723
fi
22724+
if test -z "${MODULE__GDBM_TRUE}" && test -z "${MODULE__GDBM_FALSE}"; then
22725+
as_fn_error $? "conditional \"MODULE__GDBM\" was never defined.
22726+
Usually this means the macro was only invoked conditionally." "$LINENO" 5
22727+
fi
2265322728
if test -z "${MODULE_NIS_TRUE}" && test -z "${MODULE_NIS_FALSE}"; then
2265422729
as_fn_error $? "conditional \"MODULE_NIS\" was never defined.
2265522730
Usually this means the macro was only invoked conditionally." "$LINENO" 5

configure.ac

+33-20
Original file line numberDiff line numberDiff line change
@@ -3303,11 +3303,19 @@ else
33033303
TCLTK_LIBS="$with_tcltk_libs"
33043304
fi
33053305

3306-
# check for _gdbmmodulec dependencies
3307-
AC_CHECK_HEADERS([gdbm.h], [
3308-
LIBS_SAVE=$LIBS
3309-
AC_CHECK_LIB([gdbm], [gdbm_open])
3310-
LIBS=$LIBS_SAVE
3306+
dnl check for _gdbmmodule dependencies
3307+
dnl NOTE: gdbm does not provide a pkgconf file.
3308+
AC_ARG_VAR([GDBM_CFLAGS], [C compiler flags for gdbm])
3309+
AC_ARG_VAR([GDBM_LIBS], [additional linker flags for gdbm])
3310+
WITH_SAVE_ENV([
3311+
CPPFLAGS="$GDBM_CFLAGS $CFLAGS"
3312+
LDFLAGS="$GDBM_LIBS $LDFLAGS"
3313+
AC_CHECK_HEADERS([gdbm.h], [
3314+
AC_CHECK_LIB([gdbm], [gdbm_open], [
3315+
have_gdbm=yes
3316+
GDBM_LIBS="$GDBM_LIBS -lgdbm"
3317+
], [have_gdbm=no])
3318+
], [have_gdbm=no])
33113319
])
33123320

33133321
# check for _dbmmodule.c dependencies
@@ -3375,21 +3383,23 @@ AC_CHECK_HEADERS([db.h], [
33753383
AC_MSG_CHECKING(for --with-dbmliborder)
33763384
AC_ARG_WITH(dbmliborder,
33773385
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'.]),
3378-
[
3379-
if test x$with_dbmliborder = xyes
3380-
then
3381-
AC_MSG_ERROR([proper usage is --with-dbmliborder=db1:db2:...])
3382-
else
3383-
as_save_IFS=$IFS
3384-
IFS=:
3385-
for db in $with_dbmliborder; do
3386-
if test x$db != xndbm && test x$db != xgdbm && test x$db != xbdb
3387-
then
3388-
AC_MSG_ERROR([proper usage is --with-dbmliborder=db1:db2:...])
3389-
fi
3390-
done
3391-
IFS=$as_save_IFS
3392-
fi])
3386+
[], [with_dbmliborder=ndbm:gdbm:bdb])
3387+
3388+
have_gdbm_dbmliborder=no
3389+
as_save_IFS=$IFS
3390+
IFS=:
3391+
for db in $with_dbmliborder; do
3392+
AS_CASE([$db],
3393+
[ndbm], [],
3394+
[gdbm], [have_gdbm_dbmliborder=yes],
3395+
[bdb], [],
3396+
[with_dbmliborder=error]
3397+
)
3398+
done
3399+
IFS=$as_save_IFS
3400+
AS_VAR_IF([with_dbmliborder], [error], [
3401+
AC_MSG_ERROR([proper usage is --with-dbmliborder=db1:db2:... (ndbm:gdbm:bdb)])
3402+
])
33933403
AC_MSG_RESULT($with_dbmliborder)
33943404

33953405
# Templates for things AC_DEFINEd more than once.
@@ -6279,6 +6289,9 @@ PY_STDLIB_MOD([_crypt],
62796289
[], [test "$ac_cv_crypt_crypt" = yes],
62806290
[$LIBCRYPT_CFLAGS], [$LIBCRYPT_LIBS])
62816291
PY_STDLIB_MOD([_decimal], [], [], [$LIBMPDEC_CFLAGS], [$LIBMPDEC_LDFLAGS])
6292+
PY_STDLIB_MOD([_gdbm],
6293+
[test "$have_gdbm_dbmliborder" = yes], [test "$have_gdbm" = yes],
6294+
[$GDBM_CFLAGS], [$GDBM_LIBS])
62826295
PY_STDLIB_MOD([nis],
62836296
[], [test "$have_nis" = yes -a "$ac_cv_header_rpc_rpc_h" = yes],
62846297
[$LIBNSL_CFLAGS], [$LIBNSL_LIBS])

pyconfig.h.in

-3
Original file line numberDiff line numberDiff line change
@@ -604,9 +604,6 @@
604604
/* Define to 1 if you have the `dld' library (-ldld). */
605605
#undef HAVE_LIBDLD
606606

607-
/* Define to 1 if you have the `gdbm' library (-lgdbm). */
608-
#undef HAVE_LIBGDBM
609-
610607
/* Define to 1 if you have the `gdbm_compat' library (-lgdbm_compat). */
611608
#undef HAVE_LIBGDBM_COMPAT
612609

setup.py

+1-7
Original file line numberDiff line numberDiff line change
@@ -1256,11 +1256,9 @@ def detect_dbm_gdbm(self):
12561256

12571257
# libdb, gdbm and ndbm headers and libraries
12581258
have_ndbm_h = sysconfig.get_config_var("HAVE_NDBM_H")
1259-
have_gdbm_h = sysconfig.get_config_var("HAVE_GDBM_H")
12601259
have_gdbm_ndbm_h = sysconfig.get_config_var("HAVE_GDBM_NDBM_H")
12611260
have_gdbm_dash_ndbm_h = sysconfig.get_config_var("HAVE_GDBM_DASH_NDBM_H")
12621261
have_libndbm = sysconfig.get_config_var("HAVE_LIBNDBM")
1263-
have_libgdbm = sysconfig.get_config_var("HAVE_LIBGDBM")
12641262
have_libgdbm_compat = sysconfig.get_config_var("HAVE_LIBGDBM_COMPAT")
12651263
have_libdb = sysconfig.get_config_var("HAVE_LIBDB")
12661264

@@ -1318,11 +1316,7 @@ def detect_dbm_gdbm(self):
13181316
self.missing.append('_dbm')
13191317

13201318
# Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
1321-
if 'gdbm' in dbm_order and have_libgdbm:
1322-
self.add(Extension('_gdbm', ['_gdbmmodule.c'],
1323-
libraries=['gdbm']))
1324-
else:
1325-
self.missing.append('_gdbm')
1319+
self.addext(Extension('_gdbm', ['_gdbmmodule.c']))
13261320

13271321
def detect_sqlite(self):
13281322
sources = [

0 commit comments

Comments
 (0)