Skip to content

Commit f34b482

Browse files
author
Erlend E. Aasland
committed
bpo-45774: Autoconfiscate SQLite detection
1 parent bcc4e46 commit f34b482

File tree

4 files changed

+170
-103
lines changed

4 files changed

+170
-103
lines changed

configure

+126-1
Original file line numberDiff line numberDiff line change
@@ -10762,12 +10762,137 @@ fi
1076210762
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_decimal_contextvar" >&5
1076310763
$as_echo "$with_decimal_contextvar" >&6; }
1076410764

10765+
for ac_header in sqlite3.h
10766+
do :
10767+
ac_fn_c_check_header_mongrel "$LINENO" "sqlite3.h" "ac_cv_header_sqlite3_h" "$ac_includes_default"
10768+
if test "x$ac_cv_header_sqlite3_h" = xyes; then :
10769+
cat >>confdefs.h <<_ACEOF
10770+
#define HAVE_SQLITE3_H 1
10771+
_ACEOF
10772+
10773+
save_LIBS=$LIBS
10774+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqlite3_open_v2 in -lsqlite3" >&5
10775+
$as_echo_n "checking for sqlite3_open_v2 in -lsqlite3... " >&6; }
10776+
if ${ac_cv_lib_sqlite3_sqlite3_open_v2+:} false; then :
10777+
$as_echo_n "(cached) " >&6
10778+
else
10779+
ac_check_lib_save_LIBS=$LIBS
10780+
LIBS="-lsqlite3 $LIBS"
10781+
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
10782+
/* end confdefs.h. */
10783+
10784+
/* Override any GCC internal prototype to avoid an error.
10785+
Use char because int might match the return type of a GCC
10786+
builtin and then its argument prototype would still apply. */
10787+
#ifdef __cplusplus
10788+
extern "C"
10789+
#endif
10790+
char sqlite3_open_v2 ();
10791+
int
10792+
main ()
10793+
{
10794+
return sqlite3_open_v2 ();
10795+
;
10796+
return 0;
10797+
}
10798+
_ACEOF
10799+
if ac_fn_c_try_link "$LINENO"; then :
10800+
ac_cv_lib_sqlite3_sqlite3_open_v2=yes
10801+
else
10802+
ac_cv_lib_sqlite3_sqlite3_open_v2=no
10803+
fi
10804+
rm -f core conftest.err conftest.$ac_objext \
10805+
conftest$ac_exeext conftest.$ac_ext
10806+
LIBS=$ac_check_lib_save_LIBS
10807+
fi
10808+
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite3_sqlite3_open_v2" >&5
10809+
$as_echo "$ac_cv_lib_sqlite3_sqlite3_open_v2" >&6; }
10810+
if test "x$ac_cv_lib_sqlite3_sqlite3_open_v2" = xyes; then :
10811+
10812+
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
10813+
/* end confdefs.h. */
10814+
10815+
10816+
#include <sqlite3.h>
10817+
#if SQLITE_VERSION_NUMBER < 3007015
10818+
# error "SQLite 3.7.15 or higher required"
10819+
#endif
10820+
10821+
int
10822+
main ()
10823+
{
10824+
10825+
;
10826+
return 0;
10827+
}
10828+
10829+
_ACEOF
10830+
if ac_fn_c_try_compile "$LINENO"; then :
10831+
10832+
$as_echo "#define HAVE_LIBSQLITE3 1" >>confdefs.h
10833+
10834+
fi
10835+
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
10836+
10837+
fi
10838+
10839+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqlite3_load_extension in -lsqlite3" >&5
10840+
$as_echo_n "checking for sqlite3_load_extension in -lsqlite3... " >&6; }
10841+
if ${ac_cv_lib_sqlite3_sqlite3_load_extension+:} false; then :
10842+
$as_echo_n "(cached) " >&6
10843+
else
10844+
ac_check_lib_save_LIBS=$LIBS
10845+
LIBS="-lsqlite3 $LIBS"
10846+
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
10847+
/* end confdefs.h. */
10848+
10849+
/* Override any GCC internal prototype to avoid an error.
10850+
Use char because int might match the return type of a GCC
10851+
builtin and then its argument prototype would still apply. */
10852+
#ifdef __cplusplus
10853+
extern "C"
10854+
#endif
10855+
char sqlite3_load_extension ();
10856+
int
10857+
main ()
10858+
{
10859+
return sqlite3_load_extension ();
10860+
;
10861+
return 0;
10862+
}
10863+
_ACEOF
10864+
if ac_fn_c_try_link "$LINENO"; then :
10865+
ac_cv_lib_sqlite3_sqlite3_load_extension=yes
10866+
else
10867+
ac_cv_lib_sqlite3_sqlite3_load_extension=no
10868+
fi
10869+
rm -f core conftest.err conftest.$ac_objext \
10870+
conftest$ac_exeext conftest.$ac_ext
10871+
LIBS=$ac_check_lib_save_LIBS
10872+
fi
10873+
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite3_sqlite3_load_extension" >&5
10874+
$as_echo "$ac_cv_lib_sqlite3_sqlite3_load_extension" >&6; }
10875+
if test "x$ac_cv_lib_sqlite3_sqlite3_load_extension" = xyes; then :
10876+
have_sqlite3_load_extension=yes
10877+
else
10878+
have_sqlite3_load_extension=no
10879+
fi
10880+
10881+
LIBS=$save_LIBS
10882+
10883+
fi
10884+
10885+
done
10886+
10887+
1076510888
# Check for support for loadable sqlite extensions
1076610889
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --enable-loadable-sqlite-extensions" >&5
1076710890
$as_echo_n "checking for --enable-loadable-sqlite-extensions... " >&6; }
1076810891
# Check whether --enable-loadable-sqlite-extensions was given.
1076910892
if test "${enable_loadable_sqlite_extensions+set}" = set; then :
10770-
enableval=$enable_loadable_sqlite_extensions;
10893+
enableval=$enable_loadable_sqlite_extensions; if test "x$have_sqlite3_load_extension" = xno; then :
10894+
as_fn_error $? "Your version of SQLite does not support loadable extensions" "$LINENO" 5
10895+
fi
1077110896
else
1077210897
enable_loadable_sqlite_extensions=no
1077310898
fi

