bpo-45847: Port _ctypes partly to PY_STDLIB_MOD (GH-29747)

Co-authored-by: Erlend Egeberg Aasland <erlend.aasland@innova.no>
This commit is contained in:
Christian Heimes 2021-12-04 12:21:43 +02:00 committed by GitHub
parent cee07b1628
commit 4045392e0e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 481 additions and 35 deletions

View File

@ -130,6 +130,10 @@
############################################################################ ############################################################################
# Modules with third party dependencies # Modules with third party dependencies
# #
# needs -lffi and -ldl
@MODULE__CTYPES_TRUE@_ctypes _ctypes/_ctypes.c _ctypes/callbacks.c _ctypes/callproc.c _ctypes/stgdict.c _ctypes/cfield.c
@MODULE__SQLITE3_TRUE@_sqlite3 _sqlite/connection.c _sqlite/cursor.c _sqlite/microprotocols.c _sqlite/module.c _sqlite/prepare_protocol.c _sqlite/row.c _sqlite/statement.c _sqlite/util.c @MODULE__SQLITE3_TRUE@_sqlite3 _sqlite/connection.c _sqlite/cursor.c _sqlite/microprotocols.c _sqlite/module.c _sqlite/prepare_protocol.c _sqlite/row.c _sqlite/statement.c _sqlite/util.c
# needs -lssl and -lcrypt # needs -lssl and -lcrypt

382
configure vendored
View File

