Skip to content

Commit

Permalink
Closes #27976: Deprecate bundled full copy of libffi
Browse files Browse the repository at this point in the history
Builds on non-OSX UNIX now default to using the system libffi, and warn if the
bundled copy is used.
  • Loading branch information
zware committed Sep 10, 2016
1 parent b7f3c94 commit 935043d
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 8 deletions.
10 changes: 10 additions & 0 deletions Doc/whatsnew/3.6.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1010,6 +1010,16 @@ Build and C API Changes
Deprecated
==========

Deprecated Build Options
------------------------

The ``--with-system-ffi`` configure flag is now on by default on non-OSX UNIX
platforms. It may be disabled by using ``--without-system-ffi``, but using the
flag is deprecated and will not be accepted in Python 3.7. OSX is unaffected
by this change. Note that many OS distributors already use the
``--with-system-ffi`` flag when building their system Python.


New Keywords
------------

Expand Down
3 changes: 3 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,9 @@ Tests
Build
-----

- Issue #27976: Deprecate building _ctypes with the bundled copy of libffi on
non-OSX UNIX platforms.

- Issue #27983: Cause lack of llvm-profdata tool when using clang as
required for PGO linking to be a configure time error rather than
make time when --with-optimizations is enabled. Also improve our
Expand Down
20 changes: 18 additions & 2 deletions configure
Original file line number Diff line number Diff line change
Expand Up @@ -9851,11 +9851,27 @@ $as_echo_n "checking for --with-system-ffi... " >&6; }
# Check whether --with-system_ffi was given.
if test "${with_system_ffi+set}" = set; then :
withval=$with_system_ffi;
else
with_system_ffi="no"
fi


case "$with_system_ffi" in
"")
case $ac_sys_system in
Darwin)
with_system_ffi="no"
;;
*)
with_system_ffi="yes"
;;
esac
;;
yes|no)
;;
*)
as_fn_error $? "--with-system-ffi accepts no arguments" "$LINENO" 5
;;
esac

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/ *$//'`"
else
Expand Down
22 changes: 19 additions & 3 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -2737,9 +2737,25 @@ AC_MSG_RESULT($with_system_expat)
# Check for use of the system libffi library
AC_MSG_CHECKING(for --with-system-ffi)
AC_ARG_WITH(system_ffi,
AS_HELP_STRING([--with-system-ffi], [build _ctypes module using an installed ffi library]),
[],
[with_system_ffi="no"])
AS_HELP_STRING([--with-system-ffi], [build _ctypes module using an installed ffi library]),,,)

case "$with_system_ffi" in
"")
case $ac_sys_system in
Darwin)
with_system_ffi="no"
;;
*)
with_system_ffi="yes"
;;
esac
;;
yes|no)
;;
*)
AC_MSG_ERROR([--with-system-ffi accepts no arguments])
;;
esac

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/ *$//'`"
Expand Down
10 changes: 7 additions & 3 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -1911,6 +1911,9 @@ def configure_ctypes(self, ext):
if host_platform == 'darwin':
return self.configure_ctypes_darwin(ext)

print('warning: building with the bundled copy of libffi is'
' deprecated on this platform. It will not be'
' distributed with Python 3.7')
srcdir = sysconfig.get_config_var('srcdir')
ffi_builddir = os.path.join(self.build_temp, 'libffi')
ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
Expand Down Expand Up @@ -2007,13 +2010,14 @@ def detect_ctypes(self, inc_dirs, lib_dirs):
libraries=math_libs)
self.extensions.extend([ext, ext_test])

if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):
return

if host_platform == 'darwin':
if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"):
return
# OS X 10.5 comes with libffi.dylib; the include files are
# in /usr/include/ffi
inc_dirs.append('/usr/include/ffi')
elif '--without-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):
return

ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
if not ffi_inc or ffi_inc[0] == '':
Expand Down

0 comments on commit 935043d

Please sign in to comment.