configure.ac

+21-1
Original file line numberDiff line numberDiff line change
@@ -3068,12 +3068,32 @@ fi
30683068

30693069
AC_MSG_RESULT($with_decimal_contextvar)
30703070

3071+
dnl Check for SQLite library
3072+
AC_CHECK_HEADERS([sqlite3.h], [
3073+
AS_VAR_COPY([save_LIBS], [LIBS])
3074+
AC_CHECK_LIB([sqlite3], [sqlite3_open_v2], [
3075+
AC_COMPILE_IFELSE([
3076+
AC_LANG_PROGRAM([
3077+
#include <sqlite3.h>
3078+
#if SQLITE_VERSION_NUMBER < 3007015
3079+
# error "SQLite 3.7.15 or higher required"
3080+
#endif
3081+
], [])
3082+
], [AC_DEFINE([HAVE_LIBSQLITE3], [1], [Define if SQLite > 3.7.15 is found])])
3083+
])
3084+
AC_CHECK_LIB([sqlite3], [sqlite3_load_extension],
3085+
[have_sqlite3_load_extension=yes],
3086+
[have_sqlite3_load_extension=no])
3087+
AS_VAR_COPY([LIBS], [save_LIBS])
3088+
])
3089+
30713090
# Check for support for loadable sqlite extensions
30723091
AC_MSG_CHECKING(for --enable-loadable-sqlite-extensions)
30733092
AC_ARG_ENABLE(loadable-sqlite-extensions,
30743093
AS_HELP_STRING([--enable-loadable-sqlite-extensions],
30753094
[support loadable extensions in _sqlite module, see Doc/library/sqlite3.rst (default is no)]),
3076-
[],
3095+
[AS_VAR_IF([have_sqlite3_load_extension], [no],
3096+
[AC_MSG_ERROR([Your version of SQLite does not support loadable extensions])])],
30773097
[enable_loadable_sqlite_extensions=no])
30783098
AC_MSG_RESULT($enable_loadable_sqlite_extensions)
30793099

pyconfig.h.in

+6
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,9 @@
610610
/* Define to 1 if you have the `sendfile' library (-lsendfile). */
611611
#undef HAVE_LIBSENDFILE
612612

613+
/* Define if SQLite > 3.7.15 is found */
614+
#undef HAVE_LIBSQLITE3
615+
613616
/* Define to 1 if you have the <libutil.h> header file. */
614617
#undef HAVE_LIBUTIL_H
615618

@@ -1028,6 +1031,9 @@
10281031
/* Define to 1 if you have the `splice' function. */
10291032
#undef HAVE_SPLICE
10301033

1034+
/* Define to 1 if you have the <sqlite3.h> header file. */
1035+
#undef HAVE_SQLITE3_H
1036+
10311037
/* Define if your compiler provides ssize_t */
10321038
#undef HAVE_SSIZE_T
10331039

setup.py

+17-101
Original file line numberDiff line numberDiff line change
@@ -1506,108 +1506,24 @@ class db_found(Exception): pass
15061506
self.missing.append('_gdbm')
15071507

15081508
def detect_sqlite(self):
1509-
# The sqlite interface
1510-
sqlite_setup_debug = False # verbose debug prints from this script?
1511-
1512-
# We hunt for #define SQLITE_VERSION "n.n.n"
1513-
sqlite_incdir = sqlite_libdir = None
1514-
sqlite_inc_paths = [ '/usr/include',
1515-
'/usr/include/sqlite',
1516-
'/usr/include/sqlite3',
1517-
'/usr/local/include',
1518-
'/usr/local/include/sqlite',
1519-
'/usr/local/include/sqlite3',
1520-
]
1521-
if CROSS_COMPILING:
1522-
sqlite_inc_paths = []
1523-
MIN_SQLITE_VERSION_NUMBER = (3, 7, 15) # Issue 40810
1524-
MIN_SQLITE_VERSION = ".".join([str(x)
1525-
for x in MIN_SQLITE_VERSION_NUMBER])
1526-
1527-
# Scan the default include directories before the SQLite specific
1528-
# ones. This allows one to override the copy of sqlite on OSX,
1529-
# where /usr/include contains an old version of sqlite.
1530-
if MACOS:
1531-
sysroot = macosx_sdk_root()
1509+
have_sqlite3 = sysconfig.get_config_var("HAVE_LIBSQLITE3")
1510+
if not have_sqlite3:
1511+
self.missing.append("_sqlite3")
1512+
return
15321513