@ -664,6 +664,8 @@ MODULE__GDBM_FALSE
MODULE__GDBM_TRUE MODULE__GDBM_TRUE
MODULE__DECIMAL_FALSE MODULE__DECIMAL_FALSE
MODULE__DECIMAL_TRUE MODULE__DECIMAL_TRUE
MODULE__CTYPES_FALSE
MODULE__CTYPES_TRUE
MODULE__CRYPT_FALSE MODULE__CRYPT_FALSE
MODULE__CRYPT_TRUE MODULE__CRYPT_TRUE
MODULE__BLAKE2_FALSE MODULE__BLAKE2_FALSE
@ -828,6 +830,8 @@ LIBMPDEC_INTERNAL
LIBMPDEC_LDFLAGS LIBMPDEC_LDFLAGS
LIBMPDEC_CFLAGS LIBMPDEC_CFLAGS
LIBFFI_INCLUDEDIR LIBFFI_INCLUDEDIR
LIBFFI_LIBS
LIBFFI_CFLAGS
LIBEXPAT_INTERNAL LIBEXPAT_INTERNAL
LIBEXPAT_LDFLAGS LIBEXPAT_LDFLAGS
LIBEXPAT_CFLAGS LIBEXPAT_CFLAGS
@ -1060,6 +1064,8 @@ CPP
PROFILE_TASK PROFILE_TASK
LIBUUID_CFLAGS LIBUUID_CFLAGS
LIBUUID_LIBS LIBUUID_LIBS
LIBFFI_CFLAGS
LIBFFI_LIBS
LIBNSL_CFLAGS LIBNSL_CFLAGS
LIBNSL_LIBS LIBNSL_LIBS
LIBSQLITE3_CFLAGS LIBSQLITE3_CFLAGS
@ -1857,6 +1863,9 @@ Some influential environment variables:
C compiler flags for LIBUUID, overriding pkg-config C compiler flags for LIBUUID, overriding pkg-config
LIBUUID_LIBS LIBUUID_LIBS
linker flags for LIBUUID, overriding pkg-config linker flags for LIBUUID, overriding pkg-config
LIBFFI_CFLAGS
C compiler flags for LIBFFI, overriding pkg-config
LIBFFI_LIBS linker flags for LIBFFI, overriding pkg-config
LIBNSL_CFLAGS LIBNSL_CFLAGS
C compiler flags for LIBNSL, overriding pkg-config C compiler flags for LIBNSL, overriding pkg-config
LIBNSL_LIBS linker flags for LIBNSL, overriding pkg-config LIBNSL_LIBS linker flags for LIBNSL, overriding pkg-config
@ -11375,6 +11384,335 @@ $as_echo "$as_me: WARNING: --with(out)-system-ffi is ignored on this platform" >
with_system_ffi="yes" with_system_ffi="yes"
fi fi
have_libffi=missing
if test "x$with_system_ffi" = xyes; then :
pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBFFI" >&5
$as_echo_n "checking for LIBFFI... " >&6; }
if test -n "$LIBFFI_CFLAGS"; then
pkg_cv_LIBFFI_CFLAGS="$LIBFFI_CFLAGS"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libffi\""; } >&5
($PKG_CONFIG --exists --print-errors "libffi") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
pkg_cv_LIBFFI_CFLAGS=`$PKG_CONFIG --cflags "libffi" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes
else
pkg_failed=yes
fi
else
pkg_failed=untried
fi
if test -n "$LIBFFI_LIBS"; then
pkg_cv_LIBFFI_LIBS="$LIBFFI_LIBS"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libffi\""; } >&5
($PKG_CONFIG --exists --print-errors "libffi") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
pkg_cv_LIBFFI_LIBS=`$PKG_CONFIG --libs "libffi" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes
else
pkg_failed=yes
fi
else
pkg_failed=untried
fi
if test $pkg_failed = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
_pkg_short_errors_supported=yes
else
_pkg_short_errors_supported=no
fi
if test $_pkg_short_errors_supported = yes; then
LIBFFI_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libffi" 2>&1`
else
LIBFFI_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libffi" 2>&1`
fi
# Put the nasty error message in config.log where it belongs
echo "$LIBFFI_PKG_ERRORS" >&5
ac_fn_c_check_header_mongrel "$LINENO" "ffi.h" "ac_cv_header_ffi_h" "$ac_includes_default"
if test "x$ac_cv_header_ffi_h" = xyes; then :
save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ffi_call in -lffi" >&5
$as_echo_n "checking for ffi_call in -lffi... " >&6; }
if ${ac_cv_lib_ffi_ffi_call+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lffi $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char ffi_call ();
int
main ()
{
return ffi_call ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_ffi_ffi_call=yes
else
ac_cv_lib_ffi_ffi_call=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ffi_ffi_call" >&5
$as_echo "$ac_cv_lib_ffi_ffi_call" >&6; }
if test "x$ac_cv_lib_ffi_ffi_call" = xyes; then :
have_libffi=yes
else
have_libffi=no
fi
CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS
fi
elif test $pkg_failed = untried; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
ac_fn_c_check_header_mongrel "$LINENO" "ffi.h" "ac_cv_header_ffi_h" "$ac_includes_default"
if test "x$ac_cv_header_ffi_h" = xyes; then :
save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ffi_call in -lffi" >&5
$as_echo_n "checking for ffi_call in -lffi... " >&6; }
if ${ac_cv_lib_ffi_ffi_call+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lffi $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char ffi_call ();
int
main ()
{
return ffi_call ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_ffi_ffi_call=yes
else
ac_cv_lib_ffi_ffi_call=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ffi_ffi_call" >&5
$as_echo "$ac_cv_lib_ffi_ffi_call" >&6; }
if test "x$ac_cv_lib_ffi_ffi_call" = xyes; then :
have_libffi=yes
else
have_libffi=no
fi
CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS
fi
else
LIBFFI_CFLAGS=$pkg_cv_LIBFFI_CFLAGS
LIBFFI_LIBS=$pkg_cv_LIBFFI_LIBS
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
have_libffi=yes
fi
else
have_libffi=yes
LIBFFI_CFLAGS="-I\$(srcdir)/Modules/_ctypes/darwin -DUSING_MALLOC_CLOSURE_DOT_C=1 -DMACOSX"
LIBFFI_LIBS=
fi
case $LIBS in #(
*-ldl*) :
LIBFFI_LIBS="$LIBFFI_LIBS -ldl"
;; #(
*) :
;;
esac
if test "$with_system_ffi" = yes -a "$have_libffi" = yes; then
save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
save_LDFLAGS=$LDFLAGS
save_LIBS=$LIBS
CFLAGS="$LIBFFI_CFLAGS $CFLAGS"
LIBS="$LIBFFI_LIBS $LIBS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ffi_prep_cif_var in ffi.h" >&5
$as_echo_n "checking for ffi_prep_cif_var in ffi.h... " >&6; }
if ${ac_cv_ffi_prep_cif_var+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <ffi.h>
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "ffi_prep_cif_var" >/dev/null 2>&1; then :
ac_cv_ffi_prep_cif_var=yes
else
ac_cv_ffi_prep_cif_var=no
fi
rm -f conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_ffi_prep_cif_var" >&5
$as_echo "$ac_cv_ffi_prep_cif_var" >&6; }
if test "x$ac_cv_ffi_prep_cif_var" = xyes; then :
$as_echo "#define HAVE_FFI_PREP_CIF_VAR 1" >>confdefs.h
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ffi_prep_closure_loc in ffi.h" >&5
$as_echo_n "checking for ffi_prep_closure_loc in ffi.h... " >&6; }
if ${ac_cv_ffi_prep_closure_loc+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <ffi.h>
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "ffi_prep_closure_loc" >/dev/null 2>&1; then :
ac_cv_ffi_prep_closure_loc=yes
else
ac_cv_ffi_prep_closure_loc=no
fi
rm -f conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_ffi_prep_closure_loc" >&5
$as_echo "$ac_cv_ffi_prep_closure_loc" >&6; }
if test "x$ac_cv_ffi_prep_closure_loc" = xyes; then :
$as_echo "#define HAVE_FFI_PREP_CLOSURE_LOC 1" >>confdefs.h
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ffi_closure_alloc in ffi.h" >&5
$as_echo_n "checking for ffi_closure_alloc in ffi.h... " >&6; }
if ${ac_cv_ffi_closure_alloc+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <ffi.h>
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "ffi_closure_alloc" >/dev/null 2>&1; then :
ac_cv_ffi_closure_alloc=yes
else
ac_cv_ffi_closure_alloc=no
fi
rm -f conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_ffi_closure_alloc" >&5
$as_echo "$ac_cv_ffi_closure_alloc" >&6; }
if test "x$ac_cv_ffi_closure_alloc" = xyes; then :
$as_echo "#define HAVE_FFI_CLOSURE_ALLOC 1" >>confdefs.h
fi
CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS
fi
if test "$with_system_ffi" = "yes" && test -n "$PKG_CONFIG"; then if test "$with_system_ffi" = "yes" && test -n "$PKG_CONFIG"; then
LIBFFI_INCLUDEDIR="`"$PKG_CONFIG" libffi --cflags-only-I 2>/dev/null | sed -e 's/^-I//;s/ *$//'`" LIBFFI_INCLUDEDIR="`"$PKG_CONFIG" libffi --cflags-only-I 2>/dev/null | sed -e 's/^-I//;s/ *$//'`"
else else
@ -22726,6 +23064,42 @@ fi
$as_echo "$py_cv_module__crypt" >&6; } $as_echo "$py_cv_module__crypt" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _ctypes" >&5
$as_echo_n "checking for stdlib extension module _ctypes... " >&6; }
case $py_stdlib_not_available in #(
*_ctypes*) :
py_cv_module__ctypes=n/a ;; #(
*) :
if true; then :
if test "$have_libffi" = yes; then :
py_cv_module__ctypes=yes
else
py_cv_module__ctypes=missing
fi
else
py_cv_module__ctypes=disabled
fi
;;
esac
as_fn_append MODULE_BLOCK "MODULE__CTYPES=$py_cv_module__ctypes$as_nl"
if test "x$py_cv_module__ctypes" = xyes; then :
as_fn_append MODULE_BLOCK "MODULE__CTYPES_CFLAGS=$LIBFFI_CFLAGS$as_nl"
as_fn_append MODULE_BLOCK "MODULE__CTYPES_LDFLAGS=$LIBFFI_LIBS$as_nl"
fi
if test "$py_cv_module__ctypes" = yes; then
MODULE__CTYPES_TRUE=
MODULE__CTYPES_FALSE='#'
else
MODULE__CTYPES_TRUE='#'
MODULE__CTYPES_FALSE=
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__ctypes" >&5
$as_echo "$py_cv_module__ctypes" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _decimal" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _decimal" >&5
$as_echo_n "checking for stdlib extension module _decimal... " >&6; } $as_echo_n "checking for stdlib extension module _decimal... " >&6; }
case $py_stdlib_not_available in #( case $py_stdlib_not_available in #(
@ -23336,7 +23710,7 @@ $as_echo_n "checking for stdlib extension module _ctypes_test... " >&6; }
py_cv_module__ctypes_test=n/a ;; #( py_cv_module__ctypes_test=n/a ;; #(
*) : *) :
if test "$TEST_MODULES" = yes; then : if test "$TEST_MODULES" = yes; then :
if true; then : if test "$have_libffi" = yes; then :
py_cv_module__ctypes_test=yes py_cv_module__ctypes_test=yes
else else
py_cv_module__ctypes_test=missing py_cv_module__ctypes_test=missing
@ -23350,7 +23724,7 @@ esac
if test "x$py_cv_module__ctypes_test" = xyes; then : if test "x$py_cv_module__ctypes_test" = xyes; then :
as_fn_append MODULE_BLOCK "MODULE__CTYPES_TEST_LDFLAGS=-lm$as_nl" as_fn_append MODULE_BLOCK "MODULE__CTYPES_TEST_LDFLAGS=$LIBM$as_nl"
fi fi
if test "$py_cv_module__ctypes_test" = yes; then if test "$py_cv_module__ctypes_test" = yes; then
@ -23774,6 +24148,10 @@ if test -z "${MODULE__CRYPT_TRUE}" && test -z "${MODULE__CRYPT_FALSE}"; then
as_fn_error $? "conditional \"MODULE__CRYPT\" was never defined. as_fn_error $? "conditional \"MODULE__CRYPT\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5 Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi fi
if test -z "${MODULE__CTYPES_TRUE}" && test -z "${MODULE__CTYPES_FALSE}"; then
as_fn_error $? "conditional \"MODULE__CTYPES\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__DECIMAL_TRUE}" && test -z "${MODULE__DECIMAL_FALSE}"; then if test -z "${MODULE__DECIMAL_TRUE}" && test -z "${MODULE__DECIMAL_FALSE}"; then
as_fn_error $? "conditional \"MODULE__DECIMAL\" was never defined. as_fn_error $? "conditional \"MODULE__DECIMAL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5 Usually this means the macro was only invoked conditionally." "$LINENO" 5

View File

@ -3175,6 +3175,60 @@ else
with_system_ffi="yes" with_system_ffi="yes"
fi fi
dnl detect libffi
have_libffi=missing
AS_VAR_IF([with_system_ffi], [yes], [
PKG_CHECK_MODULES([LIBFFI], [libffi], [have_libffi=yes], [
AC_CHECK_HEADER([ffi.h], [
WITH_SAVE_ENV([
AC_CHECK_LIB([ffi], [ffi_call], [have_libffi=yes], [have_libffi=no])
])
])
])
], [
dnl private ffi copy
have_libffi=yes
LIBFFI_CFLAGS="-I\$(srcdir)/Modules/_ctypes/darwin -DUSING_MALLOC_CLOSURE_DOT_C=1 -DMACOSX"
LIBFFI_LIBS=
])
dnl _ctypes needs -ldl for dlopen
AS_CASE([$LIBS],
[*-ldl*], [LIBFFI_LIBS="$LIBFFI_LIBS -ldl"]
)
if test "$with_system_ffi" = yes -a "$have_libffi" = yes; then
WITH_SAVE_ENV([
CFLAGS="$LIBFFI_CFLAGS $CFLAGS"
LIBS="$LIBFFI_LIBS $LIBS"
AC_CACHE_CHECK([for ffi_prep_cif_var in ffi.h], [ac_cv_ffi_prep_cif_var], [
AC_EGREP_HEADER([ffi_prep_cif_var], [ffi.h], [ac_cv_ffi_prep_cif_var=yes], [ac_cv_ffi_prep_cif_var=no])
])
AS_VAR_IF([ac_cv_ffi_prep_cif_var], [yes], [
AC_DEFINE([HAVE_FFI_PREP_CIF_VAR], [1],
[Define to 1 if you have the ffi_prep_cif_var function in <ffi.h> header file.])
])
AC_CACHE_CHECK([for ffi_prep_closure_loc in ffi.h], [ac_cv_ffi_prep_closure_loc], [
AC_EGREP_HEADER([ffi_prep_closure_loc], [ffi.h], [ac_cv_ffi_prep_closure_loc=yes], [ac_cv_ffi_prep_closure_loc=no])
])
AS_VAR_IF([ac_cv_ffi_prep_closure_loc], [yes], [
AC_DEFINE([HAVE_FFI_PREP_CLOSURE_LOC], [1],
[Define to 1 if you have the ffi_prep_closure_loc function in <ffi.h> header file.])
])
AC_CACHE_CHECK([for ffi_closure_alloc in ffi.h], [ac_cv_ffi_closure_alloc], [
AC_EGREP_HEADER([ffi_closure_alloc], [ffi.h], [ac_cv_ffi_closure_alloc=yes], [ac_cv_ffi_closure_alloc=no])
])
AS_VAR_IF([ac_cv_ffi_closure_alloc], [yes], [
AC_DEFINE([HAVE_FFI_CLOSURE_ALLOC], [1],
[Define to 1 if you have the ffi_closure_alloc function in <ffi.h> header file.])
])
])
fi
if test "$with_system_ffi" = "yes" && test -n "$PKG_CONFIG"; then if test "$with_system_ffi" = "yes" && test -n "$PKG_CONFIG"; then
LIBFFI_INCLUDEDIR="`"$PKG_CONFIG" libffi --cflags-only-I 2>/dev/null | sed -e 's/^-I//;s/ *$//'`" LIBFFI_INCLUDEDIR="`"$PKG_CONFIG" libffi --cflags-only-I 2>/dev/null | sed -e 's/^-I//;s/ *$//'`"
else else
@ -6423,6 +6477,9 @@ PY_STDLIB_MOD([_blake2], [test "$with_builtin_blake2" = yes])
PY_STDLIB_MOD([_crypt], PY_STDLIB_MOD([_crypt],
[], [test "$ac_cv_crypt_crypt" = yes], [], [test "$ac_cv_crypt_crypt" = yes],
[$LIBCRYPT_CFLAGS], [$LIBCRYPT_LIBS]) [$LIBCRYPT_CFLAGS], [$LIBCRYPT_LIBS])
PY_STDLIB_MOD([_ctypes],
[], [test "$have_libffi" = yes],
[$LIBFFI_CFLAGS], [$LIBFFI_LIBS])
PY_STDLIB_MOD([_decimal], [], [], [$LIBMPDEC_CFLAGS], [$LIBMPDEC_LDFLAGS]) PY_STDLIB_MOD([_decimal], [], [], [$LIBMPDEC_CFLAGS], [$LIBMPDEC_LDFLAGS])
PY_STDLIB_MOD([_gdbm], PY_STDLIB_MOD([_gdbm],
[test "$have_gdbm_dbmliborder" = yes], [test "$have_gdbm" = yes], [test "$have_gdbm_dbmliborder" = yes], [test "$have_gdbm" = yes],
@ -6461,7 +6518,9 @@ PY_STDLIB_MOD([_testbuffer], [test "$TEST_MODULES" = yes])
PY_STDLIB_MOD([_testimportmultiple], [test "$TEST_MODULES" = yes]) PY_STDLIB_MOD([_testimportmultiple], [test "$TEST_MODULES" = yes])
PY_STDLIB_MOD([_testmultiphase], [test "$TEST_MODULES" = yes]) PY_STDLIB_MOD([_testmultiphase], [test "$TEST_MODULES" = yes])
PY_STDLIB_MOD([_xxtestfuzz], [test "$TEST_MODULES" = yes]) PY_STDLIB_MOD([_xxtestfuzz], [test "$TEST_MODULES" = yes])
PY_STDLIB_MOD([_ctypes_test], [test "$TEST_MODULES" = yes], [], [], [-lm]) PY_STDLIB_MOD([_ctypes_test],
[test "$TEST_MODULES" = yes], [test "$have_libffi" = yes],
[], [$LIBM])
dnl Limited API template modules. dnl Limited API template modules.
dnl The limited C API is not compatible with the Py_TRACE_REFS macro. dnl The limited C API is not compatible with the Py_TRACE_REFS macro.

View File

@ -356,6 +356,18 @@
/* Define to 1 if you have the `fexecve' function. */ /* Define to 1 if you have the `fexecve' function. */
#undef HAVE_FEXECVE #undef HAVE_FEXECVE
/* Define to 1 if you have the ffi_closure_alloc function in <ffi.h> header
file. */
#undef HAVE_FFI_CLOSURE_ALLOC
/* Define to 1 if you have the ffi_prep_cif_var function in <ffi.h> header
file. */
#undef HAVE_FFI_PREP_CIF_VAR
/* Define to 1 if you have the ffi_prep_closure_loc function in <ffi.h> header
file. */
#undef HAVE_FFI_PREP_CLOSURE_LOC
/* Define to 1 if you have the `flock' function. */ /* Define to 1 if you have the `flock' function. */
#undef HAVE_FLOCK #undef HAVE_FLOCK

View File

@ -669,12 +669,6 @@ class PyBuildExt(build_ext):
raise RuntimeError("Failed to build some stdlib modules") raise RuntimeError("Failed to build some stdlib modules")
def build_extension(self, ext): def build_extension(self, ext):
if ext.name == '_ctypes':
if not self.configure_ctypes(ext):
self.failed.append(ext.name)
return
try: try:
build_ext.build_extension(self, ext) build_ext.build_extension(self, ext)
except (CCompilerError, DistutilsError) as why: except (CCompilerError, DistutilsError) as why:
@ -1738,10 +1732,26 @@ class PyBuildExt(build_ext):
library_dirs=added_lib_dirs)) library_dirs=added_lib_dirs))
return True return True
def configure_ctypes(self, ext):
return True
def detect_ctypes(self): def detect_ctypes(self):
ext = Extension(
'_ctypes',
[
'_ctypes/_ctypes.c',
'_ctypes/callbacks.c',
'_ctypes/callproc.c',
'_ctypes/stgdict.c',
'_ctypes/cfield.c',
]
)
if MACOS:
self._build_ctypes_macos(ext)
else:
self.use_system_libffi = True
self.addext(ext)
self.addext(Extension('_ctypes_test', ['_ctypes/_ctypes_test.c']))
def _build_ctypes_macos(self, ext):
# Thomas Heller's _ctypes module # Thomas Heller's _ctypes module
if (not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and MACOS): if (not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and MACOS):
@ -1749,20 +1759,11 @@ class PyBuildExt(build_ext):
else: else:
self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS") self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS")
include_dirs = []
extra_compile_args = []
extra_link_args = []
sources = ['_ctypes/_ctypes.c',
'_ctypes/callbacks.c',
'_ctypes/callproc.c',
'_ctypes/stgdict.c',
'_ctypes/cfield.c']
if MACOS: if MACOS:
sources.append('_ctypes/malloc_closure.c') ext.sources.append('_ctypes/malloc_closure.c')
extra_compile_args.append('-DUSING_MALLOC_CLOSURE_DOT_C=1') ext.extra_compile_args.append('-DUSING_MALLOC_CLOSURE_DOT_C=1')
extra_compile_args.append('-DMACOSX') ext.extra_compile_args.append('-DMACOSX')
include_dirs.append('_ctypes/darwin') ext.include_dirs.append('_ctypes/darwin')
elif HOST_PLATFORM == 'sunos5': elif HOST_PLATFORM == 'sunos5':
# XXX This shouldn't be necessary; it appears that some # XXX This shouldn't be necessary; it appears that some
@ -1773,20 +1774,12 @@ class PyBuildExt(build_ext):
# this option. If you want to compile ctypes with the Sun # this option. If you want to compile ctypes with the Sun
# compiler, please research a proper solution, instead of # compiler, please research a proper solution, instead of
# finding some -z option for the Sun compiler. # finding some -z option for the Sun compiler.
extra_link_args.append('-mimpure-text') ext.extra_link_args.append('-mimpure-text')
elif HOST_PLATFORM.startswith('hp-ux'): elif HOST_PLATFORM.startswith('hp-ux'):
extra_link_args.append('-fPIC') ext.extra_link_args.append('-fPIC')
ext = Extension('_ctypes',
include_dirs=include_dirs,
extra_compile_args=extra_compile_args,
extra_link_args=extra_link_args,
libraries=[],
sources=sources)
self.add(ext) self.add(ext)
# function my_sqrt() needs libm for sqrt()
self.addext(Extension('_ctypes_test', ['_ctypes/_ctypes_test.c']))
ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR") ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR")
ffi_lib = None ffi_lib = None