1533-
for d_ in self.inc_dirs + sqlite_inc_paths:
1534-
d = d_
1535-
if MACOS and is_macosx_sdk_path(d):
1536-
d = os.path.join(sysroot, d[1:])
1537-
1538-
f = os.path.join(d, "sqlite3.h")
1539-
if os.path.exists(f):
1540-
if sqlite_setup_debug: print("sqlite: found %s"%f)
1541-
with open(f) as file:
1542-
incf = file.read()
1543-
m = re.search(
1544-
r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"([\d\.]*)"', incf)
1545-
if m:
1546-
sqlite_version = m.group(1)
1547-
sqlite_version_tuple = tuple([int(x)
1548-
for x in sqlite_version.split(".")])
1549-
if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
1550-
# we win!
1551-
if sqlite_setup_debug:
1552-
print("%s/sqlite3.h: version %s"%(d, sqlite_version))
1553-
sqlite_incdir = d
1554-
break
1555-
else:
1556-
if sqlite_setup_debug:
1557-
print("%s: version %s is too old, need >= %s"%(d,
1558-
sqlite_version, MIN_SQLITE_VERSION))
1559-
elif sqlite_setup_debug:
1560-
print("sqlite: %s had no SQLITE_VERSION"%(f,))
1561-
1562-
if sqlite_incdir:
1563-
sqlite_dirs_to_check = [
1564-
os.path.join(sqlite_incdir, '..', 'lib64'),
1565-
os.path.join(sqlite_incdir, '..', 'lib'),
1566-
os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1567-
os.path.join(sqlite_incdir, '..', '..', 'lib'),
1568-
]
1569-
sqlite_libfile = self.compiler.find_library_file(
1570-
sqlite_dirs_to_check + self.lib_dirs, 'sqlite3')
1571-
if sqlite_libfile:
1572-
sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
1573-
1574-
if sqlite_incdir and sqlite_libdir:
1575-
sqlite_srcs = [
1576-
'_sqlite/connection.c',
1577-
'_sqlite/cursor.c',
1578-
'_sqlite/microprotocols.c',
1579-
'_sqlite/module.c',
1580-
'_sqlite/prepare_protocol.c',
1581-
'_sqlite/row.c',
1582-
'_sqlite/statement.c',
1583-
'_sqlite/util.c', ]
1584-
sqlite_defines = []
1585-
1586-
# Enable support for loadable extensions in the sqlite3 module
1587-
# if --enable-loadable-sqlite-extensions configure option is used.
1588-
if (
1589-
MACOS and
1590-
sqlite_incdir == os.path.join(MACOS_SDK_ROOT, "usr/include") and
1591-
sysconfig.get_config_var("PY_SQLITE_ENABLE_LOAD_EXTENSION")
1592-
):
1593-
raise DistutilsError("System version of SQLite does not support loadable extensions")
1594-
1595-
include_dirs = ["Modules/_sqlite"]
1596-
# Only include the directory where sqlite was found if it does
1597-
# not already exist in set include directories, otherwise you
1598-
# can end up with a bad search path order.
1599-
if sqlite_incdir not in self.compiler.include_dirs:
1600-
include_dirs.append(sqlite_incdir)
1601-
# avoid a runtime library path for a system library dir
1602-
if sqlite_libdir and sqlite_libdir[0] in self.lib_dirs:
1603-
sqlite_libdir = None
1604-
self.add(Extension('_sqlite3', sqlite_srcs,
1605-
define_macros=sqlite_defines,
1606-
include_dirs=include_dirs,
1607-
library_dirs=sqlite_libdir,
1608-
libraries=["sqlite3",]))
1609-
else:
1610-
self.missing.append('_sqlite3')
1514+
sqlite_srcs = [
1515+
"_sqlite/connection.c",
1516+
"_sqlite/cursor.c",
1517+
"_sqlite/microprotocols.c",
1518+
"_sqlite/module.c",
1519+
"_sqlite/prepare_protocol.c",
1520+
"_sqlite/row.c",
1521+
"_sqlite/statement.c",
1522+
"_sqlite/util.c",
1523+
]
1524+
self.add(Extension("_sqlite3", sqlite_srcs,
1525+
include_dirs=["Modules/_sqlite"],
1526+
libraries=["sqlite3",]))
16111527

16121528
def detect_platform_specific_exts(self):
16131529
# Unix-only modules

0 commit comments

Comments
 (0)