blob: bc3d2d0e63b77aef7f349f206411a1cdcb207f3f [file] [log] [blame]
dnl ************************************************************
dnl * Please run autoreconf -ivf -Werror to test your changes! *
dnl ************************************************************
dnl
dnl Python's configure script requires autoconf 2.71, autoconf-archive,
dnl aclocal 1.16, and pkg-config.
dnl
dnl It is recommended to use the Tools/build/regen-configure.sh shell script
dnl to regenerate the configure script.
dnl
# Set VERSION so we only need to edit in one place (i.e., here)
m4_define([PYTHON_VERSION], [3.14])
AC_PREREQ([2.71])
AC_INIT([python],[PYTHON_VERSION],[https://github.com/python/cpython/issues/])
m4_ifdef(
[AX_C_FLOAT_WORDS_BIGENDIAN],
[],
[AC_MSG_ERROR([Please install autoconf-archive package and re-run autoreconf])]
)dnl
m4_ifdef(
[PKG_PROG_PKG_CONFIG],
[],
[AC_MSG_ERROR([Please install pkgconf's m4 macro package and re-run autoreconf])]
)dnl
dnl Helpers for saving and restoring environment variables:
dnl - _SAVE_VAR([VAR]) Helper for SAVE_ENV; stores VAR as save_VAR
dnl - _RESTORE_VAR([VAR]) Helper for RESTORE_ENV; restores VAR from save_VAR
dnl - SAVE_ENV Saves CFLAGS, LDFLAGS, LIBS, and CPPFLAGS
dnl - RESTORE_ENV Restores CFLAGS, LDFLAGS, LIBS, and CPPFLAGS
dnl - WITH_SAVE_ENV([SCRIPT]) Runs SCRIPT wrapped with SAVE_ENV/RESTORE_ENV
AC_DEFUN([_SAVE_VAR], [AS_VAR_COPY([save_][$1], [$1])])dnl
AC_DEFUN([_RESTORE_VAR], [AS_VAR_COPY([$1], [save_][$1])])dnl
AC_DEFUN([SAVE_ENV],
[_SAVE_VAR([CFLAGS])]
[_SAVE_VAR([CPPFLAGS])]
[_SAVE_VAR([LDFLAGS])]
[_SAVE_VAR([LIBS])]
)dnl
AC_DEFUN([RESTORE_ENV],
[_RESTORE_VAR([CFLAGS])]
[_RESTORE_VAR([CPPFLAGS])]
[_RESTORE_VAR([LDFLAGS])]
[_RESTORE_VAR([LIBS])]
)dnl
AC_DEFUN([WITH_SAVE_ENV],
[SAVE_ENV]
[$1]
[RESTORE_ENV]
)dnl
dnl PY_CHECK_FUNC(FUNCTION, [INCLUDES], [AC_DEFINE-VAR])
AC_DEFUN([PY_CHECK_FUNC],
[ AS_VAR_PUSHDEF([py_var], [ac_cv_func_$1])
AS_VAR_PUSHDEF([py_define], m4_ifblank([$3], [[HAVE_]m4_toupper($1)], [$3]))
AC_CACHE_CHECK(
[for $1],
[py_var],
[AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM([$2], [void *x=$1])],
[AS_VAR_SET([py_var], [yes])],
[AS_VAR_SET([py_var], [no])])]
)
AS_VAR_IF(
[py_var],
[yes],
[AC_DEFINE([py_define], [1], [Define if you have the '$1' function.])])
AS_VAR_POPDEF([py_var])
AS_VAR_POPDEF([py_define])
])
dnl PY_CHECK_LIB(LIBRARY, FUNCTION, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND], [OTHER-LIBRARIES])
dnl Like AC_CHECK_LIB() but does not modify LIBS
AC_DEFUN([PY_CHECK_LIB],
[AS_VAR_COPY([py_check_lib_save_LIBS], [LIBS])]
[AC_CHECK_LIB([$1], [$2], [$3], [$4], [$5])]
[AS_VAR_COPY([LIBS], [py_check_lib_save_LIBS])]
)
dnl PY_CHECK_EMSCRIPTEN_PORT(PKG_VAR, [EMPORT_ARGS])
dnl Use Emscripten port unless user passes ${PKG_VAR}_CFLAGS
dnl or ${PKG_VAR}_LIBS to configure.
AC_DEFUN([PY_CHECK_EMSCRIPTEN_PORT], [
AS_VAR_PUSHDEF([py_cflags], [$1_CFLAGS])
AS_VAR_PUSHDEF([py_libs], [$1_LIBS])
AS_IF([test "$ac_sys_system" = "Emscripten" -a -z "$py_cflags" -a -z "$py_libs"], [
py_cflags="$2"
py_libs="$2"
])
AS_VAR_POPDEF([py_cflags])
AS_VAR_POPDEF([py_libs])
])
AC_SUBST([BASECPPFLAGS])
if test "$srcdir" != . -a "$srcdir" != "$(pwd)"; then
# If we're building out-of-tree, we need to make sure the following
# resources get picked up before their $srcdir counterparts.
# Objects/ -> typeslots.inc
# Include/ -> Python.h
# (A side effect of this is that these resources will automatically be
# regenerated when building out-of-tree, regardless of whether or not
# the $srcdir counterpart is up-to-date. This is an acceptable trade
# off.)
BASECPPFLAGS="-IObjects -IInclude -IPython"
else
BASECPPFLAGS=""
fi
AC_SUBST([GITVERSION])
AC_SUBST([GITTAG])
AC_SUBST([GITBRANCH])
if test -e $srcdir/.git
then
AC_CHECK_PROG([HAS_GIT], [git], [found], [not-found])
else
HAS_GIT=no-repository
fi
if test $HAS_GIT = found
then
GITVERSION="git --git-dir \$(srcdir)/.git rev-parse --short HEAD"
GITTAG="git --git-dir \$(srcdir)/.git describe --all --always --dirty"
GITBRANCH="git --git-dir \$(srcdir)/.git name-rev --name-only HEAD"
else
GITVERSION=""
GITTAG=""
GITBRANCH=""
fi
AC_CONFIG_SRCDIR([Include/object.h])
AC_CONFIG_HEADERS([pyconfig.h])
AC_CANONICAL_HOST
AC_SUBST([build])
AC_SUBST([host])
AS_VAR_IF([cross_compiling], [maybe],
[AC_MSG_ERROR([Cross compiling required --host=HOST-TUPLE and --build=ARCH])]
)
# pybuilddir.txt will be created by --generate-posix-vars in the Makefile
rm -f pybuilddir.txt
AC_ARG_WITH([build-python],
[AS_HELP_STRING([--with-build-python=python]PYTHON_VERSION,
[path to build python binary for cross compiling (default: _bootstrap_python or python]PYTHON_VERSION[)])],
[
AC_MSG_CHECKING([for --with-build-python])
AS_VAR_IF([with_build_python], [yes], [with_build_python=python$PACKAGE_VERSION])
AS_VAR_IF([with_build_python], [no], [AC_MSG_ERROR([invalid --with-build-python option: expected path or "yes", not "no"])])
if ! $(command -v "$with_build_python" >/dev/null 2>&1); then
AC_MSG_ERROR([invalid or missing build python binary "$with_build_python"])
fi
build_python_ver=$($with_build_python -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')")
if test "$build_python_ver" != "$PACKAGE_VERSION"; then
AC_MSG_ERROR(["$with_build_python" has incompatible version $build_python_ver (expected: $PACKAGE_VERSION)])
fi
dnl Build Python interpreter is used for regeneration and freezing.
ac_cv_prog_PYTHON_FOR_REGEN=$with_build_python
PYTHON_FOR_FREEZE="$with_build_python"
PYTHON_FOR_BUILD='_PYTHON_PROJECT_BASE=$(abs_builddir) _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(srcdir)/Lib _PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata_$(ABIFLAGS)_$(MACHDEP)_$(MULTIARCH) _PYTHON_SYSCONFIGDATA_PATH=$(shell test -f pybuilddir.txt && echo $(abs_builddir)/`cat pybuilddir.txt`) '$with_build_python
AC_MSG_RESULT([$with_build_python])
], [
AS_VAR_IF([cross_compiling], [yes],
[AC_MSG_ERROR([Cross compiling requires --with-build-python])]
)
PYTHON_FOR_BUILD='./$(BUILDPYTHON) -E'
PYTHON_FOR_FREEZE="./_bootstrap_python"
]
)
AC_SUBST([PYTHON_FOR_BUILD])
AC_MSG_CHECKING([for Python interpreter freezing])
AC_MSG_RESULT([$PYTHON_FOR_FREEZE])
AC_SUBST([PYTHON_FOR_FREEZE])
AS_VAR_IF([cross_compiling], [yes],
[
dnl external build Python, freezing depends on Programs/_freeze_module.py
FREEZE_MODULE_BOOTSTRAP='$(PYTHON_FOR_FREEZE) $(srcdir)/Programs/_freeze_module.py'
FREEZE_MODULE_BOOTSTRAP_DEPS='$(srcdir)/Programs/_freeze_module.py'
FREEZE_MODULE='$(FREEZE_MODULE_BOOTSTRAP)'
FREEZE_MODULE_DEPS='$(FREEZE_MODULE_BOOTSTRAP_DEPS)'
PYTHON_FOR_BUILD_DEPS=''
],
[
dnl internal build tools also depend on Programs/_freeze_module and _bootstrap_python.
FREEZE_MODULE_BOOTSTRAP='./Programs/_freeze_module'
FREEZE_MODULE_BOOTSTRAP_DEPS="Programs/_freeze_module"
FREEZE_MODULE='$(PYTHON_FOR_FREEZE) $(srcdir)/Programs/_freeze_module.py'
FREEZE_MODULE_DEPS="_bootstrap_python \$(srcdir)/Programs/_freeze_module.py"
PYTHON_FOR_BUILD_DEPS='$(BUILDPYTHON)'
]
)
AC_SUBST([FREEZE_MODULE_BOOTSTRAP])
AC_SUBST([FREEZE_MODULE_BOOTSTRAP_DEPS])
AC_SUBST([FREEZE_MODULE])
AC_SUBST([FREEZE_MODULE_DEPS])
AC_SUBST([PYTHON_FOR_BUILD_DEPS])
AC_CHECK_PROGS([PYTHON_FOR_REGEN],
[python$PACKAGE_VERSION python3.13 python3.12 python3.11 python3.10 python3 python],
[python3])
AC_SUBST([PYTHON_FOR_REGEN])
AC_MSG_CHECKING([Python for regen version])
if command -v "$PYTHON_FOR_REGEN" >/dev/null 2>&1; then
AC_MSG_RESULT([$($PYTHON_FOR_REGEN -V 2>/dev/null)])
else
AC_MSG_RESULT([missing])
fi
dnl Ensure that if prefix is specified, it does not end in a slash. If
dnl it does, we get path names containing '//' which is both ugly and
dnl can cause trouble.
dnl Last slash shouldn't be stripped if prefix=/
if test "$prefix" != "/"; then
prefix=`echo "$prefix" | sed -e 's/\/$//g'`
fi
dnl This is for stuff that absolutely must end up in pyconfig.h.
dnl Please use pyport.h instead, if possible.
AH_TOP([
#ifndef Py_PYCONFIG_H
#define Py_PYCONFIG_H
])
AH_BOTTOM([
/* Define the macros needed if on a UnixWare 7.x system. */
#if defined(__USLC__) && defined(__SCO_VERSION__)
#define STRICT_SYSV_CURSES /* Don't use ncurses extensions */
#endif
#endif /*Py_PYCONFIG_H*/
])
# We don't use PACKAGE_ variables, and they cause conflicts
# with other autoconf-based packages that include Python.h
grep -v 'define PACKAGE_' <confdefs.h >confdefs.h.new
rm confdefs.h
mv confdefs.h.new confdefs.h
AC_SUBST([VERSION])
VERSION=PYTHON_VERSION
# Version number of Python's own shared library file.
AC_SUBST([SOVERSION])
SOVERSION=1.0
# The later definition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables
# certain features on NetBSD, so we need _NETBSD_SOURCE to re-enable
# them.
AC_DEFINE([_NETBSD_SOURCE], [1],
[Define on NetBSD to activate all library features])
# The later definition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables
# certain features on FreeBSD, so we need __BSD_VISIBLE to re-enable
# them.
AC_DEFINE([__BSD_VISIBLE], [1],
[Define on FreeBSD to activate all library features])
# The later definition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables
# certain features on Mac OS X, so we need _DARWIN_C_SOURCE to re-enable
# them.
AC_DEFINE([_DARWIN_C_SOURCE], [1],
[Define on Darwin to activate all library features])
define_xopen_source=yes
# Arguments passed to configure.
AC_SUBST([CONFIG_ARGS])
CONFIG_ARGS="$ac_configure_args"
dnl Allow users to disable pkg-config or require pkg-config
AC_ARG_WITH([pkg-config],
[AS_HELP_STRING([[--with-pkg-config=[yes|no|check]]],
[use pkg-config to detect build options (default is check)])],
[],
[with_pkg_config=check]
)
AS_CASE([$with_pkg_config],
[yes|check], [
if test -z "$PKG_CONFIG"; then
dnl invalidate stale config.cache values
AS_UNSET([PKG_CONFIG])
AS_UNSET([ac_cv_path_ac_pt_PKG_CONFIG])
AS_UNSET([ac_cv_prog_ac_ct_PKG_CONFIG])
fi
PKG_PROG_PKG_CONFIG
],
[no], [
PKG_CONFIG=''
dnl force AX_CHECK_OPENSSL to ignore pkg-config
ac_cv_path_ac_pt_PKG_CONFIG=''
ac_cv_prog_ac_ct_PKG_CONFIG=''
],
[AC_MSG_ERROR([invalid argument --with-pkg-config=$with_pkg_config])]
)
if test "$with_pkg_config" = yes -a -z "$PKG_CONFIG"; then
AC_MSG_ERROR([pkg-config is required])]
fi
# Set name for machine-dependent library files
AC_ARG_VAR([MACHDEP], [name for machine-dependent library files])
AC_MSG_CHECKING([MACHDEP])
if test -z "$MACHDEP"
then
# avoid using uname for cross builds
if test "$cross_compiling" = yes; then
# ac_sys_system and ac_sys_release are used for setting
# a lot of different things including 'define_xopen_source'
# in the case statement below.
case "$host" in
*-*-linux-android*)
ac_sys_system=Linux-android
;;
*-*-linux*)
ac_sys_system=Linux
;;
*-*-cygwin*)
ac_sys_system=Cygwin
;;
*-apple-ios*)
ac_sys_system=iOS
;;
*-*-vxworks*)
ac_sys_system=VxWorks
;;
*-*-emscripten)
ac_sys_system=Emscripten
;;
*-*-wasi*)
ac_sys_system=WASI
;;
*)
# for now, limit cross builds to known configurations
MACHDEP="unknown"
AC_MSG_ERROR([cross build not supported for $host])
esac
ac_sys_release=
else
ac_sys_system=`uname -s`
if test "$ac_sys_system" = "AIX" \
-o "$ac_sys_system" = "UnixWare" -o "$ac_sys_system" = "OpenUNIX"; then
ac_sys_release=`uname -v`
else
ac_sys_release=`uname -r`
fi
fi
ac_md_system=`echo $ac_sys_system |
tr -d '[/ ]' | tr '[[A-Z]]' '[[a-z]]'`
ac_md_release=`echo $ac_sys_release |
tr -d '[/ ]' | sed 's/^[[A-Z]]\.//' | sed 's/\..*//'`
MACHDEP="$ac_md_system$ac_md_release"
case $MACHDEP in
aix*) MACHDEP="aix";;
linux-android*) MACHDEP="android";;
linux*) MACHDEP="linux";;
cygwin*) MACHDEP="cygwin";;
darwin*) MACHDEP="darwin";;
'') MACHDEP="unknown";;
esac
if test "$ac_sys_system" = "SunOS"; then
# For Solaris, there isn't an OS version specific macro defined
# in most compilers, so we define one here.
SUNOS_VERSION=`echo $ac_sys_release | sed -e 's!\.\([0-9]\)$!.0\1!g' | tr -d '.'`
AC_DEFINE_UNQUOTED([Py_SUNOS_VERSION], [$SUNOS_VERSION],
[The version of SunOS/Solaris as reported by `uname -r' without the dot.])
fi
fi
AC_MSG_RESULT(["$MACHDEP"])
dnl For cross compilation, we distinguish between "prefix" (where we install the
dnl files) and "host_prefix" (where we expect to find the files at runtime)
if test -z "$host_prefix"; then
AS_CASE([$ac_sys_system],
[Emscripten], [host_prefix=/],
[host_prefix='${prefix}']
)
fi
AC_SUBST([host_prefix])
if test -z "$host_exec_prefix"; then
AS_CASE([$ac_sys_system],
[Emscripten], [host_exec_prefix=$host_prefix],
[host_exec_prefix='${exec_prefix}']
)
fi
AC_SUBST([host_exec_prefix])
# On cross-compile builds, configure will look for a host-specific compiler by
# prepending the user-provided host triple to the required binary name.
#
# On iOS, this results in binaries like "arm64-apple-ios13.0-simulator-gcc",
# which isn't a binary that exists, and isn't very convenient, as it contains the
# iOS version. As the default cross-compiler name won't exist, configure falls
# back to gcc, which *definitely* won't work. We're providing wrapper scripts for
# these tools; the binary names of these scripts are better defaults than "gcc".
# This only requires that the user put the platform scripts folder (e.g.,
# "iOS/Resources/bin") in their path, rather than defining platform-specific
# names/paths for AR, CC, CPP, and CXX explicitly; and if the user forgets to
# either put the platform scripts folder in the path, or specify CC etc,
# configure will fail.
if test -z "$AR"; then
case "$host" in
aarch64-apple-ios*-simulator) AR=arm64-apple-ios-simulator-ar ;;
aarch64-apple-ios*) AR=arm64-apple-ios-ar ;;
x86_64-apple-ios*-simulator) AR=x86_64-apple-ios-simulator-ar ;;
*)
esac
fi
if test -z "$CC"; then
case "$host" in
aarch64-apple-ios*-simulator) CC=arm64-apple-ios-simulator-clang ;;
aarch64-apple-ios*) CC=arm64-apple-ios-clang ;;
x86_64-apple-ios*-simulator) CC=x86_64-apple-ios-simulator-clang ;;
*)
esac
fi
if test -z "$CPP"; then
case "$host" in
aarch64-apple-ios*-simulator) CPP=arm64-apple-ios-simulator-cpp ;;
aarch64-apple-ios*) CPP=arm64-apple-ios-cpp ;;
x86_64-apple-ios*-simulator) CPP=x86_64-apple-ios-simulator-cpp ;;
*)
esac
fi
if test -z "$CXX"; then
case "$host" in
aarch64-apple-ios*-simulator) CXX=arm64-apple-ios-simulator-clang++ ;;
aarch64-apple-ios*) CXX=arm64-apple-ios-clang++ ;;
x86_64-apple-ios*-simulator) CXX=x86_64-apple-ios-simulator-clang++ ;;
*)
esac
fi
AC_MSG_CHECKING([for --enable-universalsdk])
AC_ARG_ENABLE([universalsdk],
AS_HELP_STRING([--enable-universalsdk@<:@=SDKDIR@:>@],
[create a universal binary build.
SDKDIR specifies which macOS SDK should be used to perform the build,
see Mac/README.rst. (default is no)]),
[
case $enableval in
yes)
# Locate the best usable SDK, see Mac/README for more
# information
enableval="`/usr/bin/xcodebuild -version -sdk macosx Path 2>/dev/null`"
if ! ( echo $enableval | grep -E '\.sdk' 1>/dev/null )
then
enableval=/Developer/SDKs/MacOSX10.4u.sdk
if test ! -d "${enableval}"
then
enableval=/
fi
fi
;;
esac
case $enableval in
no)
UNIVERSALSDK=
enable_universalsdk=
;;
*)
UNIVERSALSDK=$enableval
if test ! -d "${UNIVERSALSDK}"
then
AC_MSG_ERROR([--enable-universalsdk specifies non-existing SDK: ${UNIVERSALSDK}])
fi
;;
esac
],[
UNIVERSALSDK=
enable_universalsdk=
])
if test -n "${UNIVERSALSDK}"
then
AC_MSG_RESULT([${UNIVERSALSDK}])
else
AC_MSG_RESULT([no])
fi
AC_SUBST([UNIVERSALSDK])
AC_SUBST([ARCH_RUN_32BIT])
ARCH_RUN_32BIT=""
# For backward compatibility reasons we prefer to select '32-bit' if available,
# otherwise use 'intel'
UNIVERSAL_ARCHS="32-bit"
if test "`uname -s`" = "Darwin"
then
if test -n "${UNIVERSALSDK}"
then
if test -z "`/usr/bin/file -L "${UNIVERSALSDK}/usr/lib/libSystem.dylib" | grep ppc`"
then
UNIVERSAL_ARCHS="intel"
fi
fi
fi
AC_SUBST([LIPO_32BIT_FLAGS])
AC_SUBST([LIPO_INTEL64_FLAGS])
AC_MSG_CHECKING([for --with-universal-archs])
AC_ARG_WITH([universal-archs],
AS_HELP_STRING([--with-universal-archs=ARCH],
[specify the kind of macOS universal binary that should be created.
This option is only valid when --enable-universalsdk is set; options are:
("universal2", "intel-64", "intel-32", "intel", "32-bit",
"64-bit", "3-way", or "all")
see Mac/README.rst]),
[
UNIVERSAL_ARCHS="$withval"
],
[])
if test -n "${UNIVERSALSDK}"
then
AC_MSG_RESULT([${UNIVERSAL_ARCHS}])
else
AC_MSG_RESULT([no])
fi
AC_ARG_WITH([framework-name],
AS_HELP_STRING([--with-framework-name=FRAMEWORK],
[specify the name for the python framework on macOS
only valid when --enable-framework is set. see Mac/README.rst
(default is 'Python')]),
[
PYTHONFRAMEWORK=${withval}
PYTHONFRAMEWORKDIR=${withval}.framework
PYTHONFRAMEWORKIDENTIFIER=org.python.`echo $withval | tr '[A-Z]' '[a-z]'`
],[
PYTHONFRAMEWORK=Python
PYTHONFRAMEWORKDIR=Python.framework
PYTHONFRAMEWORKIDENTIFIER=org.python.python
])
dnl quadrigraphs "@<:@" and "@:>@" produce "[" and "]" in the output
AC_ARG_ENABLE([framework],
AS_HELP_STRING([--enable-framework@<:@=INSTALLDIR@:>@],
[create a Python.framework rather than a traditional Unix install.
optional INSTALLDIR specifies the installation path. see Mac/README.rst
(default is no)]),
[
case $enableval in
yes)
case $ac_sys_system in
Darwin) enableval=/Library/Frameworks ;;
iOS) enableval=iOS/Frameworks/\$\(MULTIARCH\) ;;
*) AC_MSG_ERROR([Unknown platform for framework build])
esac
esac
case $enableval in
no)
case $ac_sys_system in
iOS) AC_MSG_ERROR([iOS builds must use --enable-framework]) ;;
*)
PYTHONFRAMEWORK=
PYTHONFRAMEWORKDIR=no-framework
PYTHONFRAMEWORKPREFIX=
PYTHONFRAMEWORKINSTALLDIR=
PYTHONFRAMEWORKINSTALLNAMEPREFIX=
RESSRCDIR=
FRAMEWORKINSTALLFIRST=
FRAMEWORKINSTALLLAST=
FRAMEWORKALTINSTALLFIRST=
FRAMEWORKALTINSTALLLAST=
FRAMEWORKPYTHONW=
INSTALLTARGETS="commoninstall bininstall maninstall"
if test "x${prefix}" = "xNONE"; then
FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
else
FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
fi
enable_framework=
esac
;;
*)
PYTHONFRAMEWORKPREFIX="${enableval}"
PYTHONFRAMEWORKINSTALLDIR=$PYTHONFRAMEWORKPREFIX/$PYTHONFRAMEWORKDIR
case $ac_sys_system in #(
Darwin) :
FRAMEWORKINSTALLFIRST="frameworkinstallversionedstructure"
FRAMEWORKALTINSTALLFIRST="frameworkinstallversionedstructure "
FRAMEWORKINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools"
FRAMEWORKALTINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkaltinstallunixtools"
FRAMEWORKPYTHONW="frameworkpythonw"
FRAMEWORKINSTALLAPPSPREFIX="/Applications"
INSTALLTARGETS="commoninstall bininstall maninstall"
if test "x${prefix}" = "xNONE" ; then
FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
else
FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
fi
case "${enableval}" in
/System*)
FRAMEWORKINSTALLAPPSPREFIX="/Applications"
if test "${prefix}" = "NONE" ; then
# See below
FRAMEWORKUNIXTOOLSPREFIX="/usr"
fi
;;
/Library*)
FRAMEWORKINSTALLAPPSPREFIX="/Applications"
;;
*/Library/Frameworks)
MDIR="`dirname "${enableval}"`"
MDIR="`dirname "${MDIR}"`"
FRAMEWORKINSTALLAPPSPREFIX="${MDIR}/Applications"
if test "${prefix}" = "NONE"; then
# User hasn't specified the
# --prefix option, but wants to install
# the framework in a non-default location,
# ensure that the compatibility links get
# installed relative to that prefix as well
# instead of in /usr/local.
FRAMEWORKUNIXTOOLSPREFIX="${MDIR}"
fi
;;
*)
FRAMEWORKINSTALLAPPSPREFIX="/Applications"
;;
esac
prefix=$PYTHONFRAMEWORKINSTALLDIR/Versions/$VERSION
PYTHONFRAMEWORKINSTALLNAMEPREFIX=${prefix}
RESSRCDIR=Mac/Resources/framework
# Add files for Mac specific code to the list of output
# files:
AC_CONFIG_FILES([Mac/Makefile])
AC_CONFIG_FILES([Mac/PythonLauncher/Makefile])
AC_CONFIG_FILES([Mac/Resources/framework/Info.plist])
AC_CONFIG_FILES([Mac/Resources/app/Info.plist])
;;
iOS) :
FRAMEWORKINSTALLFIRST="frameworkinstallunversionedstructure"
FRAMEWORKALTINSTALLFIRST="frameworkinstallunversionedstructure "
FRAMEWORKINSTALLLAST="frameworkinstallmobileheaders"
FRAMEWORKALTINSTALLLAST="frameworkinstallmobileheaders"
FRAMEWORKPYTHONW=
INSTALLTARGETS="libinstall inclinstall sharedinstall"
prefix=$PYTHONFRAMEWORKPREFIX
PYTHONFRAMEWORKINSTALLNAMEPREFIX="@rpath/$PYTHONFRAMEWORKDIR"
RESSRCDIR=iOS/Resources
AC_CONFIG_FILES([iOS/Resources/Info.plist])
;;
*)
AC_MSG_ERROR([Unknown platform for framework build])
;;
esac
esac
],[
case $ac_sys_system in
iOS) AC_MSG_ERROR([iOS builds must use --enable-framework]) ;;
*)
PYTHONFRAMEWORK=
PYTHONFRAMEWORKDIR=no-framework
PYTHONFRAMEWORKPREFIX=
PYTHONFRAMEWORKINSTALLDIR=
PYTHONFRAMEWORKINSTALLNAMEPREFIX=
RESSRCDIR=
FRAMEWORKINSTALLFIRST=
FRAMEWORKINSTALLLAST=
FRAMEWORKALTINSTALLFIRST=
FRAMEWORKALTINSTALLLAST=
FRAMEWORKPYTHONW=
INSTALLTARGETS="commoninstall bininstall maninstall"
if test "x${prefix}" = "xNONE" ; then
FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}"
else
FRAMEWORKUNIXTOOLSPREFIX="${prefix}"
fi
enable_framework=
esac
])
AC_SUBST([PYTHONFRAMEWORK])
AC_SUBST([PYTHONFRAMEWORKIDENTIFIER])
AC_SUBST([PYTHONFRAMEWORKDIR])
AC_SUBST([PYTHONFRAMEWORKPREFIX])
AC_SUBST([PYTHONFRAMEWORKINSTALLDIR])
AC_SUBST([PYTHONFRAMEWORKINSTALLNAMEPREFIX])
AC_SUBST([RESSRCDIR])
AC_SUBST([FRAMEWORKINSTALLFIRST])
AC_SUBST([FRAMEWORKINSTALLLAST])
AC_SUBST([FRAMEWORKALTINSTALLFIRST])
AC_SUBST([FRAMEWORKALTINSTALLLAST])
AC_SUBST([FRAMEWORKPYTHONW])
AC_SUBST([FRAMEWORKUNIXTOOLSPREFIX])
AC_SUBST([FRAMEWORKINSTALLAPPSPREFIX])
AC_SUBST([INSTALLTARGETS])
AC_DEFINE_UNQUOTED([_PYTHONFRAMEWORK], ["${PYTHONFRAMEWORK}"],
[framework name])
dnl quadrigraphs "@<:@" and "@:>@" produce "[" and "]" in the output
AC_MSG_CHECKING([for --with-app-store-compliance])
AC_ARG_WITH(
[app_store_compliance],
[AS_HELP_STRING(
[--with-app-store-compliance=@<:@PATCH-FILE@:>@],
[Enable any patches required for compiliance with app stores.
Optional PATCH-FILE specifies the custom patch to apply.]
)],[
case "$withval" in
yes)
case $ac_sys_system in
Darwin|iOS)
# iOS is able to share the macOS patch
APP_STORE_COMPLIANCE_PATCH="Mac/Resources/app-store-compliance.patch"
;;
*) AC_MSG_ERROR([no default app store compliance patch available for $ac_sys_system]) ;;
esac
AC_MSG_RESULT([applying default app store compliance patch])
;;
*)
APP_STORE_COMPLIANCE_PATCH="${withval}"
AC_MSG_RESULT([applying custom app store compliance patch])
;;
esac
],[
case $ac_sys_system in
iOS)
# Always apply the compliance patch on iOS; we can use the macOS patch
APP_STORE_COMPLIANCE_PATCH="Mac/Resources/app-store-compliance.patch"
AC_MSG_RESULT([applying default app store compliance patch])
;;
*)
# No default app compliance patching on any other platform
APP_STORE_COMPLIANCE_PATCH=
AC_MSG_RESULT([not patching for app store compliance])
;;
esac
])
AC_SUBST([APP_STORE_COMPLIANCE_PATCH])
AC_SUBST([_PYTHON_HOST_PLATFORM])
if test "$cross_compiling" = yes; then
case "$host" in
*-*-linux*)
case "$host_cpu" in
arm*)
_host_ident=arm
;;
*)
_host_ident=$host_cpu
esac
;;
*-*-cygwin*)
_host_ident=
;;
*-apple-ios*)
_host_os=`echo $host | cut -d '-' -f3`
_host_device=`echo $host | cut -d '-' -f4`
_host_device=${_host_device:=os}
# IPHONEOS_DEPLOYMENT_TARGET is the minimum supported iOS version
AC_MSG_CHECKING([iOS deployment target])
IPHONEOS_DEPLOYMENT_TARGET=$(echo ${_host_os} | cut -c4-)
IPHONEOS_DEPLOYMENT_TARGET=${IPHONEOS_DEPLOYMENT_TARGET:=13.0}
AC_MSG_RESULT([$IPHONEOS_DEPLOYMENT_TARGET])
case "$host_cpu" in
aarch64)
_host_ident=${IPHONEOS_DEPLOYMENT_TARGET}-arm64-iphone${_host_device}
;;
*)
_host_ident=${IPHONEOS_DEPLOYMENT_TARGET}-$host_cpu-iphone${_host_device}
;;
esac
;;
*-*-vxworks*)
_host_ident=$host_cpu
;;
wasm32-*-* | wasm64-*-*)
_host_ident=$host_cpu
;;
*)
# for now, limit cross builds to known configurations
MACHDEP="unknown"
AC_MSG_ERROR([cross build not supported for $host])
esac
_PYTHON_HOST_PLATFORM="$MACHDEP${_host_ident:+-$_host_ident}"
fi
# Some systems cannot stand _XOPEN_SOURCE being defined at all; they
# disable features if it is defined, without any means to access these
# features as extensions. For these systems, we skip the definition of
# _XOPEN_SOURCE. Before adding a system to the list to gain access to
# some feature, make sure there is no alternative way to access this
# feature. Also, when using wildcards, make sure you have verified the
# need for not defining _XOPEN_SOURCE on all systems matching the
# wildcard, and that the wildcard does not include future systems
# (which may remove their limitations).
dnl quadrigraphs "@<:@" and "@:>@" produce "[" and "]" in the output
case $ac_sys_system/$ac_sys_release in
# On OpenBSD, select(2) is not available if _XOPEN_SOURCE is defined,
# even though select is a POSIX function. Reported by J. Ribbens.
# Reconfirmed for OpenBSD 3.3 by Zachary Hamm, for 3.4 by Jason Ish.
# In addition, Stefan Krah confirms that issue #1244610 exists through
# OpenBSD 4.6, but is fixed in 4.7.
OpenBSD/2.* | OpenBSD/3.* | OpenBSD/4.@<:@0123456@:>@)
define_xopen_source=no
# OpenBSD undoes our definition of __BSD_VISIBLE if _XOPEN_SOURCE is
# also defined. This can be overridden by defining _BSD_SOURCE
# As this has a different meaning on Linux, only define it on OpenBSD
AC_DEFINE([_BSD_SOURCE], [1],
[Define on OpenBSD to activate all library features])
;;
OpenBSD/*)
# OpenBSD undoes our definition of __BSD_VISIBLE if _XOPEN_SOURCE is
# also defined. This can be overridden by defining _BSD_SOURCE
# As this has a different meaning on Linux, only define it on OpenBSD
AC_DEFINE([_BSD_SOURCE], [1],
[Define on OpenBSD to activate all library features])
;;
# Defining _XOPEN_SOURCE on NetBSD version prior to the introduction of
# _NETBSD_SOURCE disables certain features (eg. setgroups). Reported by
# Marc Recht
NetBSD/1.5 | NetBSD/1.5.* | NetBSD/1.6 | NetBSD/1.6.* | NetBSD/1.6@<:@A-S@:>@)
define_xopen_source=no;;
# From the perspective of Solaris, _XOPEN_SOURCE is not so much a
# request to enable features supported by the standard as a request
# to disable features not supported by the standard. The best way
# for Python to use Solaris is simply to leave _XOPEN_SOURCE out
# entirely and define __EXTENSIONS__ instead.
SunOS/*)
define_xopen_source=no;;
# On UnixWare 7, u_long is never defined with _XOPEN_SOURCE,
# but used in /usr/include/netinet/tcp.h. Reported by Tim Rice.
# Reconfirmed for 7.1.4 by Martin v. Loewis.
OpenUNIX/8.0.0| UnixWare/7.1.@<:@0-4@:>@)
define_xopen_source=no;;
# On OpenServer 5, u_short is never defined with _XOPEN_SOURCE,
# but used in struct sockaddr.sa_family. Reported by Tim Rice.
SCO_SV/3.2)
define_xopen_source=no;;
# On MacOS X 10.2, a bug in ncurses.h means that it craps out if
# _XOPEN_EXTENDED_SOURCE is defined. Apparently, this is fixed in 10.3, which
# identifies itself as Darwin/7.*
# On Mac OS X 10.4, defining _POSIX_C_SOURCE or _XOPEN_SOURCE
# disables platform specific features beyond repair.
# On Mac OS X 10.3, defining _POSIX_C_SOURCE or _XOPEN_SOURCE
# has no effect, don't bother defining them
Darwin/@<:@6789@:>@.*)
define_xopen_source=no;;
Darwin/@<:@[12]@:>@@<:@0-9@:>@.*)
define_xopen_source=no;;
# On iOS, defining _POSIX_C_SOURCE also disables platform specific features.
iOS/*)
define_xopen_source=no;;
# On QNX 6.3.2, defining _XOPEN_SOURCE prevents netdb.h from
# defining NI_NUMERICHOST.
QNX/6.3.2)
define_xopen_source=no
;;
# On VxWorks, defining _XOPEN_SOURCE causes compile failures
# in network headers still using system V types.
VxWorks/*)
define_xopen_source=no
;;
# On HP-UX, defining _XOPEN_SOURCE to 600 or greater hides
# chroot() and other functions
hp*|HP*)
define_xopen_source=no
;;
esac
if test $define_xopen_source = yes
then
# X/Open 7, incorporating POSIX.1-2008
AC_DEFINE([_XOPEN_SOURCE], [700],
[Define to the level of X/Open that your system supports])
# On Tru64 Unix 4.0F, defining _XOPEN_SOURCE also requires
# definition of _XOPEN_SOURCE_EXTENDED and _POSIX_C_SOURCE, or else
# several APIs are not declared. Since this is also needed in some
# cases for HP-UX, we define it globally.
AC_DEFINE([_XOPEN_SOURCE_EXTENDED], [1],
[Define to activate Unix95-and-earlier features])
AC_DEFINE([_POSIX_C_SOURCE], [200809L],
[Define to activate features from IEEE Stds 1003.1-2008])
fi
# On HP-UX mbstate_t requires _INCLUDE__STDC_A1_SOURCE
case $ac_sys_system in
hp*|HP*)
define_stdc_a1=yes;;
*)
define_stdc_a1=no;;
esac
if test $define_stdc_a1 = yes
then
AC_DEFINE([_INCLUDE__STDC_A1_SOURCE], [1],
[Define to include mbstate_t for mbrtowc])
fi
# Record the configure-time value of MACOSX_DEPLOYMENT_TARGET,
# it may influence the way we can build extensions, so distutils
# needs to check it
AC_SUBST([CONFIGURE_MACOSX_DEPLOYMENT_TARGET])
AC_SUBST([EXPORT_MACOSX_DEPLOYMENT_TARGET])
CONFIGURE_MACOSX_DEPLOYMENT_TARGET=
EXPORT_MACOSX_DEPLOYMENT_TARGET='#'
# Record the value of IPHONEOS_DEPLOYMENT_TARGET enforced by the selected host triple.
AC_SUBST([IPHONEOS_DEPLOYMENT_TARGET])
# checks for alternative programs
# compiler flags are generated in two sets, BASECFLAGS and OPT. OPT is just
# for debug/optimization stuff. BASECFLAGS is for flags that are required
# just to get things to compile and link. Users are free to override OPT
# when running configure or make. The build should not break if they do.
# BASECFLAGS should generally not be messed with, however.
# If the user switches compilers, we can't believe the cache
if test ! -z "$ac_cv_prog_CC" -a ! -z "$CC" -a "$CC" != "$ac_cv_prog_CC"
then
AC_MSG_ERROR([cached CC is different -- throw away $cache_file
(it is also a good idea to do 'make clean' before compiling)])
fi
# Don't let AC_PROG_CC set the default CFLAGS. It normally sets -g -O2
# when the compiler supports them, but we don't always want -O2, and
# we set -g later.
if test -z "$CFLAGS"; then
CFLAGS=
fi
dnl Emscripten SDK and WASI SDK default to wasm32.
dnl On Emscripten use MEMORY64 setting to build target wasm64-emscripten.
dnl for wasm64.
AS_CASE([$host],
[wasm64-*-emscripten], [
AS_VAR_APPEND([CFLAGS], [" -sMEMORY64=1"])
AS_VAR_APPEND([LDFLAGS], [" -sMEMORY64=1"])
],
)
dnl Add the compiler flag for the iOS minimum supported OS version.
AS_CASE([$ac_sys_system],
[iOS], [
AS_VAR_APPEND([CFLAGS], [" -mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET}"])
AS_VAR_APPEND([LDFLAGS], [" -mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET}"])
],
)
if test "$ac_sys_system" = "Darwin"
then
dnl look for SDKROOT
AC_CHECK_PROG([HAS_XCRUN], [xcrun], [yes], [missing])
AC_MSG_CHECKING([macOS SDKROOT])
if test -z "$SDKROOT"; then
dnl SDKROOT not set
if test "$HAS_XCRUN" = "yes"; then
dnl detect with Xcode
SDKROOT=$(xcrun --show-sdk-path)
else
dnl default to root
SDKROOT="/"
fi
fi
AC_MSG_RESULT([$SDKROOT])
# Compiler selection on MacOSX is more complicated than
# AC_PROG_CC can handle, see Mac/README for more
# information
if test -z "${CC}"
then
found_gcc=
found_clang=
as_save_IFS=$IFS; IFS=:
for as_dir in $PATH
do
IFS=$as_save_IFS
if test -x "${as_dir}/gcc"; then
if test -z "${found_gcc}"; then
found_gcc="${as_dir}/gcc"
fi
fi
if test -x "${as_dir}/clang"; then
if test -z "${found_clang}"; then
found_clang="${as_dir}/clang"
fi
fi
done
IFS=$as_save_IFS
if test -n "$found_gcc" -a -n "$found_clang"
then
if test -n "`"$found_gcc" --version | grep llvm-gcc`"
then
AC_MSG_NOTICE([Detected llvm-gcc, falling back to clang])
CC="$found_clang"
CXX="$found_clang++"
fi
elif test -z "$found_gcc" -a -n "$found_clang"
then
AC_MSG_NOTICE([No GCC found, use CLANG])
CC="$found_clang"
CXX="$found_clang++"
elif test -z "$found_gcc" -a -z "$found_clang"
then
found_clang=`/usr/bin/xcrun -find clang 2>/dev/null`
if test -n "${found_clang}"
then
AC_MSG_NOTICE([Using clang from Xcode.app])
CC="${found_clang}"
CXX="`/usr/bin/xcrun -find clang++`"
# else: use default behaviour
fi
fi
fi
fi
AC_PROG_CC
AC_PROG_CPP
AC_PROG_GREP
AC_PROG_SED
AC_PROG_EGREP
dnl GNU Autoconf recommends the use of expr instead of basename.
AS_VAR_SET([CC_BASENAME], [$(expr "//$CC" : '.*/\(.*\)')])
dnl detect compiler name
dnl check for xlc before clang, newer xlc's can use clang as frontend.
dnl check for GCC last, other compilers set __GNUC__, too.
dnl msvc is listed for completeness.
AC_CACHE_CHECK([for CC compiler name], [ac_cv_cc_name], [
cat > conftest.c <<EOF
#if defined(__EMSCRIPTEN__)
emcc
#elif defined(__INTEL_COMPILER) || defined(__ICC)
icc
#elif defined(__ibmxl__) || defined(__xlc__) || defined(__xlC__)
xlc
#elif defined(_MSC_VER)
msvc
#elif defined(__clang__)
clang
#elif defined(__GNUC__)
gcc
#else
# error unknown compiler
#endif
EOF
if $CPP $CPPFLAGS conftest.c >conftest.out 2>/dev/null; then
ac_cv_cc_name=`grep -v '^#' conftest.out | grep -v '^ *$' | tr -d ' '`
AS_VAR_IF([CC_BASENAME], [mpicc], [ac_cv_cc_name=mpicc])
else
ac_cv_cc_name="unknown"
fi
rm -f conftest.c conftest.out
])
# checks for UNIX variants that set C preprocessor variables
# may set _GNU_SOURCE, __EXTENSIONS__, _POSIX_PTHREAD_SEMANTICS,
# _POSIX_SOURCE, _POSIX_1_SOURCE, and more
AC_USE_SYSTEM_EXTENSIONS
AC_CACHE_CHECK([for GCC compatible compiler],
[ac_cv_gcc_compat],
[AC_PREPROC_IFELSE([AC_LANG_SOURCE([
#if !defined(__GNUC__)
#error "not GCC compatible"
#else
/* GCC compatible! */
#endif
], [])],
[ac_cv_gcc_compat=yes],
[ac_cv_gcc_compat=no])])
AC_SUBST([CXX])
preset_cxx="$CXX"
if test -z "$CXX"
then
case "$ac_cv_cc_name" in
gcc) AC_PATH_TOOL([CXX], [g++], [g++], [notfound]) ;;
cc) AC_PATH_TOOL([CXX], [c++], [c++], [notfound]) ;;
clang) AC_PATH_TOOL([CXX], [clang++], [clang++], [notfound]) ;;
icc) AC_PATH_TOOL([CXX], [icpc], [icpc], [notfound]) ;;
esac
if test "$CXX" = "notfound"
then
CXX=""
fi
fi
if test -z "$CXX"
then
AC_CHECK_TOOLS([CXX], [$CCC c++ g++ gcc CC cxx cc++ cl], [notfound])
if test "$CXX" = "notfound"
then
CXX=""
fi
fi
if test "$preset_cxx" != "$CXX"
then
AC_MSG_NOTICE([
By default, distutils will build C++ extension modules with "$CXX".
If this is not intended, then set CXX on the configure command line.
])
fi
AC_MSG_CHECKING([for the platform triplet based on compiler characteristics])
if $CPP $CPPFLAGS $srcdir/Misc/platform_triplet.c >conftest.out 2>/dev/null; then
PLATFORM_TRIPLET=`grep '^PLATFORM_TRIPLET=' conftest.out | tr -d ' '`
PLATFORM_TRIPLET="${PLATFORM_TRIPLET@%:@PLATFORM_TRIPLET=}"
AC_MSG_RESULT([$PLATFORM_TRIPLET])
else
AC_MSG_RESULT([none])
fi
rm -f conftest.out
dnl On some platforms, using a true "triplet" for MULTIARCH would be redundant.
dnl For example, `arm64-apple-darwin` is redundant, because there isn't a
dnl non-Apple Darwin. Including the CPU architecture can also be potentially
dnl redundant - on macOS, for example, it's possible to do a single compile
dnl pass that includes multiple architectures, so it would be misleading for
dnl MULTIARCH (and thus the sysconfigdata module name) to include a single CPU
dnl architecture. PLATFORM_TRIPLET will be a pair or single value for these
dnl platforms.
AC_MSG_CHECKING([for multiarch])
AS_CASE([$ac_sys_system],
[Darwin*], [MULTIARCH=""],
[iOS], [MULTIARCH=""],
[FreeBSD*], [MULTIARCH=""],
[MULTIARCH=$($CC --print-multiarch 2>/dev/null)]
)
AC_SUBST([MULTIARCH])
if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then
if test x$PLATFORM_TRIPLET != x$MULTIARCH; then
AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report])
fi
elif test x$PLATFORM_TRIPLET != x && test x$MULTIARCH = x; then
MULTIARCH=$PLATFORM_TRIPLET
fi
AC_SUBST([PLATFORM_TRIPLET])
AC_MSG_RESULT([$MULTIARCH])
dnl Even if we *do* include the CPU architecture in the MULTIARCH value, some
dnl platforms don't need the CPU architecture in the SOABI tag. These platforms
dnl will have multiple sysconfig modules (one for each CPU architecture), but
dnl use a single "fat" binary at runtime. SOABI_PLATFORM is the component of
dnl the PLATFORM_TRIPLET that will be used in binary module extensions.
AS_CASE([$ac_sys_system],
[iOS], [SOABI_PLATFORM=`echo "$PLATFORM_TRIPLET" | cut -d '-' -f2`],
[SOABI_PLATFORM=$PLATFORM_TRIPLET]
)
if test x$MULTIARCH != x; then
MULTIARCH_CPPFLAGS="-DMULTIARCH=\\\"$MULTIARCH\\\""
fi
AC_SUBST([MULTIARCH_CPPFLAGS])
dnl Support tiers according to https://peps.python.org/pep-0011/
dnl
dnl NOTE: Windows support tiers are defined in PC/pyconfig.h.
dnl
AC_MSG_CHECKING([for PEP 11 support tier])
AS_CASE([$host/$ac_cv_cc_name],
[x86_64-*-linux-gnu/gcc], [PY_SUPPORT_TIER=1], dnl Linux on AMD64, any vendor, glibc, gcc
[x86_64-apple-darwin*/clang], [PY_SUPPORT_TIER=1], dnl macOS on Intel, any version
[aarch64-apple-darwin*/clang], [PY_SUPPORT_TIER=1], dnl macOS on M1, any version
[i686-pc-windows-msvc/msvc], [PY_SUPPORT_TIER=1], dnl 32bit Windows on Intel, MSVC
[x86_64-pc-windows-msvc/msvc], [PY_SUPPORT_TIER=1], dnl 64bit Windows on AMD64, MSVC
[aarch64-*-linux-gnu/gcc], [PY_SUPPORT_TIER=2], dnl Linux ARM64, glibc, gcc+clang
[aarch64-*-linux-gnu/clang], [PY_SUPPORT_TIER=2],
[powerpc64le-*-linux-gnu/gcc], [PY_SUPPORT_TIER=2], dnl Linux on PPC64 little endian, glibc, gcc
[wasm32-unknown-wasip1/clang], [PY_SUPPORT_TIER=2], dnl WebAssembly System Interface preview1, clang
[x86_64-*-linux-gnu/clang], [PY_SUPPORT_TIER=2], dnl Linux on AMD64, any vendor, glibc, clang
[aarch64-pc-windows-msvc/msvc], [PY_SUPPORT_TIER=3], dnl Windows ARM64, MSVC
[armv7l-*-linux-gnueabihf/gcc], [PY_SUPPORT_TIER=3], dnl ARMv7 LE with hardware floats, any vendor, glibc, gcc
[powerpc64le-*-linux-gnu/clang], [PY_SUPPORT_TIER=3], dnl Linux on PPC64 little endian, glibc, clang
[s390x-*-linux-gnu/gcc], [PY_SUPPORT_TIER=3], dnl Linux on 64bit s390x (big endian), glibc, gcc
[x86_64-*-freebsd*/clang], [PY_SUPPORT_TIER=3], dnl FreeBSD on AMD64
[aarch64-apple-ios*-simulator/clang], [PY_SUPPORT_TIER=3], dnl iOS Simulator on arm64
[aarch64-apple-ios*/clang], [PY_SUPPORT_TIER=3], dnl iOS on ARM64
[aarch64-*-linux-android/clang], [PY_SUPPORT_TIER=3], dnl Android on ARM64
[x86_64-*-linux-android/clang], [PY_SUPPORT_TIER=3], dnl Android on AMD64
[PY_SUPPORT_TIER=0]
)
AS_CASE([$PY_SUPPORT_TIER],
[1], [AC_MSG_RESULT([$host/$ac_cv_cc_name has tier 1 (supported)])],
[2], [AC_MSG_RESULT([$host/$ac_cv_cc_name has tier 2 (supported)])],
[3], [AC_MSG_RESULT([$host/$ac_cv_cc_name has tier 3 (partially supported)])],
[AC_MSG_WARN([$host/$ac_cv_cc_name is not supported])]
)
AC_DEFINE_UNQUOTED([PY_SUPPORT_TIER], [$PY_SUPPORT_TIER], [PEP 11 Support tier (1, 2, 3 or 0 for unsupported)])
AC_CACHE_CHECK([for -Wl,--no-as-needed], [ac_cv_wl_no_as_needed], [
save_LDFLAGS="$LDFLAGS"
AS_VAR_APPEND([LDFLAGS], [" -Wl,--no-as-needed"])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
[NO_AS_NEEDED="-Wl,--no-as-needed"
ac_cv_wl_no_as_needed=yes],
[NO_AS_NEEDED=""
ac_cv_wl_no_as_needed=no])
LDFLAGS="$save_LDFLAGS"
])
AC_SUBST([NO_AS_NEEDED])
AC_MSG_CHECKING([for the Android API level])
cat > conftest.c <<EOF
#ifdef __ANDROID__
android_api = __ANDROID_API__
arm_arch = __ARM_ARCH
#else
#error not Android
#endif
EOF
if $CPP $CPPFLAGS conftest.c >conftest.out 2>/dev/null; then
ANDROID_API_LEVEL=`sed -n -e '/__ANDROID_API__/d' -e 's/^android_api = //p' conftest.out`
_arm_arch=`sed -n -e '/__ARM_ARCH/d' -e 's/^arm_arch = //p' conftest.out`
AC_MSG_RESULT([$ANDROID_API_LEVEL])
if test -z "$ANDROID_API_LEVEL"; then
AC_MSG_ERROR([Fatal: you must define __ANDROID_API__])
fi
AC_DEFINE_UNQUOTED([ANDROID_API_LEVEL], [$ANDROID_API_LEVEL],
[The Android API level.])
# For __android_log_write() in Python/pylifecycle.c.
LIBS="$LIBS -llog"
AC_MSG_CHECKING([for the Android arm ABI])
AC_MSG_RESULT([$_arm_arch])
if test "$_arm_arch" = 7; then
BASECFLAGS="${BASECFLAGS} -mfloat-abi=softfp -mfpu=vfpv3-d16"
LDFLAGS="${LDFLAGS} -march=armv7-a -Wl,--fix-cortex-a8"
fi
else
AC_MSG_RESULT([not Android])
fi
rm -f conftest.c conftest.out
# Check for unsupported systems
AS_CASE([$ac_sys_system/$ac_sys_release],
[atheos*|Linux*/1*], [
AC_MSG_ERROR([m4_normalize([
This system \($ac_sys_system/$ac_sys_release\) is no longer supported.
See README for details.
])])
]
)
AC_MSG_CHECKING([for --with-emscripten-target])
AC_ARG_WITH([emscripten-target],
[AS_HELP_STRING([--with-emscripten-target=@<:@browser|node@:>@], [Emscripten platform])],
[
AS_VAR_IF([ac_sys_system], [Emscripten], [
AS_CASE([$with_emscripten_target],
[browser], [ac_sys_emscripten_target=browser],
[node], [ac_sys_emscripten_target=node],
dnl Debug builds with source map / dwarf symbols. Py_DEBUG builds easily
dnl run out of stack space. Detached sybmols and map prohibit some
dnl optimizations and increase file size. Options are undocumented so we
dnl are free to remove them in the future.
[browser-debug], [ac_sys_emscripten_target=browser-debug],
[node-debug], [ac_sys_emscripten_target=node-debug],
[AC_MSG_ERROR([Invalid argument: --with-emscripten-target=browser|node])]
)
], [
AC_MSG_ERROR([--with-emscripten-target only applies to Emscripten])
])
], [
AS_VAR_IF([ac_sys_system], [Emscripten], [ac_sys_emscripten_target=browser])
])
AC_MSG_RESULT([$ac_sys_emscripten_target])
dnl On Emscripten dlopen() requires -s MAIN_MODULE and -fPIC. The flags
dnl disables dead code elimination and increases the size of the WASM module
dnl by about 1.5 to 2MB. MAIN_MODULE defines __wasm_mutable_globals__.
dnl See https://emscripten.org/docs/compiling/Dynamic-Linking.html
AC_MSG_CHECKING([for --enable-wasm-dynamic-linking])
AC_ARG_ENABLE([wasm-dynamic-linking],
[AS_HELP_STRING([--enable-wasm-dynamic-linking],
[Enable dynamic linking support for WebAssembly (default is no)])],
[
AS_CASE([$ac_sys_system],
[Emscripten], [],
[WASI], [AC_MSG_ERROR([WASI dynamic linking is not implemented yet.])],
[AC_MSG_ERROR([--enable-wasm-dynamic-linking only applies to Emscripten and WASI])]
)
], [
enable_wasm_dynamic_linking=missing
])
AC_MSG_RESULT([$enable_wasm_dynamic_linking])
AC_MSG_CHECKING([for --enable-wasm-pthreads])
AC_ARG_ENABLE([wasm-pthreads],
[AS_HELP_STRING([--enable-wasm-pthreads],
[Enable pthread emulation for WebAssembly (default is no)])],
[
AS_CASE([$ac_sys_system],
[Emscripten], [],
[WASI], [],
[AC_MSG_ERROR([--enable-wasm-pthreads only applies to Emscripten and WASI])]
)
], [
enable_wasm_pthreads=missing
])
AC_MSG_RESULT([$enable_wasm_pthreads])
AC_MSG_CHECKING([for --with-suffix])
AC_ARG_WITH([suffix],
[AS_HELP_STRING([--with-suffix=SUFFIX], [set executable suffix to SUFFIX (default is empty, yes is mapped to '.exe')])],
[
AS_CASE([$with_suffix],
[no], [EXEEXT=],
[yes], [EXEEXT=.exe],
[EXEEXT=$with_suffix]
)
], [
AS_CASE([$ac_sys_system/$ac_sys_emscripten_target],
[Emscripten/browser*], [EXEEXT=.js],
[Emscripten/node*], [EXEEXT=.js],
[WASI/*], [EXEEXT=.wasm],
[EXEEXT=]
)
])
AC_MSG_RESULT([$EXEEXT])
# Make sure we keep EXEEXT and ac_exeext sync'ed.
AS_VAR_SET([ac_exeext], [$EXEEXT])
# Test whether we're running on a non-case-sensitive system, in which
# case we give a warning if no ext is given
AC_SUBST([BUILDEXEEXT])
AC_MSG_CHECKING([for case-insensitive build directory])
if test ! -d CaseSensitiveTestDir; then
mkdir CaseSensitiveTestDir
fi
if test -d casesensitivetestdir && test -z "$EXEEXT"
then
AC_MSG_RESULT([yes])
BUILDEXEEXT=.exe
else
AC_MSG_RESULT([no])
BUILDEXEEXT=$EXEEXT
fi
rmdir CaseSensitiveTestDir
case $ac_sys_system in
hp*|HP*)
case $ac_cv_cc_name in
cc|*/cc) CC="$CC -Ae";;
esac;;
esac
AC_SUBST([LIBRARY])
AC_MSG_CHECKING([LIBRARY])
if test -z "$LIBRARY"
then
LIBRARY='libpython$(VERSION)$(ABIFLAGS).a'
fi
AC_MSG_RESULT([$LIBRARY])
# LDLIBRARY is the name of the library to link against (as opposed to the
# name of the library into which to insert object files). BLDLIBRARY is also
# the library to link against, usually. On Mac OS X frameworks, BLDLIBRARY
# is blank as the main program is not linked directly against LDLIBRARY.
# LDLIBRARYDIR is the path to LDLIBRARY, which is made in a subdirectory. On
# systems without shared libraries, LDLIBRARY is the same as LIBRARY
# (defined in the Makefiles). On Cygwin LDLIBRARY is the import library,
# DLLLIBRARY is the shared (i.e., DLL) library.
#
# RUNSHARED is used to run shared python without installed libraries
#
# INSTSONAME is the name of the shared library that will be use to install
# on the system - some systems like version suffix, others don't
#
# LDVERSION is the shared library version number, normally the Python version
# with the ABI build flags appended.
AC_SUBST([LDLIBRARY])
AC_SUBST([DLLLIBRARY])
AC_SUBST([BLDLIBRARY])
AC_SUBST([PY3LIBRARY])
AC_SUBST([LDLIBRARYDIR])
AC_SUBST([INSTSONAME])
AC_SUBST([RUNSHARED])
AC_SUBST([LDVERSION])
LDLIBRARY="$LIBRARY"
BLDLIBRARY='$(LDLIBRARY)'
INSTSONAME='$(LDLIBRARY)'
DLLLIBRARY=''
LDLIBRARYDIR=''
RUNSHARED=''
LDVERSION="$VERSION"
# LINKCC is the command that links the python executable -- default is $(CC).
# If CXX is set, and if it is needed to link a main function that was
# compiled with CXX, LINKCC is CXX instead. Always using CXX is undesirable:
# python might then depend on the C++ runtime
AC_SUBST([LINKCC])
AC_MSG_CHECKING([LINKCC])
if test -z "$LINKCC"
then
LINKCC='$(PURIFY) $(CC)'
case $ac_sys_system in
QNX*)
# qcc must be used because the other compilers do not
# support -N.
LINKCC=qcc;;
esac
fi
AC_MSG_RESULT([$LINKCC])
# EXPORTSYMS holds the list of exported symbols for AIX.
# EXPORTSFROM holds the module name exporting symbols on AIX.
EXPORTSYMS=
EXPORTSFROM=
AC_SUBST([EXPORTSYMS])
AC_SUBST([EXPORTSFROM])
AC_MSG_CHECKING([EXPORTSYMS])
case $ac_sys_system in
AIX*)
EXPORTSYMS="Modules/python.exp"
EXPORTSFROM=. # the main executable
;;
esac
AC_MSG_RESULT([$EXPORTSYMS])
# GNULD is set to "yes" if the GNU linker is used. If this goes wrong
# make sure we default having it set to "no": this is used by
# distutils.unixccompiler to know if it should add --enable-new-dtags
# to linker command lines, and failing to detect GNU ld simply results
# in the same behaviour as before.
AC_SUBST([GNULD])
AC_MSG_CHECKING([for GNU ld])
ac_prog=ld
if test "$ac_cv_cc_name" = "gcc"; then
ac_prog=`$CC -print-prog-name=ld`
fi
case `"$ac_prog" -V 2>&1 < /dev/null` in
*GNU*)
GNULD=yes;;
*)
GNULD=no;;
esac
AC_MSG_RESULT([$GNULD])
AC_MSG_CHECKING([for --enable-shared])
AC_ARG_ENABLE([shared],
AS_HELP_STRING([--enable-shared], [enable building a shared Python library (default is no)]))
if test -z "$enable_shared"
then
case $ac_sys_system in
CYGWIN*)
enable_shared="yes";;
*)
enable_shared="no";;
esac
fi
AC_MSG_RESULT([$enable_shared])
# --with-static-libpython
STATIC_LIBPYTHON=1
AC_MSG_CHECKING([for --with-static-libpython])
AC_ARG_WITH([static-libpython],
AS_HELP_STRING([--without-static-libpython],
[do not build libpythonMAJOR.MINOR.a and do not install python.o (default is yes)]),
[
if test "$withval" = no
then
AC_MSG_RESULT([no]);
STATIC_LIBPYTHON=0
else
AC_MSG_RESULT([yes]);
fi],
[AC_MSG_RESULT([yes])])
AC_SUBST([STATIC_LIBPYTHON])
AC_MSG_CHECKING([for --enable-profiling])
AC_ARG_ENABLE([profiling],
AS_HELP_STRING([--enable-profiling], [enable C-level code profiling with gprof (default is no)]))
if test "x$enable_profiling" = xyes; then
ac_save_cc="$CC"
CC="$CC -pg"
AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void) { return 0; }]])],
[],
[enable_profiling=no])
CC="$ac_save_cc"
else
enable_profiling=no
fi
AC_MSG_RESULT([$enable_profiling])
if test "x$enable_profiling" = xyes; then
BASECFLAGS="-pg $BASECFLAGS"
LDFLAGS="-pg $LDFLAGS"
fi
AC_MSG_CHECKING([LDLIBRARY])
# Apple framework builds need more magic. LDLIBRARY is the dynamic
# library that we build, but we do not want to link against it (we
# will find it with a -framework option). For this reason there is an
# extra variable BLDLIBRARY against which Python and the extension
# modules are linked, BLDLIBRARY. This is normally the same as
# LDLIBRARY, but empty for MacOSX framework builds. iOS does the same,
# but uses a non-versioned framework layout.
if test "$enable_framework"
then
case $ac_sys_system in
Darwin)
LDLIBRARY='$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)';;
iOS)
LDLIBRARY='$(PYTHONFRAMEWORKDIR)/$(PYTHONFRAMEWORK)';;
*)
AC_MSG_ERROR([Unknown platform for framework build]);;
esac
BLDLIBRARY=''
RUNSHARED=DYLD_FRAMEWORK_PATH=`pwd`${DYLD_FRAMEWORK_PATH:+:${DYLD_FRAMEWORK_PATH}}
else
BLDLIBRARY='$(LDLIBRARY)'
fi
# Other platforms follow
if test $enable_shared = "yes"; then
PY_ENABLE_SHARED=1
AC_DEFINE([Py_ENABLE_SHARED], [1],
[Defined if Python is built as a shared library.])
case $ac_sys_system in
CYGWIN*)
LDLIBRARY='libpython$(LDVERSION).dll.a'
BLDLIBRARY='-L. -lpython$(LDVERSION)'
DLLLIBRARY='libpython$(LDVERSION).dll'
;;
SunOS*)
LDLIBRARY='libpython$(LDVERSION).so'
BLDLIBRARY='-Wl,-R,$(LIBDIR) -L. -lpython$(LDVERSION)'
RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
INSTSONAME="$LDLIBRARY".$SOVERSION
if test "$with_pydebug" != yes
then
PY3LIBRARY=libpython3.so
fi
;;
Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*|OpenBSD*|VxWorks*)
LDLIBRARY='libpython$(LDVERSION).so'
BLDLIBRARY='-L. -lpython$(LDVERSION)'
RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
# The Android Gradle plugin will only package libraries whose names end
# with ".so".
if test "$ac_sys_system" != "Linux-android"; then
INSTSONAME="$LDLIBRARY".$SOVERSION
fi
if test "$with_pydebug" != yes
then
PY3LIBRARY=libpython3.so
fi
;;
hp*|HP*)
case `uname -m` in
ia64)
LDLIBRARY='libpython$(LDVERSION).so'
;;
*)
LDLIBRARY='libpython$(LDVERSION).sl'
;;
esac
BLDLIBRARY='-Wl,+b,$(LIBDIR) -L. -lpython$(LDVERSION)'
RUNSHARED=SHLIB_PATH=`pwd`${SHLIB_PATH:+:${SHLIB_PATH}}
;;
Darwin*)
LDLIBRARY='libpython$(LDVERSION).dylib'
BLDLIBRARY='-L. -lpython$(LDVERSION)'
RUNSHARED=DYLD_LIBRARY_PATH=`pwd`${DYLD_LIBRARY_PATH:+:${DYLD_LIBRARY_PATH}}
;;
iOS)
LDLIBRARY='libpython$(LDVERSION).dylib'
;;
AIX*)
LDLIBRARY='libpython$(LDVERSION).so'
RUNSHARED=LIBPATH=`pwd`${LIBPATH:+:${LIBPATH}}
;;
esac
else # shared is disabled
PY_ENABLE_SHARED=0
case $ac_sys_system in
CYGWIN*)
BLDLIBRARY='$(LIBRARY)'
LDLIBRARY='libpython$(LDVERSION).dll.a'
;;
esac
fi
AC_MSG_RESULT([$LDLIBRARY])
if test "$cross_compiling" = yes; then
RUNSHARED=
fi
AC_MSG_CHECKING([HOSTRUNNER])
AC_ARG_VAR([HOSTRUNNER], [Program to run CPython for the host platform])
if test -z "$HOSTRUNNER"
then
AS_CASE([$ac_sys_system/$ac_sys_emscripten_target],
[Emscripten/node*], [
AC_PATH_TOOL([NODE], [node], [node])
HOSTRUNNER="$NODE"
AS_VAR_IF([host_cpu], [wasm64], [AS_VAR_APPEND([HOSTRUNNER], [" --experimental-wasm-memory64"])])
],
dnl TODO: support other WASI runtimes
dnl wasmtime starts the process with "/" as CWD. For OOT builds add the
dnl directory containing _sysconfigdata to PYTHONPATH.
[WASI/*], [HOSTRUNNER='wasmtime run --wasm max-wasm-stack=16777216 --wasi preview2=n --env PYTHONPATH=/$(shell realpath --relative-to $(abs_srcdir) $(abs_builddir))/$(shell cat pybuilddir.txt):/Lib --dir $(srcdir)::/'],
[HOSTRUNNER='']
)
fi
AC_SUBST([HOSTRUNNER])
AC_MSG_RESULT([$HOSTRUNNER])
if test -n "$HOSTRUNNER"; then
dnl Pass hostrunner variable as env var in order to expand shell expressions.
PYTHON_FOR_BUILD="_PYTHON_HOSTRUNNER='$HOSTRUNNER' $PYTHON_FOR_BUILD"
fi
# LIBRARY_DEPS, LINK_PYTHON_OBJS and LINK_PYTHON_DEPS variable
AS_CASE([$ac_sys_system/$ac_sys_emscripten_target],
[Emscripten/browser*], [LIBRARY_DEPS='$(PY3LIBRARY) $(WASM_STDLIB) python.html python.worker.js'],
[LIBRARY_DEPS='$(PY3LIBRARY) $(EXPORTSYMS)']
)
LINK_PYTHON_DEPS='$(LIBRARY_DEPS)'
if test "$PY_ENABLE_SHARED" = 1 || test "$enable_framework" ; then
LIBRARY_DEPS="\$(LDLIBRARY) $LIBRARY_DEPS"
if test "$STATIC_LIBPYTHON" = 1; then
LIBRARY_DEPS="\$(LIBRARY) $LIBRARY_DEPS"
fi
# Link Python program to the shared library
LINK_PYTHON_OBJS='$(BLDLIBRARY)'
else
if test "$STATIC_LIBPYTHON" = 0; then
# Build Python needs object files but don't need to build
# Python static library
LINK_PYTHON_DEPS="$LIBRARY_DEPS \$(LIBRARY_OBJS)"
fi
LIBRARY_DEPS="\$(LIBRARY) $LIBRARY_DEPS"
# Link Python program to object files
LINK_PYTHON_OBJS='$(LIBRARY_OBJS)'
fi
AC_SUBST([LIBRARY_DEPS])
AC_SUBST([LINK_PYTHON_DEPS])
AC_SUBST([LINK_PYTHON_OBJS])
# ar program
AC_SUBST([AR])
AC_CHECK_TOOLS([AR], [ar aal], [ar])
# tweak ARFLAGS only if the user didn't set it on the command line
AC_SUBST([ARFLAGS])
if test -z "$ARFLAGS"
then
ARFLAGS="rcs"
fi
case $MACHDEP in
hp*|HP*)
# install -d does not work on HP-UX
if test -z "$INSTALL"
then
INSTALL="${srcdir}/install-sh -c"
fi
esac
AC_PROG_INSTALL
AC_PROG_MKDIR_P
# Not every filesystem supports hard links
AC_SUBST([LN])
if test -z "$LN" ; then
case $ac_sys_system in
CYGWIN*) LN="ln -s";;
*) LN=ln;;
esac
fi
# For calculating the .so ABI tag.
AC_SUBST([ABIFLAGS])
AC_SUBST([ABI_THREAD])
ABIFLAGS=""
ABI_THREAD=""
# Check for --disable-gil
# --disable-gil
AC_MSG_CHECKING([for --disable-gil])
AC_ARG_ENABLE([gil],
[AS_HELP_STRING([--disable-gil], [enable experimental support for running without the GIL (default is no)])],
[AS_VAR_IF([enable_gil], [yes], [disable_gil=no], [disable_gil=yes])], [disable_gil=no]
)
AC_MSG_RESULT([$disable_gil])
if test "$disable_gil" = "yes"
then
AC_DEFINE([Py_GIL_DISABLED], [1],
[Define if you want to disable the GIL])
# Add "t" for "threaded"
ABIFLAGS="${ABIFLAGS}t"
ABI_THREAD="t"
fi
# Check for --with-pydebug
AC_MSG_CHECKING([for --with-pydebug])
AC_ARG_WITH([pydebug],
[AS_HELP_STRING([--with-pydebug], [build with Py_DEBUG defined (default is no)]) ],
[
if test "$withval" != no
then
AC_DEFINE([Py_DEBUG], [1],
[Define if you want to build an interpreter with many run-time checks.])
AC_MSG_RESULT([yes]);
Py_DEBUG='true'
ABIFLAGS="${ABIFLAGS}d"
else AC_MSG_RESULT([no]); Py_DEBUG='false'
fi],
[AC_MSG_RESULT([no])])
# Check for --with-trace-refs
# --with-trace-refs
AC_MSG_CHECKING([for --with-trace-refs])
AC_ARG_WITH([trace-refs],
[AS_HELP_STRING([--with-trace-refs], [enable tracing references for debugging purpose (default is no)])],
[], [with_trace_refs=no]
)
AC_MSG_RESULT([$with_trace_refs])
if test "$with_trace_refs" = "yes"
then
AC_DEFINE([Py_TRACE_REFS], [1],
[Define if you want to enable tracing references for debugging purpose])
fi
if test "$disable_gil" = "yes" -a "$with_trace_refs" = "yes";
then
AC_MSG_ERROR([--disable-gil cannot be used with --with-trace-refs])
fi
# Check for --enable-pystats
AC_MSG_CHECKING([for --enable-pystats])
AC_ARG_ENABLE([pystats],
[AS_HELP_STRING(
[--enable-pystats],
[enable internal statistics gathering (default is no)]
)],
[], [enable_pystats=no]
)
AC_MSG_RESULT([$enable_pystats])
AS_VAR_IF([enable_pystats], [yes], [
AC_DEFINE([Py_STATS], [1], [Define if you want to enable internal statistics gathering.])
])
# Check for --with-assertions.
# This allows enabling assertions without Py_DEBUG.
assertions='false'
AC_MSG_CHECKING([for --with-assertions])
AC_ARG_WITH([assertions],
AS_HELP_STRING([--with-assertions],[build with C assertions enabled (default is no)]),
[
if test "$withval" != no
then
assertions='true'
fi],
[])
if test "$assertions" = 'true'; then
AC_MSG_RESULT([yes])
elif test "$Py_DEBUG" = 'true'; then
assertions='true'
AC_MSG_RESULT([implied by --with-pydebug])
else
AC_MSG_RESULT([no])
fi
# Check for --enable-experimental-jit:
AC_MSG_CHECKING([for --enable-experimental-jit])
AC_ARG_ENABLE([experimental-jit],
[AS_HELP_STRING([--enable-experimental-jit@<:@=no|yes|yes-off|interpreter@:>@],
[build the experimental just-in-time compiler (default is no)])],
[],
[enable_experimental_jit=no])
case $enable_experimental_jit in
no) jit_flags=""; tier2_flags="" ;;
yes) jit_flags="-D_Py_JIT"; tier2_flags="-D_Py_TIER2=1" ;;
yes-off) jit_flags="-D_Py_JIT"; tier2_flags="-D_Py_TIER2=3" ;;
interpreter) jit_flags=""; tier2_flags="-D_Py_TIER2=4" ;;
interpreter-off) jit_flags=""; tier2_flags="-D_Py_TIER2=6" ;; # Secret option
*) AC_MSG_ERROR(
[invalid argument: --enable-experimental-jit=$enable_experimental_jit; expected no|yes|yes-off|interpreter]) ;;
esac
AS_VAR_IF([tier2_flags],
[],
[],
[AS_VAR_APPEND([CFLAGS_NODIST], [" $tier2_flags"])])
AS_VAR_IF([jit_flags],
[],
[],
[AS_VAR_APPEND([CFLAGS_NODIST], [" $jit_flags"])
AS_VAR_SET([REGEN_JIT_COMMAND],
["\$(PYTHON_FOR_REGEN) \$(srcdir)/Tools/jit/build.py $host"])
AS_VAR_SET([JIT_STENCILS_H], ["jit_stencils.h"])
AS_VAR_IF([Py_DEBUG],
[true],
[AS_VAR_APPEND([REGEN_JIT_COMMAND], [" --debug"])],
[])])
AC_SUBST([REGEN_JIT_COMMAND])
AC_SUBST([JIT_STENCILS_H])
AC_MSG_RESULT([$tier2_flags $jit_flags])
# Enable optimization flags
AC_SUBST([DEF_MAKE_ALL_RULE])
AC_SUBST([DEF_MAKE_RULE])
Py_OPT='false'
AC_MSG_CHECKING([for --enable-optimizations])
AC_ARG_ENABLE([optimizations], AS_HELP_STRING(
[--enable-optimizations],
[enable expensive, stable optimizations (PGO, etc.) (default is no)]),
[
if test "$enableval" != no
then
Py_OPT='true'
AC_MSG_RESULT([yes]);
else
Py_OPT='false'
AC_MSG_RESULT([no]);
fi],
[AC_MSG_RESULT([no])])
if test "$Py_OPT" = 'true' ; then
# Intentionally not forcing Py_LTO='true' here. Too many toolchains do not
# compile working code using it and both test_distutils and test_gdb are
# broken when you do manage to get a toolchain that works with it. People
# who want LTO need to use --with-lto themselves.
DEF_MAKE_ALL_RULE="profile-opt"
REQUIRE_PGO="yes"
DEF_MAKE_RULE="build_all"
AS_VAR_IF([ac_cv_gcc_compat], [yes], [
AX_CHECK_COMPILE_FLAG([-fno-semantic-interposition],[
CFLAGS_NODIST="$CFLAGS_NODIST -fno-semantic-interposition"
LDFLAGS_NODIST="$LDFLAGS_NODIST -fno-semantic-interposition"
], [], [-Werror])
])
elif test "$ac_sys_system" = "Emscripten" -o "$ac_sys_system" = "WASI"; then
dnl Emscripten does not support shared extensions yet. Build
dnl "python.[js,wasm]", "pybuilddir.txt", and "platform" files.
DEF_MAKE_ALL_RULE="build_wasm"
REQUIRE_PGO="no"
DEF_MAKE_RULE="all"
else
DEF_MAKE_ALL_RULE="build_all"
REQUIRE_PGO="no"
DEF_MAKE_RULE="all"
fi
AC_ARG_VAR([PROFILE_TASK], [Python args for PGO generation task])
AC_MSG_CHECKING([PROFILE_TASK])
if test -z "$PROFILE_TASK"
then
PROFILE_TASK='-m test --pgo --timeout=$(TESTTIMEOUT)'
fi
AC_MSG_RESULT([$PROFILE_TASK])
# Make llvm-related checks work on systems where llvm tools are not installed with their
# normal names in the default $PATH (ie: Ubuntu). They exist under the
# non-suffixed name in their versioned llvm directory.
llvm_bin_dir=''
llvm_path="${PATH}"
if test "${ac_cv_cc_name}" = "clang"
then
clang_bin=`which clang`
# Some systems install clang elsewhere as a symlink to the real path
# which is where the related llvm tools are located.
if test -L "${clang_bin}"
then
clang_dir=`dirname "${clang_bin}"`
clang_bin=`readlink "${clang_bin}"`
llvm_bin_dir="${clang_dir}/"`dirname "${clang_bin}"`
llvm_path="${llvm_path}${PATH_SEPARATOR}${llvm_bin_dir}"
fi
fi
# Enable LTO flags
AC_MSG_CHECKING([for --with-lto])
AC_ARG_WITH([lto],
[AS_HELP_STRING([--with-lto=@<:@full|thin|no|yes@:>@], [enable Link-Time-Optimization in any build (default is no)])],
[
case "$withval" in
full)
Py_LTO='true'
Py_LTO_POLICY='full'
AC_MSG_RESULT([yes])
;;
thin)
Py_LTO='true'
Py_LTO_POLICY='thin'
AC_MSG_RESULT([yes])
;;
yes)
Py_LTO='true'
Py_LTO_POLICY='default'
AC_MSG_RESULT([yes])
;;
no)
Py_LTO='false'
AC_MSG_RESULT([no])
;;
*)
Py_LTO='false'
AC_MSG_ERROR([unknown lto option: '$withval'])
;;
esac
],
[AC_MSG_RESULT([no])])
if test "$Py_LTO" = 'true' ; then
case $ac_cv_cc_name in
clang)
LDFLAGS_NOLTO="-fno-lto"
dnl Clang linker requires -flto in order to link objects with LTO information.
dnl Thin LTO is faster and works for object files with full LTO information, too.
AX_CHECK_COMPILE_FLAG([-flto=thin],[LDFLAGS_NOLTO="-flto=thin"],[LDFLAGS_NOLTO="-flto"])
AC_SUBST([LLVM_AR])
AC_PATH_TOOL([LLVM_AR], [llvm-ar], [''], [${llvm_path}])
AC_SUBST([LLVM_AR_FOUND])
if test -n "${LLVM_AR}" -a -x "${LLVM_AR}"
then
LLVM_AR_FOUND="found"
else
LLVM_AR_FOUND="not-found"
fi
if test "$ac_sys_system" = "Darwin" -a "${LLVM_AR_FOUND}" = "not-found"
then
# The Apple-supplied ar in Xcode or the Command Line Tools is apparently sufficient
found_llvm_ar=`/usr/bin/xcrun -find ar 2>/dev/null`
if test -n "${found_llvm_ar}"
then
LLVM_AR='/usr/bin/xcrun ar'
LLVM_AR_FOUND=found
AC_MSG_NOTICE([llvm-ar found via xcrun: ${LLVM_AR}])
fi
fi
if test $LLVM_AR_FOUND = not-found
then
LLVM_PROFR_ERR=yes
AC_MSG_ERROR([llvm-ar is required for a --with-lto build with clang but could not be found.])
else
LLVM_AR_ERR=no
fi
AR="${LLVM_AR}"
case $ac_sys_system in
Darwin*)
# Any changes made here should be reflected in the GCC+Darwin case below
if test $Py_LTO_POLICY = default
then
# Check that ThinLTO is accepted.
AX_CHECK_COMPILE_FLAG([-flto=thin],[
LTOFLAGS="-flto=thin -Wl,-export_dynamic -Wl,-object_path_lto,\"\$@\".lto"
LTOCFLAGS="-flto=thin"
],[
LTOFLAGS="-flto -Wl,-export_dynamic -Wl,-object_path_lto,\"\$@\".lto"
LTOCFLAGS="-flto"
]
)
else
LTOFLAGS="-flto=${Py_LTO_POLICY} -Wl,-export_dynamic -Wl,-object_path_lto,\"\$@\".lto"
LTOCFLAGS="-flto=${Py_LTO_POLICY}"
fi
;;
*)
if test $Py_LTO_POLICY = default
then
# Check that ThinLTO is accepted
AX_CHECK_COMPILE_FLAG([-flto=thin],[LTOFLAGS="-flto=thin"],[LTOFLAGS="-flto"])
else
LTOFLAGS="-flto=${Py_LTO_POLICY}"
fi
;;
esac
;;
emcc)
if test "$Py_LTO_POLICY" != "default"; then
AC_MSG_ERROR([emcc supports only default lto.])
fi
LTOFLAGS="-flto"
LTOCFLAGS="-flto"
;;
gcc)
if test $Py_LTO_POLICY = thin
then
AC_MSG_ERROR([thin lto is not supported under gcc compiler.])
fi
dnl flag to disable lto during linking
LDFLAGS_NOLTO="-fno-lto"
case $ac_sys_system in
Darwin*)
LTOFLAGS="-flto -Wl,-export_dynamic -Wl,-object_path_lto,\"\$@\".lto"
LTOCFLAGS="-flto"
;;
*)
LTOFLAGS="-flto -fuse-linker-plugin -ffat-lto-objects -flto-partition=none"
;;
esac
;;
esac
if test "$ac_cv_prog_cc_g" = "yes"
then
# bpo-30345: Add -g to LDFLAGS when compiling with LTO
# to get debug symbols.
LTOFLAGS="$LTOFLAGS -g"
fi
CFLAGS_NODIST="$CFLAGS_NODIST ${LTOCFLAGS-$LTOFLAGS}"
LDFLAGS_NODIST="$LDFLAGS_NODIST $LTOFLAGS"
fi
# Enable PGO flags.
AC_SUBST([PGO_PROF_GEN_FLAG])
AC_SUBST([PGO_PROF_USE_FLAG])
AC_SUBST([LLVM_PROF_MERGER])
AC_SUBST([LLVM_PROF_FILE])
AC_SUBST([LLVM_PROF_ERR])
AC_SUBST([LLVM_PROFDATA])
AC_PATH_TOOL([LLVM_PROFDATA], [llvm-profdata], [''], [${llvm_path}])
AC_SUBST([LLVM_PROF_FOUND])
if test -n "${LLVM_PROFDATA}" -a -x "${LLVM_PROFDATA}"
then
LLVM_PROF_FOUND="found"
else
LLVM_PROF_FOUND="not-found"
fi
if test "$ac_sys_system" = "Darwin" -a "${LLVM_PROF_FOUND}" = "not-found"
then
found_llvm_profdata=`/usr/bin/xcrun -find llvm-profdata 2>/dev/null`
if test -n "${found_llvm_profdata}"
then
# llvm-profdata isn't directly in $PATH in some cases.
# https://apple.stackexchange.com/questions/197053/
LLVM_PROFDATA='/usr/bin/xcrun llvm-profdata'
LLVM_PROF_FOUND=found
AC_MSG_NOTICE([llvm-profdata found via xcrun: ${LLVM_PROFDATA}])
fi
fi
LLVM_PROF_ERR=no
case "$ac_cv_cc_name" in
clang)
# Any changes made here should be reflected in the GCC+Darwin case below
PGO_PROF_GEN_FLAG="-fprofile-instr-generate"
PGO_PROF_USE_FLAG="-fprofile-instr-use=\"\$(shell pwd)/code.profclangd\""
LLVM_PROF_MERGER=m4_normalize("
${LLVM_PROFDATA} merge
-output=\"\$(shell pwd)/code.profclangd\"
\"\$(shell pwd)\"/*.profclangr
")
LLVM_PROF_FILE="LLVM_PROFILE_FILE=\"\$(shell pwd)/code-%p.profclangr\""
if test $LLVM_PROF_FOUND = not-found
then
LLVM_PROF_ERR=yes
if test "${REQUIRE_PGO}" = "yes"
then
AC_MSG_ERROR([llvm-profdata is required for a --enable-optimizations build but could not be found.])
fi
fi
;;
gcc)
PGO_PROF_GEN_FLAG="-fprofile-generate"
PGO_PROF_USE_FLAG="-fprofile-use -fprofile-correction"
LLVM_PROF_MERGER="true"
LLVM_PROF_FILE=""
;;
icc)
PGO_PROF_GEN_FLAG="-prof-gen"
PGO_PROF_USE_FLAG="-prof-use"
LLVM_PROF_MERGER="true"
LLVM_PROF_FILE=""
;;
esac
# BOLT optimization. Always configured after PGO since it always runs after PGO.
Py_BOLT='false'
AC_MSG_CHECKING([for --enable-bolt])
AC_ARG_ENABLE([bolt], [AS_HELP_STRING(
[--enable-bolt],
[enable usage of the llvm-bolt post-link optimizer (default is no)])],
[
if test "$enableval" != no
then
Py_BOLT='true'
AC_MSG_RESULT([yes]);
else
Py_BOLT='false'
AC_MSG_RESULT([no]);
fi],
[AC_MSG_RESULT([no])])
AC_SUBST([PREBOLT_RULE])
if test "$Py_BOLT" = 'true' ; then
PREBOLT_RULE="${DEF_MAKE_ALL_RULE}"
DEF_MAKE_ALL_RULE="bolt-opt"
DEF_MAKE_RULE="build_all"
# -fno-reorder-blocks-and-partition is required for bolt to work.
# Possibly GCC only.
AX_CHECK_COMPILE_FLAG([-fno-reorder-blocks-and-partition],[
CFLAGS_NODIST="$CFLAGS_NODIST -fno-reorder-blocks-and-partition"
])
# These flags are required for bolt to work:
LDFLAGS_NODIST="$LDFLAGS_NODIST -Wl,--emit-relocs"
# These flags are required to get good performance from bolt:
CFLAGS_NODIST="$CFLAGS_NODIST -fno-pie"
# We want to add these no-pie flags to linking executables but not shared libraries:
LINKCC="$LINKCC -fno-pie -no-pie"
AC_SUBST([LLVM_BOLT])
AC_PATH_TOOL([LLVM_BOLT], [llvm-bolt], [''], [${llvm_path}])
if test -n "${LLVM_BOLT}" -a -x "${LLVM_BOLT}"
then
AC_MSG_RESULT(["Found llvm-bolt"])
else
AC_MSG_ERROR([llvm-bolt is required for a --enable-bolt build but could not be found.])
fi
AC_SUBST([MERGE_FDATA])
AC_PATH_TOOL([MERGE_FDATA], [merge-fdata], [''], [${llvm_path}])
if test -n "${MERGE_FDATA}" -a -x "${MERGE_FDATA}"
then
AC_MSG_RESULT(["Found merge-fdata"])
else
AC_MSG_ERROR([merge-fdata is required for a --enable-bolt build but could not be found.])
fi
fi
dnl Enable BOLT of libpython if built.
AC_SUBST([BOLT_BINARIES])
BOLT_BINARIES='$(BUILDPYTHON)'
AS_VAR_IF([enable_shared], [yes], [
BOLT_BINARIES="${BOLT_BINARIES} \$(INSTSONAME)"
])
AC_ARG_VAR(
[BOLT_INSTRUMENT_FLAGS],
[Arguments to llvm-bolt when instrumenting binaries]
)
AC_MSG_CHECKING([BOLT_INSTRUMENT_FLAGS])
if test -z "${BOLT_INSTRUMENT_FLAGS}"
then
BOLT_INSTRUMENT_FLAGS=
fi
AC_MSG_RESULT([$BOLT_INSTRUMENT_FLAGS])
AC_ARG_VAR(
[BOLT_APPLY_FLAGS],
[Arguments to llvm-bolt when creating a BOLT optimized binary]
)
AC_MSG_CHECKING([BOLT_APPLY_FLAGS])
if test -z "${BOLT_APPLY_FLAGS}"
then
AS_VAR_SET(
[BOLT_APPLY_FLAGS],
[m4_normalize("
-update-debug-sections
-reorder-blocks=ext-tsp
-reorder-functions=hfsort+
-split-functions
-icf=1
-inline-all
-split-eh
-reorder-functions-use-hot-size
-peepholes=none
-jump-tables=aggressive
-inline-ap
-indirect-call-promotion=all
-dyno-stats
-use-gnu-stack
-frame-opt=hot
")]
)
fi
AC_MSG_RESULT([$BOLT_APPLY_FLAGS])
# XXX Shouldn't the code above that fiddles with BASECFLAGS and OPT be
# merged with this chunk of code?
# Optimizer/debugger flags
# ------------------------
# (The following bit of code is complicated enough - please keep things
# indented properly. Just pretend you're editing Python code. ;-)
# There are two parallel sets of case statements below, one that checks to
# see if OPT was set and one that does BASECFLAGS setting based upon
# compiler and platform. BASECFLAGS tweaks need to be made even if the
# user set OPT.
dnl Historically, some of our code assumed that signed integer overflow
dnl is defined behaviour via twos-complement.
dnl Set STRICT_OVERFLOW_CFLAGS and NO_STRICT_OVERFLOW_CFLAGS depending on compiler support.
dnl Pass the latter to modules that depend on such behaviour.
_SAVE_VAR([CFLAGS])
CFLAGS="-fstrict-overflow -fno-strict-overflow"
AC_CACHE_CHECK([if $CC supports -fstrict-overflow and -fno-strict-overflow],
[ac_cv_cc_supports_fstrict_overflow],
AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM([[]], [[]])],
[ac_cv_cc_supports_fstrict_overflow=yes],
[ac_cv_cc_supports_fstrict_overflow=no]
)
)
_RESTORE_VAR([CFLAGS])
AS_VAR_IF([ac_cv_cc_supports_fstrict_overflow], [yes],
[STRICT_OVERFLOW_CFLAGS="-fstrict-overflow"
NO_STRICT_OVERFLOW_CFLAGS="-fno-strict-overflow"],
[STRICT_OVERFLOW_CFLAGS=""
NO_STRICT_OVERFLOW_CFLAGS=""])
AC_MSG_CHECKING([for --with-strict-overflow])
AC_ARG_WITH([strict-overflow],
AS_HELP_STRING(
[--with-strict-overflow],
[if 'yes', add -fstrict-overflow to CFLAGS, else add -fno-strict-overflow (default is no)]
),
[
AS_VAR_IF(
[ac_cv_cc_supports_fstrict_overflow], [no],
[AC_MSG_WARN([--with-strict-overflow=yes requires a compiler that supports -fstrict-overflow])],
[]
)
],
[with_strict_overflow=no]
)
AC_MSG_RESULT([$with_strict_overflow])
# Check if CC supports -Og optimization level
_SAVE_VAR([CFLAGS])
CFLAGS="-Og"
AC_CACHE_CHECK([if $CC supports -Og optimization level],
[ac_cv_cc_supports_og],
AC_COMPILE_IFELSE(
[
AC_LANG_PROGRAM([[]], [[]])
],[
ac_cv_cc_supports_og=yes
],[
ac_cv_cc_supports_og=no
])
)
_RESTORE_VAR([CFLAGS])
# Optimization messes up debuggers, so turn it off for
# debug builds.
PYDEBUG_CFLAGS="-O0"
AS_VAR_IF([ac_cv_cc_supports_og], [yes],
[PYDEBUG_CFLAGS="-Og"])
# gh-120688: WASI uses -O3 in debug mode to support more recursive calls
if test "$ac_sys_system" = "WASI"; then
PYDEBUG_CFLAGS="-O3"
fi
# tweak OPT based on compiler and platform, only if the user didn't set
# it on the command line
AC_SUBST([OPT])
AC_SUBST([CFLAGS_ALIASING])
if test "${OPT-unset}" = "unset"
then
case $GCC in
yes)
if test "${ac_cv_cc_name}" != "clang"
then
# bpo-30104: disable strict aliasing to compile correctly dtoa.c,
# see Makefile.pre.in for more information
CFLAGS_ALIASING="-fno-strict-aliasing"
fi
case $ac_cv_prog_cc_g in
yes)
if test "$Py_DEBUG" = 'true' ; then
OPT="-g $PYDEBUG_CFLAGS -Wall"
else
OPT="-g -O3 -Wall"
fi
;;
*)
OPT="-O3 -Wall"
;;
esac
case $ac_sys_system in
SCO_SV*) OPT="$OPT -m486 -DSCO5"
;;
esac
;;
*)
OPT="-O"
;;
esac
fi
# WASM flags
AS_CASE([$ac_sys_system],
[Emscripten], [
dnl build with WASM debug info if either Py_DEBUG is set or the target is
dnl node-debug or browser-debug.
AS_VAR_IF([Py_DEBUG], [yes], [wasm_debug=yes], [wasm_debug=no])
dnl Start with 20 MB and allow to grow
AS_VAR_APPEND([LDFLAGS_NODIST], [" -sALLOW_MEMORY_GROWTH -sTOTAL_MEMORY=20971520"])
dnl map int64_t and uint64_t to JS bigint
AS_VAR_APPEND([LDFLAGS_NODIST], [" -sWASM_BIGINT"])
dnl Include file system support
AS_VAR_APPEND([LDFLAGS_NODIST], [" -sFORCE_FILESYSTEM -lidbfs.js -lnodefs.js -lproxyfs.js -lworkerfs.js"])
AS_VAR_IF([enable_wasm_dynamic_linking], [yes], [
AS_VAR_APPEND([LINKFORSHARED], [" -sMAIN_MODULE"])
])
AS_VAR_IF([enable_wasm_pthreads], [yes], [
AS_VAR_APPEND([CFLAGS_NODIST], [" -pthread"])
AS_VAR_APPEND([LDFLAGS_NODIST], [" -sUSE_PTHREADS"])
AS_VAR_APPEND([LINKFORSHARED], [" -sPROXY_TO_PTHREAD"])
])
AS_CASE([$ac_sys_emscripten_target],
[browser*], [
AS_VAR_IF([ac_sys_emscripten_target], [browser-debug], [wasm_debug=yes])
AS_VAR_APPEND([LINKFORSHARED], [" --preload-file=\$(WASM_ASSETS_DIR)"])
WASM_ASSETS_DIR=".\$(prefix)"
WASM_STDLIB="\$(WASM_ASSETS_DIR)/local/lib/python\$(VERSION)/os.py"
dnl separate-dwarf does not seem to work in Chrome DevTools Support.
WASM_LINKFORSHARED_DEBUG="-gsource-map --emit-symbol-map"
],
[node*], [
AS_VAR_IF([ac_sys_emscripten_target], [node-debug], [wasm_debug=yes])
AS_VAR_APPEND([LDFLAGS_NODIST], [" --pre-js=\$(srcdir)/Tools/wasm/emscripten/node_pre.js"])
AS_VAR_APPEND([LDFLAGS_NODIST], [" -sALLOW_MEMORY_GROWTH -sNODERAWFS"])
AS_VAR_APPEND([LINKFORSHARED], [" -sEXIT_RUNTIME"])
WASM_LINKFORSHARED_DEBUG="-gseparate-dwarf --emit-symbol-map"
]
)
AS_VAR_IF([wasm_debug], [yes], [
AS_VAR_APPEND([LDFLAGS_NODIST], [" -sASSERTIONS"])
AS_VAR_APPEND([LINKFORSHARED], [" $WASM_LINKFORSHARED_DEBUG"])
], [
AS_VAR_APPEND([LINKFORSHARED], [" -O2 -g0"])
])
],
[WASI], [
AC_DEFINE([_WASI_EMULATED_SIGNAL], [1], [Define to 1 if you want to emulate signals on WASI])
AC_DEFINE([_WASI_EMULATED_GETPID], [1], [Define to 1 if you want to emulate getpid() on WASI])
AC_DEFINE([_WASI_EMULATED_PROCESS_CLOCKS], [1], [Define to 1 if you want to emulate process clocks on WASI])
LIBS="$LIBS -lwasi-emulated-signal -lwasi-emulated-getpid -lwasi-emulated-process-clocks"
echo "#define _WASI_EMULATED_SIGNAL 1" >> confdefs.h
AS_VAR_IF([enable_wasm_pthreads], [yes], [
# Note: update CFLAGS because ac_compile/ac_link needs this too.
# without this, configure fails to find pthread_create, sem_init,
# etc because they are only available in the sysroot for
# wasm32-wasi-threads.
# Note: wasi-threads requires --import-memory.
# Note: wasi requires --export-memory.
# Note: --export-memory is implicit unless --import-memory is given
# Note: this requires LLVM >= 16.
AS_VAR_APPEND([CFLAGS], [" -target wasm32-wasi-threads -pthread"])
AS_VAR_APPEND([CFLAGS_NODIST], [" -target wasm32-wasi-threads -pthread"])
AS_VAR_APPEND([LDFLAGS_NODIST], [" -target wasm32-wasi-threads -pthread"])
AS_VAR_APPEND([LDFLAGS_NODIST], [" -Wl,--import-memory"])
AS_VAR_APPEND([LDFLAGS_NODIST], [" -Wl,--export-memory"])
AS_VAR_APPEND([LDFLAGS_NODIST], [" -Wl,--max-memory=10485760"])
])
dnl gh-117645: Set the memory size to 40 MiB, the stack size to 16 MiB,
dnl and move the stack first.
dnl https://github.com/WebAssembly/wasi-libc/issues/233
AS_VAR_APPEND([LDFLAGS_NODIST], [" -z stack-size=16777216 -Wl,--stack-first -Wl,--initial-memory=41943040"])
]
)
AS_CASE([$enable_wasm_dynamic_linking],
[yes], [ac_cv_func_dlopen=yes],
[no], [ac_cv_func_dlopen=no],
[missing], []
)
AC_SUBST([BASECFLAGS])
AC_SUBST([CFLAGS_NODIST])
AC_SUBST([LDFLAGS_NODIST])
AC_SUBST([LDFLAGS_NOLTO])
AC_SUBST([WASM_ASSETS_DIR])
AC_SUBST([WASM_STDLIB])
# The -arch flags for universal builds on macOS
UNIVERSAL_ARCH_FLAGS=
AC_SUBST([UNIVERSAL_ARCH_FLAGS])
dnl PY_CHECK_CC_WARNING(ENABLE, WARNING, [MSG])
AC_DEFUN([PY_CHECK_CC_WARNING], [
AS_VAR_PUSHDEF([py_var], [ac_cv_$1_]m4_normalize($2)[_warning])
AC_CACHE_CHECK([m4_ifblank([$3], [if we can $1 $CC $2 warning], [$3])], [py_var], [
AS_VAR_COPY([py_cflags], [CFLAGS])
AS_VAR_APPEND([CFLAGS], [" -W$2 -Werror"])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
[AS_VAR_SET([py_var], [yes])],
[AS_VAR_SET([py_var], [no])])
AS_VAR_COPY([CFLAGS], [py_cflags])
])
AS_VAR_POPDEF([py_var])
])
# tweak BASECFLAGS based on compiler and platform
AS_VAR_IF([with_strict_overflow], [yes],
[BASECFLAGS="$BASECFLAGS $STRICT_OVERFLOW_CFLAGS"],
[BASECFLAGS="$BASECFLAGS $NO_STRICT_OVERFLOW_CFLAGS"])
# Enable flags that warn and protect for potential security vulnerabilities.
# These flags should be enabled by default for all builds.
AC_MSG_CHECKING([for --enable-safety])
AC_ARG_ENABLE([safety],
[AS_HELP_STRING([--enable-safety], [enable usage of the security compiler options with no performance overhead])],
[AS_VAR_IF([disable_safety], [yes], [enable_safety=no], [enable_safety=yes])], [enable_safety=no])
AC_MSG_RESULT([$enable_safety])
if test "$enable_safety" = "yes"
then
AX_CHECK_COMPILE_FLAG([-fstack-protector-strong], [CFLAGS_NODIST="$CFLAGS_NODIST -fstack-protector-strong"], [AC_MSG_WARN([-fstack-protector-strong not supported])], [-Werror])
AX_CHECK_COMPILE_FLAG([-Wtrampolines], [CFLAGS_NODIST="$CFLAGS_NODIST -Wtrampolines"], [AC_MSG_WARN([-Wtrampolines not supported])], [-Werror])
AX_CHECK_COMPILE_FLAG([-Wimplicit-fallthrough], [CFLAGS_NODIST="$CFLAGS_NODIST -Wimplicit-fallthrough"], [AC_MSG_WARN([-Wimplicit-fallthrough not supported])], [-Werror])
AX_CHECK_COMPILE_FLAG([-Werror=format-security], [CFLAGS_NODIST="$CFLAGS_NODIST -Werror=format-security"], [AC_MSG_WARN([-Werror=format-security not supported])], [-Werror])
AX_CHECK_COMPILE_FLAG([-Wbidi-chars=any], [CFLAGS_NODIST="$CFLAGS_NODIST -Wbidi-chars=any"], [AC_MSG_WARN([-Wbidi-chars=any not supported])], [-Werror])
AX_CHECK_COMPILE_FLAG([-Wall], [CFLAGS_NODIST="$CFLAGS_NODIST -Wall"], [AC_MSG_WARN([-Wall not supported])], [-Werror])
fi
AC_MSG_CHECKING([for --enable-slower-safety])
AC_ARG_ENABLE([slower-safety],
[AS_HELP_STRING([--enable-slower-safety], [enable usage of the security compiler options with performance overhead])],
[AS_VAR_IF([disable_slower_safety], [yes], [enable_slower_safety=no], [enable_slower_safety=yes])], [enable_slower_safety=no])
AC_MSG_RESULT([$enable_slower_safety])
if test "$enable_slower_safety" = "yes"
then
AX_CHECK_COMPILE_FLAG([-D_FORTIFY_SOURCE=3], [CFLAGS_NODIST="$CFLAGS_NODIST -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3"], [AC_MSG_WARN([-D_FORTIFY_SOURCE=3 not supported])], [-Werror])
fi
AS_VAR_IF([ac_cv_gcc_compat], [yes], [
CFLAGS_NODIST="$CFLAGS_NODIST -std=c11"
PY_CHECK_CC_WARNING([enable], [extra], [if we can add -Wextra])
AS_VAR_IF([ac_cv_enable_extra_warning], [yes],
[CFLAGS_NODIST="$CFLAGS_NODIST -Wextra"])
# Python doesn't violate C99 aliasing rules, but older versions of
# GCC produce warnings for legal Python code. Enable
# -fno-strict-aliasing on versions of GCC that support but produce
# warnings. See Issue3326
ac_save_cc="$CC"
CC="$CC -fno-strict-aliasing"
save_CFLAGS="$CFLAGS"
AC_CACHE_CHECK([whether $CC accepts and needs -fno-strict-aliasing],
[ac_cv_no_strict_aliasing],
AC_COMPILE_IFELSE(
[
AC_LANG_PROGRAM([[]], [[]])
],[
CC="$ac_save_cc -fstrict-aliasing"
CFLAGS="$CFLAGS -Werror -Wstrict-aliasing"
AC_COMPILE_IFELSE(
[
AC_LANG_PROGRAM([[void f(int **x) {}]],
[[double *x; f((int **) &x);]])
],[
ac_cv_no_strict_aliasing=no
],[
ac_cv_no_strict_aliasing=yes
])
],[
ac_cv_no_strict_aliasing=no
]))
CFLAGS="$save_CFLAGS"
CC="$ac_save_cc"
AS_VAR_IF([ac_cv_no_strict_aliasing], [yes],
[BASECFLAGS="$BASECFLAGS -fno-strict-aliasing"])
# ICC doesn't recognize the option, but only emits a warning
## XXX does it emit an unused result warning and can it be disabled?
AS_CASE(["$ac_cv_cc_name"],
[icc], [ac_cv_disable_unused_result_warning=no]
[PY_CHECK_CC_WARNING([disable], [unused-result])])
AS_VAR_IF([ac_cv_disable_unused_result_warning], [yes],
[BASECFLAGS="$BASECFLAGS -Wno-unused-result"
CFLAGS_NODIST="$CFLAGS_NODIST -Wno-unused-result"])
PY_CHECK_CC_WARNING([disable], [unused-parameter])
AS_VAR_IF([ac_cv_disable_unused_parameter_warning], [yes],
[CFLAGS_NODIST="$CFLAGS_NODIST -Wno-unused-parameter"])
PY_CHECK_CC_WARNING([disable], [int-conversion])
AS_VAR_IF([ac_cv_disable_int_conversion], [yes],
[CFLAGS_NODIST="$CFLAGS_NODIST -Wno-int-conversion"])
PY_CHECK_CC_WARNING([disable], [missing-field-initializers])
AS_VAR_IF([ac_cv_disable_missing_field_initializers_warning], [yes],
[CFLAGS_NODIST="$CFLAGS_NODIST -Wno-missing-field-initializers"])
PY_CHECK_CC_WARNING([enable], [sign-compare])
AS_VAR_IF([ac_cv_enable_sign_compare_warning], [yes],
[BASECFLAGS="$BASECFLAGS -Wsign-compare"])
PY_CHECK_CC_WARNING([enable], [unreachable-code])
# Don't enable unreachable code warning in debug mode, since it usually
# results in non-standard code paths.
# Issue #24324: Unfortunately, the unreachable code warning does not work
# correctly on gcc and has been silently removed from the compiler.
# It is supported on clang but on OS X systems gcc may be an alias
# for clang. Try to determine if the compiler is not really gcc and,
# if so, only then enable the warning.
if test $ac_cv_enable_unreachable_code_warning = yes && \
test "$Py_DEBUG" != "true" && \
test -z "`$CC --version 2>/dev/null | grep 'Free Software Foundation'`"
then
BASECFLAGS="$BASECFLAGS -Wunreachable-code"
else
ac_cv_enable_unreachable_code_warning=no
fi
PY_CHECK_CC_WARNING([enable], [strict-prototypes])
AS_VAR_IF([ac_cv_enable_strict_prototypes_warning], [yes],
[CFLAGS_NODIST="$CFLAGS_NODIST -Wstrict-prototypes"])
ac_save_cc="$CC"
CC="$CC -Werror=implicit-function-declaration"
AC_CACHE_CHECK([if we can make implicit function declaration an error in $CC],
[ac_cv_enable_implicit_function_declaration_error],
AC_COMPILE_IFELSE(
[
AC_LANG_PROGRAM([[]], [[]])
],[
ac_cv_enable_implicit_function_declaration_error=yes
],[
ac_cv_enable_implicit_function_declaration_error=no
]))
CC="$ac_save_cc"
AS_VAR_IF([ac_cv_enable_implicit_function_declaration_error], [yes],
[CFLAGS_NODIST="$CFLAGS_NODIST -Werror=implicit-function-declaration"])
ac_save_cc="$CC"
CC="$CC -fvisibility=hidden"
AC_CACHE_CHECK([if we can use visibility in $CC], [ac_cv_enable_visibility],
AC_COMPILE_IFELSE(
[
AC_LANG_PROGRAM([[]], [[]])
],[
ac_cv_enable_visibility=yes
],[
ac_cv_enable_visibility=no
]))
CC="$ac_save_cc"
AS_VAR_IF([ac_cv_enable_visibility], [yes],
[CFLAGS_NODIST="$CFLAGS_NODIST -fvisibility=hidden"])
# if using gcc on alpha, use -mieee to get (near) full IEEE 754
# support. Without this, treatment of subnormals doesn't follow
# the standard.
case $host in
alpha*)
BASECFLAGS="$BASECFLAGS -mieee"
;;
esac
case $ac_sys_system in
SCO_SV*)
BASECFLAGS="$BASECFLAGS -m486 -DSCO5"
;;
Darwin*)
# -Wno-long-double, -no-cpp-precomp, and -mno-fused-madd
# used to be here, but non-Apple gcc doesn't accept them.
AC_MSG_CHECKING([which compiler should be used])
case "${UNIVERSALSDK}" in
*/MacOSX10.4u.sdk)
# Build using 10.4 SDK, force usage of gcc when the
# compiler is gcc, otherwise the user will get very
# confusing error messages when building on OSX 10.6
CC=gcc-4.0
CPP=cpp-4.0
;;
esac
AC_MSG_RESULT([$CC])
LIPO_INTEL64_FLAGS=""
if test "${enable_universalsdk}"
then
case "$UNIVERSAL_ARCHS" in
32-bit)
UNIVERSAL_ARCH_FLAGS="-arch ppc -arch i386"
LIPO_32BIT_FLAGS=""
ARCH_RUN_32BIT=""
;;
64-bit)
UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64"
LIPO_32BIT_FLAGS=""
ARCH_RUN_32BIT="true"
;;
all)
UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64"
LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386"
ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc"
;;
universal2)
UNIVERSAL_ARCH_FLAGS="-arch arm64 -arch x86_64"
LIPO_32BIT_FLAGS=""
LIPO_INTEL64_FLAGS="-extract x86_64"
ARCH_RUN_32BIT="true"
;;
intel)
UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64"
LIPO_32BIT_FLAGS="-extract i386"
ARCH_RUN_32BIT="/usr/bin/arch -i386"
;;
intel-32)
UNIVERSAL_ARCH_FLAGS="-arch i386"
LIPO_32BIT_FLAGS=""
ARCH_RUN_32BIT=""
;;
intel-64)
UNIVERSAL_ARCH_FLAGS="-arch x86_64"
LIPO_32BIT_FLAGS=""
ARCH_RUN_32BIT="true"
;;
3-way)
UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch x86_64"
LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386"
ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc"
;;
*)
AC_MSG_ERROR([proper usage is --with-universal-arch=universal2|32-bit|64-bit|all|intel|3-way])
;;
esac
if test "${UNIVERSALSDK}" != "/"
then
CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}"
LDFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${LDFLAGS}"
CPPFLAGS="-isysroot ${UNIVERSALSDK} ${CPPFLAGS}"
else
CFLAGS="${UNIVERSAL_ARCH_FLAGS} ${CFLAGS}"
LDFLAGS="${UNIVERSAL_ARCH_FLAGS} ${LDFLAGS}"
fi
fi
# Calculate an appropriate deployment target for this build:
# The deployment target value is used explicitly to enable certain
# features are enabled (such as builtin libedit support for readline)
# through the use of Apple's Availability Macros and is used as a
# component of the string returned by distutils.get_platform().
#
# Use the value from:
# 1. the MACOSX_DEPLOYMENT_TARGET environment variable if specified
# 2. the operating system version of the build machine if >= 10.6
# 3. If running on OS X 10.3 through 10.5, use the legacy tests
# below to pick either 10.3, 10.4, or 10.5 as the target.
# 4. If we are running on OS X 10.2 or earlier, good luck!
AC_MSG_CHECKING([which MACOSX_DEPLOYMENT_TARGET to use])
cur_target_major=`sw_vers -productVersion | \
sed 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'`
cur_target_minor=`sw_vers -productVersion | \
sed 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'`
cur_target="${cur_target_major}.${cur_target_minor}"
if test ${cur_target_major} -eq 10 && \
test ${cur_target_minor} -ge 3 && \
test ${cur_target_minor} -le 5
then
# OS X 10.3 through 10.5
cur_target=10.3
if test ${enable_universalsdk}
then
case "$UNIVERSAL_ARCHS" in
all|3-way|intel|64-bit)
# These configurations were first supported in 10.5
cur_target='10.5'
;;
esac
else
if test `/usr/bin/arch` = "i386"
then
# 10.4 was the first release to support Intel archs
cur_target="10.4"
fi
fi
fi
CONFIGURE_MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET-${cur_target}}
# Make sure that MACOSX_DEPLOYMENT_TARGET is set in the
# environment with a value that is the same as what we'll use
# in the Makefile to ensure that we'll get the same compiler
# environment during configure and build time.
MACOSX_DEPLOYMENT_TARGET="$CONFIGURE_MACOSX_DEPLOYMENT_TARGET"
export MACOSX_DEPLOYMENT_TARGET
EXPORT_MACOSX_DEPLOYMENT_TARGET=''
AC_MSG_RESULT([$MACOSX_DEPLOYMENT_TARGET])
AC_MSG_CHECKING([if specified universal architectures work])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[@%:@include <stdio.h>]], [[printf("%d", 42);]])],
[AC_MSG_RESULT([yes])],
[AC_MSG_RESULT([no])
AC_MSG_ERROR([check config.log and use the '--with-universal-archs' option])
])
# end of Darwin* tests
;;
esac
], [
case $ac_sys_system in
OpenUNIX*|UnixWare*)
BASECFLAGS="$BASECFLAGS -K pentium,host,inline,loop_unroll,alloca "
;;
SCO_SV*)
BASECFLAGS="$BASECFLAGS -belf -Ki486 -DSCO5"
;;
esac
])
case "$ac_cv_cc_name" in
mpicc)
CFLAGS_NODIST="$CFLAGS_NODIST"
;;
icc)
# ICC needs -fp-model strict or floats behave badly
CFLAGS_NODIST="$CFLAGS_NODIST -fp-model strict"
;;
xlc)
CFLAGS_NODIST="$CFLAGS_NODIST -qalias=noansi -qmaxmem=-1"
;;
esac
if test "$assertions" = 'true'; then
:
else
OPT="-DNDEBUG $OPT"
fi
if test "$ac_arch_flags"
then
BASECFLAGS="$BASECFLAGS $ac_arch_flags"
fi
# On some compilers, pthreads are available without further options
# (e.g. MacOS X). On some of these systems, the compiler will not
# complain if unaccepted options are passed (e.g. gcc on Mac OS X).
# So we have to see first whether pthreads are available without
# options before we can check whether -Kpthread improves anything.
AC_CACHE_CHECK([whether pthreads are available without options],
[ac_cv_pthread_is_default],
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <stdio.h>
#include <pthread.h>
void* routine(void* p){return NULL;}
int main(void){
pthread_t p;
if(pthread_create(&p,NULL,routine,NULL)!=0)
return 1;
(void)pthread_detach(p);
return 0;
}
]])],[
ac_cv_pthread_is_default=yes
ac_cv_kthread=no
ac_cv_pthread=no
],[ac_cv_pthread_is_default=no],[ac_cv_pthread_is_default=no])
])
if test $ac_cv_pthread_is_default = yes
then
ac_cv_kpthread=no
else
# -Kpthread, if available, provides the right #defines
# and linker options to make pthread_create available
# Some compilers won't report that they do not support -Kpthread,
# so we need to run a program to see whether it really made the
# function available.
AC_CACHE_CHECK([whether $CC accepts -Kpthread], [ac_cv_kpthread],
[ac_save_cc="$CC"
CC="$CC -Kpthread"
AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <stdio.h>
#include <pthread.h>
void* routine(void* p){return NULL;}
int main(void){
pthread_t p;
if(pthread_create(&p,NULL,routine,NULL)!=0)
return 1;
(void)pthread_detach(p);
return 0;
}
]])],[ac_cv_kpthread=yes],[ac_cv_kpthread=no],[ac_cv_kpthread=no])
CC="$ac_save_cc"])
fi
if test $ac_cv_kpthread = no -a $ac_cv_pthread_is_default = no
then
# -Kthread, if available, provides the right #defines
# and linker options to make pthread_create available
# Some compilers won't report that they do not support -Kthread,
# so we need to run a program to see whether it really made the
# function available.
AC_CACHE_CHECK([whether $CC accepts -Kthread], [ac_cv_kthread],
[ac_save_cc="$CC"
CC="$CC -Kthread"
AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <stdio.h>
#include <pthread.h>
void* routine(void* p){return NULL;}
int main(void){
pthread_t p;
if(pthread_create(&p,NULL,routine,NULL)!=0)
return 1;
(void)pthread_detach(p);
return 0;
}
]])],[ac_cv_kthread=yes],[ac_cv_kthread=no],[ac_cv_kthread=no])
CC="$ac_save_cc"])
fi
if test $ac_cv_kthread = no -a $ac_cv_pthread_is_default = no
then
# -pthread, if available, provides the right #defines
# and linker options to make pthread_create available
# Some compilers won't report that they do not support -pthread,
# so we need to run a program to see whether it really made the
# function available.
AC_CACHE_CHECK([whether $CC accepts -pthread], [ac_cv_pthread],
[ac_save_cc="$CC"
CC="$CC -pthread"
AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <stdio.h>
#include <pthread.h>
void* routine(void* p){return NULL;}
int main(void){
pthread_t p;
if(pthread_create(&p,NULL,routine,NULL)!=0)
return 1;
(void)pthread_detach(p);
return 0;
}
]])],[ac_cv_pthread=yes],[ac_cv_pthread=no],[ac_cv_pthread=no])
CC="$ac_save_cc"])
fi
# If we have set a CC compiler flag for thread support then
# check if it works for CXX, too.
if test ! -z "$CXX"
then
AC_CACHE_CHECK([whether $CXX also accepts flags for thread support], [ac_cv_cxx_thread],
[ac_save_cxx="$CXX"
if test "$ac_cv_kpthread" = "yes"
then
CXX="$CXX -Kpthread"
ac_cv_cxx_thread=yes
elif test "$ac_cv_kthread" = "yes"
then
CXX="$CXX -Kthread"
ac_cv_cxx_thread=yes
elif test "$ac_cv_pthread" = "yes"
then
CXX="$CXX -pthread"
ac_cv_cxx_thread=yes
else
ac_cv_cxx_thread=no
fi
if test $ac_cv_cxx_thread = yes
then
echo 'void foo();int main(){foo();}void foo(){}' > conftest.$ac_ext
$CXX -c conftest.$ac_ext 2>&5
if $CXX -o conftest$ac_exeext conftest.$ac_objext 2>&5 \
&& test -s conftest$ac_exeext && ./conftest$ac_exeext
then
ac_cv_cxx_thread=yes
else
ac_cv_cxx_thread=no
fi
rm -fr conftest*
fi
CXX="$ac_save_cxx"])
else
ac_cv_cxx_thread=no
fi
dnl # check for ANSI or K&R ("traditional") preprocessor
dnl AC_MSG_CHECKING(for C preprocessor type)
dnl AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
dnl #define spam(name, doc) {#name, &name, #name "() -- " doc}
dnl int foo;
dnl struct {char *name; int *addr; char *doc;} desc = spam(foo, "something");
dnl ]], [[;]])],[cpp_type=ansi],[AC_DEFINE(HAVE_OLD_CPP) cpp_type=traditional])
dnl AC_MSG_RESULT($cpp_type)
dnl autoconf 2.71 deprecates STDC_HEADERS, keep for backwards compatibility
dnl assume C99 compilers provide ANSI C headers
AC_DEFINE([STDC_HEADERS], [1],
[Define to 1 if you have the ANSI C header files.])
# checks for header files
AC_CHECK_HEADERS([ \
alloca.h asm/types.h bluetooth.h conio.h direct.h dlfcn.h endian.h errno.h fcntl.h grp.h \
io.h langinfo.h libintl.h libutil.h linux/auxvec.h sys/auxv.h linux/fs.h linux/limits.h linux/memfd.h \
linux/netfilter_ipv4.h linux/random.h linux/soundcard.h \
linux/tipc.h linux/wait.h netdb.h net/ethernet.h netinet/in.h netpacket/packet.h poll.h process.h pthread.h pty.h \
sched.h setjmp.h shadow.h signal.h spawn.h stropts.h sys/audioio.h sys/bsdtty.h sys/devpoll.h \
sys/endian.h sys/epoll.h sys/event.h sys/eventfd.h sys/file.h sys/ioctl.h sys/kern_control.h \
sys/loadavg.h sys/lock.h sys/memfd.h sys/mkdev.h sys/mman.h sys/modem.h sys/param.h sys/poll.h \
sys/random.h sys/resource.h sys/select.h sys/sendfile.h sys/socket.h sys/soundcard.h sys/stat.h \
sys/statvfs.h sys/sys_domain.h sys/syscall.h sys/sysmacros.h sys/termio.h sys/time.h sys/times.h sys/timerfd.h \
sys/types.h sys/uio.h sys/un.h sys/utsname.h sys/wait.h sys/xattr.h sysexits.h syslog.h \
termios.h util.h utime.h utmp.h \
])
AC_HEADER_DIRENT
AC_HEADER_MAJOR
# bluetooth/bluetooth.h has been known to not compile with -std=c99.
# http://permalink.gmane.org/gmane.linux.bluez.kernel/22294
SAVE_CFLAGS=$CFLAGS
CFLAGS="-std=c99 $CFLAGS"
AC_CHECK_HEADERS([bluetooth/bluetooth.h])
CFLAGS=$SAVE_CFLAGS
# On Darwin (OS X) net/if.h requires sys/socket.h to be imported first.
AC_CHECK_HEADERS([net/if.h], [], [],
[#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif
])
# On Linux, netlink.h requires asm/types.h
# On FreeBSD, netlink.h is located in netlink/netlink.h
AC_CHECK_HEADERS([linux/netlink.h netlink/netlink.h], [], [], [
#ifdef HAVE_ASM_TYPES_H
#include <asm/types.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
])
# On Linux, qrtr.h requires asm/types.h
AC_CHECK_HEADERS([linux/qrtr.h], [], [], [
#ifdef HAVE_ASM_TYPES_H
#include <asm/types.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
])
AC_CHECK_HEADERS([linux/vm_sockets.h], [], [], [
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
])
# On Linux, can.h, can/bcm.h, can/j1939.h, can/raw.h require sys/socket.h
# On NetBSD, netcan/can.h requires sys/socket.h
AC_CHECK_HEADERS(
[linux/can.h linux/can/bcm.h linux/can/j1939.h linux/can/raw.h netcan/can.h],
[], [], [
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
])
# Check for clock_t in time.h.
AC_CHECK_TYPES([clock_t], [],
[AC_DEFINE([clock_t], [long],
[Define to 'long' if <time.h> does not define clock_t.])],
[@%:@include <time.h>])
AC_CACHE_CHECK([for makedev], [ac_cv_func_makedev], [
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#if defined(MAJOR_IN_MKDEV)
#include <sys/mkdev.h>
#elif defined(MAJOR_IN_SYSMACROS)
#include <sys/sysmacros.h>
#else
#include <sys/types.h>
#endif
]], [[
makedev(0, 0) ]])
],[ac_cv_func_makedev=yes],[ac_cv_func_makedev=no])
])
AS_VAR_IF([ac_cv_func_makedev], [yes], [
AC_DEFINE([HAVE_MAKEDEV], [1],
[Define this if you have the makedev macro.])
])
# byte swapping
AC_CACHE_CHECK([for le64toh], [ac_cv_func_le64toh], [
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#ifdef HAVE_ENDIAN_H
#include <endian.h>
#elif defined(HAVE_SYS_ENDIAN_H)
#include <sys/endian.h>
#endif
]], [[
le64toh(1) ]])
],[ac_cv_func_le64toh=yes],[ac_cv_func_le64toh=no])
])
AS_VAR_IF([ac_cv_func_le64toh], [yes], [
AC_DEFINE([HAVE_HTOLE64], [1],
[Define this if you have le64toh()])
])
use_lfs=yes
# Don't use largefile support for GNU/Hurd
case $ac_sys_system in GNU*)
use_lfs=no
esac
if test "$use_lfs" = "yes"; then
# Two defines needed to enable largefile support on various platforms
# These may affect some typedefs
case $ac_sys_system/$ac_sys_release in
AIX*)
AC_DEFINE([_LARGE_FILES], [1],
[This must be defined on AIX systems to enable large file support.])
;;
esac
AC_DEFINE([_LARGEFILE_SOURCE], [1],
[This must be defined on some systems to enable large file support.])
AC_DEFINE([_FILE_OFFSET_BITS], [64],
[This must be set to 64 on some systems to enable large file support.])
fi
# Add some code to confdefs.h so that the test for off_t works on SCO
cat >> confdefs.h <<\EOF
#if defined(SCO_DS)
#undef _OFF_T
#endif
EOF
# Type availability checks
AC_TYPE_MODE_T
AC_TYPE_OFF_T
AC_TYPE_PID_T
AC_DEFINE_UNQUOTED([RETSIGTYPE],[void],[assume C89 semantics that RETSIGTYPE is always void])
AC_TYPE_SIZE_T
AC_TYPE_UID_T
AC_CHECK_TYPES([ssize_t])
AC_CHECK_TYPES([__uint128_t],
[AC_DEFINE([HAVE_GCC_UINT128_T], [1],
[Define if your compiler provides __uint128_t])])
# Sizes and alignments of various common basic types
# ANSI C requires sizeof(char) == 1, so no need to check it
AC_CHECK_SIZEOF([int], [4])
AC_CHECK_SIZEOF([long], [4])
AC_CHECK_ALIGNOF([long])
AC_CHECK_SIZEOF([long long], [8])
AC_CHECK_SIZEOF([void *], [4])
AC_CHECK_SIZEOF([short], [2])
AC_CHECK_SIZEOF([float], [4])
AC_CHECK_SIZEOF([double], [8])
AC_CHECK_SIZEOF([fpos_t], [4])
AC_CHECK_SIZEOF([size_t], [4])
AC_CHECK_ALIGNOF([size_t])
AC_CHECK_SIZEOF([pid_t], [4])
AC_CHECK_SIZEOF([uintptr_t])
AC_CHECK_ALIGNOF([max_align_t])
AC_TYPE_LONG_DOUBLE
AC_CHECK_SIZEOF([long double], [16])
AC_CHECK_SIZEOF([_Bool], [1])
AC_CHECK_SIZEOF([off_t], [], [
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
])
AC_MSG_CHECKING([whether to enable large file support])
if test "$ac_cv_sizeof_off_t" -gt "$ac_cv_sizeof_long" -a \
"$ac_cv_sizeof_long_long" -ge "$ac_cv_sizeof_off_t"; then
have_largefile_support="yes"
else
have_largefile_support="no"
fi
dnl LFS does not work with Emscripten 3.1
AS_CASE([$ac_sys_system],
[Emscripten], [have_largefile_support="no"]
)
AS_VAR_IF([have_largefile_support], [yes], [
AC_DEFINE([HAVE_LARGEFILE_SUPPORT], [1],
[Defined to enable large file support when an off_t is bigger than a long
and long long is at least as big as an off_t. You may need
to add some flags for configuration and compilation to enable this mode.
(For Solaris and Linux, the necessary defines are already defined.)])
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
])
AC_CHECK_SIZEOF([time_t], [], [
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_TIME_H
#include <time.h>
#endif
])
# if have pthread_t then define SIZEOF_PTHREAD_T
ac_save_cc="$CC"
if test "$ac_cv_kpthread" = "yes"
then CC="$CC -Kpthread"
elif test "$ac_cv_kthread" = "yes"
then CC="$CC -Kthread"
elif test "$ac_cv_pthread" = "yes"
then CC="$CC -pthread"
fi
AC_CACHE_CHECK([for pthread_t], [ac_cv_have_pthread_t], [
AC_COMPILE_IFELSE([
AC_LANG_PROGRAM([[@%:@include <pthread.h>]], [[pthread_t x; x = *(pthread_t*)0;]])
], [ac_cv_have_pthread_t=yes], [ac_cv_have_pthread_t=no])
])
AS_VAR_IF([ac_cv_have_pthread_t], [yes], [
AC_CHECK_SIZEOF([pthread_t], [], [
#ifdef HAVE_PTHREAD_H
#include <pthread.h>
#endif
])
])
# Issue #25658: POSIX hasn't defined that pthread_key_t is compatible with int.
# This checking will be unnecessary after removing deprecated TLS API.
AC_CHECK_SIZEOF([pthread_key_t], [], [[@%:@include <pthread.h>]])
AC_CACHE_CHECK([whether pthread_key_t is compatible with int], [ac_cv_pthread_key_t_is_arithmetic_type], [
if test "$ac_cv_sizeof_pthread_key_t" -eq "$ac_cv_sizeof_int" ; then
AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM([[@%:@include <pthread.h>]], [[pthread_key_t k; k * 1;]])],
[ac_cv_pthread_key_t_is_arithmetic_type=yes],
[ac_cv_pthread_key_t_is_arithmetic_type=no]
)
else
ac_cv_pthread_key_t_is_arithmetic_type=no
fi
])
AS_VAR_IF([ac_cv_pthread_key_t_is_arithmetic_type], [yes], [
AC_DEFINE([PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT], [1],
[Define if pthread_key_t is compatible with int.])
])
CC="$ac_save_cc"
AC_MSG_CHECKING([for --enable-framework])
if test "$enable_framework"
then
BASECFLAGS="$BASECFLAGS -fno-common -dynamic"
# -F. is needed to allow linking to the framework while
# in the build location.
AC_DEFINE([WITH_NEXT_FRAMEWORK], [1],
[Define if you want to produce an OpenStep/Rhapsody framework
(shared library plus accessory files).])
AC_MSG_RESULT([yes])
if test $enable_shared = "yes"
then
AC_MSG_ERROR([Specifying both --enable-shared and --enable-framework is not supported, use only --enable-framework instead])
fi
else
AC_MSG_RESULT([no])
fi
# Check for --with-dsymutil
AC_SUBST([DSYMUTIL])
AC_SUBST([DSYMUTIL_PATH])
DSYMUTIL=
DSYMUTIL_PATH=
AC_MSG_CHECKING([for --with-dsymutil])
AC_ARG_WITH(
[dsymutil],
[AS_HELP_STRING(
[--with-dsymutil],
[link debug information into final executable with dsymutil in macOS (default is no)]
)],
[
if test "$withval" != no
then
if test "$MACHDEP" != "darwin"; then
AC_MSG_ERROR([dsymutil debug linking is only available in macOS.])
fi
AC_MSG_RESULT([yes]);
DSYMUTIL='true'
else AC_MSG_RESULT([no]); DSYMUTIL=
fi],
[AC_MSG_RESULT([no])])
if test "$DSYMUTIL"; then
AC_PATH_PROG([DSYMUTIL_PATH], [dsymutil], [not found])
if test "$DSYMUTIL_PATH" = "not found"; then
AC_MSG_ERROR([dsymutil command not found on \$PATH])
fi
fi
AC_MSG_CHECKING([for dyld])
case $ac_sys_system/$ac_sys_release in
Darwin/*)
AC_DEFINE([WITH_DYLD], [1],
[Define if you want to use the new-style (Openstep, Rhapsody, MacOS)
dynamic linker (dyld) instead of the old-style (NextStep) dynamic
linker (rld). Dyld is necessary to support frameworks.])
AC_MSG_RESULT([always on for Darwin])
;;
*)
AC_MSG_RESULT([no])
;;
esac
AC_MSG_CHECKING([for --with-address-sanitizer])
AC_ARG_WITH([address_sanitizer],
AS_HELP_STRING([--with-address-sanitizer],
[enable AddressSanitizer memory error detector, 'asan' (default is no)]),
[
AC_MSG_RESULT([$withval])
BASECFLAGS="-fsanitize=address -fno-omit-frame-pointer $BASECFLAGS"
LDFLAGS="-fsanitize=address $LDFLAGS"
# ASan works by controlling memory allocation, our own malloc interferes.
with_pymalloc="no"
],
[AC_MSG_RESULT([no])])
AC_MSG_CHECKING([for --with-memory-sanitizer])
AC_ARG_WITH(
[memory_sanitizer],
[AS_HELP_STRING(
[--with-memory-sanitizer],
[enable MemorySanitizer allocation error detector, 'msan' (default is no)]
)],
[
AC_MSG_RESULT([$withval])
AX_CHECK_COMPILE_FLAG([-fsanitize=memory],[
BASECFLAGS="-fsanitize=memory -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer $BASECFLAGS"
LDFLAGS="-fsanitize=memory -fsanitize-memory-track-origins=2 $LDFLAGS"
],[AC_MSG_ERROR([The selected compiler doesn't support memory sanitizer])])
# MSan works by controlling memory allocation, our own malloc interferes.
with_pymalloc="no"
],
[AC_MSG_RESULT([no])])
AC_MSG_CHECKING([for --with-undefined-behavior-sanitizer])
AC_ARG_WITH(
[undefined_behavior_sanitizer],
[AS_HELP_STRING(
[--with-undefined-behavior-sanitizer],
[enable UndefinedBehaviorSanitizer undefined behaviour detector, 'ubsan' (default is no)]
)],
[
AC_MSG_RESULT([$withval])
BASECFLAGS="-fsanitize=undefined $BASECFLAGS"
LDFLAGS="-fsanitize=undefined $LDFLAGS"
with_ubsan="yes"
],
[
AC_MSG_RESULT([no])
with_ubsan="no"
])
AC_MSG_CHECKING([for --with-thread-sanitizer])
AC_ARG_WITH(
[thread_sanitizer],
[AS_HELP_STRING(
[--with-thread-sanitizer],
[enable ThreadSanitizer data race detector, 'tsan' (default is no)]
)],
[
AC_MSG_RESULT([$withval])
BASECFLAGS="-fsanitize=thread $BASECFLAGS"
LDFLAGS="-fsanitize=thread $LDFLAGS"
with_tsan="yes"
],
[
AC_MSG_RESULT([no])
with_tsan="no"
])
# Set info about shared libraries.
AC_SUBST([SHLIB_SUFFIX])
AC_SUBST([LDSHARED])
AC_SUBST([LDCXXSHARED])
AC_SUBST([BLDSHARED])
AC_SUBST([CCSHARED])
AC_SUBST([LINKFORSHARED])
# SHLIB_SUFFIX is the extension of shared libraries `(including the dot!)
# -- usually .so, .sl on HP-UX, .dll on Cygwin
AC_MSG_CHECKING([the extension of shared libraries])
if test -z "$SHLIB_SUFFIX"; then
case $ac_sys_system in
hp*|HP*)
case `uname -m` in
ia64) SHLIB_SUFFIX=.so;;
*) SHLIB_SUFFIX=.sl;;
esac
;;
CYGWIN*) SHLIB_SUFFIX=.dll;;
*) SHLIB_SUFFIX=.so;;
esac
fi
AC_MSG_RESULT([$SHLIB_SUFFIX])
# LDSHARED is the ld *command* used to create shared library
# -- "cc -G" on SunOS 5.x.
# (Shared libraries in this instance are shared modules to be loaded into
# Python, as opposed to building Python itself as a shared library.)
AC_MSG_CHECKING([LDSHARED])
if test -z "$LDSHARED"
then
case $ac_sys_system/$ac_sys_release in
AIX*)
BLDSHARED="Modules/ld_so_aix \$(CC) -bI:Modules/python.exp"
LDSHARED="\$(LIBPL)/ld_so_aix \$(CC) -bI:\$(LIBPL)/python.exp"
;;
SunOS/5*)
if test "$ac_cv_gcc_compat" = "yes" ; then
LDSHARED='$(CC) -shared'
LDCXXSHARED='$(CXX) -shared'
else
LDSHARED='$(CC) -G'
LDCXXSHARED='$(CXX) -G'
fi ;;
hp*|HP*)
if test "$ac_cv_gcc_compat" = "yes" ; then
LDSHARED='$(CC) -shared'
LDCXXSHARED='$(CXX) -shared'
else
LDSHARED='$(CC) -b'
LDCXXSHARED='$(CXX) -b'
fi ;;
Darwin/1.3*)
LDSHARED='$(CC) -bundle'
LDCXXSHARED='$(CXX) -bundle'
if test "$enable_framework" ; then
# Link against the framework. All externals should be defined.
BLDSHARED="$LDSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
LDSHARED="$LDSHARED "'$(PYTHONFRAMEWORKPREFIX)/$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
LDCXXSHARED="$LDCXXSHARED "'$(PYTHONFRAMEWORKPREFIX)/$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
else
# No framework. Ignore undefined symbols, assuming they come from Python
LDSHARED="$LDSHARED -undefined suppress"
LDCXXSHARED="$LDCXXSHARED -undefined suppress"
fi ;;
Darwin/1.4*|Darwin/5.*|Darwin/6.*)
LDSHARED='$(CC) -bundle'
LDCXXSHARED='$(CXX) -bundle'
if test "$enable_framework" ; then
# Link against the framework. All externals should be defined.
BLDSHARED="$LDSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
LDSHARED="$LDSHARED "'$(PYTHONFRAMEWORKPREFIX)/$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
LDCXXSHARED="$LDCXXSHARED "'$(PYTHONFRAMEWORKPREFIX)/$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
else
# No framework, use the Python app as bundle-loader
BLDSHARED="$LDSHARED "'-bundle_loader $(BUILDPYTHON)'
LDSHARED="$LDSHARED "'-bundle_loader $(BINDIR)/python$(VERSION)$(EXE)'
LDCXXSHARED="$LDCXXSHARED "'-bundle_loader $(BINDIR)/python$(VERSION)$(EXE)'
fi ;;
Darwin/*)
# Use -undefined dynamic_lookup whenever possible (10.3 and later).
# This allows an extension to be used in any Python
dep_target_major=`echo ${MACOSX_DEPLOYMENT_TARGET} | \
sed 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'`
dep_target_minor=`echo ${MACOSX_DEPLOYMENT_TARGET} | \
sed 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'`
if test ${dep_target_major} -eq 10 && \
test ${dep_target_minor} -le 2
then
# building for OS X 10.0 through 10.2
AC_MSG_ERROR([MACOSX_DEPLOYMENT_TARGET too old ($MACOSX_DEPLOYMENT_TARGET), only 10.3 or later is supported])
else
# building for OS X 10.3 and later
LDSHARED='$(CC) -bundle -undefined dynamic_lookup'
LDCXXSHARED='$(CXX) -bundle -undefined dynamic_lookup'
BLDSHARED="$LDSHARED"
fi
;;
iOS/*)
LDSHARED='$(CC) -dynamiclib -F . -framework $(PYTHONFRAMEWORK)'
LDCXXSHARED='$(CXX) -dynamiclib -F . -framework $(PYTHONFRAMEWORK)'
BLDSHARED="$LDSHARED"
;;
Emscripten*|WASI*)
LDSHARED='$(CC) -shared'
LDCXXSHARED='$(CXX) -shared';;
Linux*|GNU*|QNX*|VxWorks*|Haiku*)
LDSHARED='$(CC) -shared'
LDCXXSHARED='$(CXX) -shared';;
FreeBSD*)
if [[ "`$CC -dM -E - </dev/null | grep __ELF__`" != "" ]]
then
LDSHARED='$(CC) -shared'
LDCXXSHARED='$(CXX) -shared'
else
LDSHARED="ld -Bshareable"
fi;;
OpenBSD*)
if [[ "`$CC -dM -E - </dev/null | grep __ELF__`" != "" ]]
then
LDSHARED='$(CC) -shared $(CCSHARED)'
LDCXXSHARED='$(CXX) -shared $(CCSHARED)'
else
case `uname -r` in
[[01]].* | 2.[[0-7]] | 2.[[0-7]].*)
LDSHARED="ld -Bshareable ${LDFLAGS}"
;;
*)
LDSHARED='$(CC) -shared $(CCSHARED)'
LDCXXSHARED='$(CXX) -shared $(CCSHARED)'
;;
esac
fi;;
NetBSD*|DragonFly*)
LDSHARED='$(CC) -shared'
LDCXXSHARED='$(CXX) -shared';;
OpenUNIX*|UnixWare*)
if test "$ac_cv_gcc_compat" = "yes" ; then
LDSHARED='$(CC) -shared'
LDCXXSHARED='$(CXX) -shared'
else
LDSHARED='$(CC) -G'
LDCXXSHARED='$(CXX) -G'
fi;;
SCO_SV*)
LDSHARED='$(CC) -Wl,-G,-Bexport'
LDCXXSHARED='$(CXX) -Wl,-G,-Bexport';;
WASI*)
AS_VAR_IF([enable_wasm_dynamic_linking], [yes], [
dnl not implemented yet
]);;
CYGWIN*)
LDSHARED="gcc -shared -Wl,--enable-auto-image-base"
LDCXXSHARED="g++ -shared -Wl,--enable-auto-image-base";;
*) LDSHARED="ld";;
esac
fi
dnl Emscripten's emconfigure sets LDSHARED. Set BLDSHARED outside the
dnl test -z $LDSHARED block to configure BLDSHARED for side module support.
if test "$enable_wasm_dynamic_linking" = "yes" -a "$ac_sys_system" = "Emscripten"; then
BLDSHARED='$(CC) -shared -sSIDE_MODULE=1'
fi
AC_MSG_RESULT([$LDSHARED])
LDCXXSHARED=${LDCXXSHARED-$LDSHARED}
AC_MSG_CHECKING([BLDSHARED flags])
BLDSHARED=${BLDSHARED-$LDSHARED}
AC_MSG_RESULT([$BLDSHARED])
# CCSHARED are the C *flags* used to create objects to go into a shared
# library (module) -- this is only needed for a few systems
AC_MSG_CHECKING([CCSHARED])
if test -z "$CCSHARED"
then
case $ac_sys_system/$ac_sys_release in
SunOS*) if test "$ac_cv_gcc_compat" = "yes";
then CCSHARED="-fPIC";
elif test `uname -p` = sparc;
then CCSHARED="-xcode=pic32";
else CCSHARED="-Kpic";
fi;;
hp*|HP*) if test "$ac_cv_gcc_compat" = "yes";
then CCSHARED="-fPIC";
else CCSHARED="+z";
fi;;
Linux*|GNU*) CCSHARED="-fPIC";;
Emscripten*|WASI*)
AS_VAR_IF([enable_wasm_dynamic_linking], [yes], [
CCSHARED="-fPIC"
]);;
FreeBSD*|NetBSD*|OpenBSD*|DragonFly*) CCSHARED="-fPIC";;
Haiku*) CCSHARED="-fPIC";;
OpenUNIX*|UnixWare*)
if test "$ac_cv_gcc_compat" = "yes"
then CCSHARED="-fPIC"
else CCSHARED="-KPIC"
fi;;
SCO_SV*)
if test "$ac_cv_gcc_compat" = "yes"
then CCSHARED="-fPIC"
else CCSHARED="-Kpic -belf"
fi;;
VxWorks*)
CCSHARED="-fpic -D__SO_PICABILINUX__ -ftls-model=global-dynamic"
esac
fi
AC_MSG_RESULT([$CCSHARED])
# LINKFORSHARED are the flags passed to the $(CC) command that links
# the python executable -- this is only needed for a few systems
AC_MSG_CHECKING([LINKFORSHARED])
if test -z "$LINKFORSHARED"
then
case $ac_sys_system/$ac_sys_release in
AIX*) LINKFORSHARED='-Wl,-bE:Modules/python.exp -lld';;
hp*|HP*)
LINKFORSHARED="-Wl,-E -Wl,+s";;
# LINKFORSHARED="-Wl,-E -Wl,+s -Wl,+b\$(BINLIBDEST)/lib-dynload";;
Linux-android*) LINKFORSHARED="-pie -Xlinker -export-dynamic";;
Linux*|GNU*) LINKFORSHARED="-Xlinker -export-dynamic";;
# -u libsys_s pulls in all symbols in libsys
Darwin/*|iOS/*)
LINKFORSHARED="$extra_undefs -framework CoreFoundation"
# Issue #18075: the default maximum stack size (8MBytes) is too
# small for the default recursion limit. Increase the stack size
# to ensure that tests don't crash
stack_size="1000000" # 16 MB
if test "$with_ubsan" = "yes"
then
# Undefined behavior sanitizer requires an even deeper stack
stack_size="4000000" # 64 MB
fi
AC_DEFINE_UNQUOTED([THREAD_STACK_SIZE],
[0x$stack_size],
[Custom thread stack size depending on chosen sanitizer runtimes.])
if test $ac_sys_system = "Darwin"; then
LINKFORSHARED="-Wl,-stack_size,$stack_size $LINKFORSHARED"
if test "$enable_framework"; then
LINKFORSHARED="$LINKFORSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
fi
LINKFORSHARED="$LINKFORSHARED"
elif test $ac_sys_system = "iOS"; then
LINKFORSHARED="-Wl,-stack_size,$stack_size $LINKFORSHARED "'$(PYTHONFRAMEWORKDIR)/$(PYTHONFRAMEWORK)'
fi
;;
OpenUNIX*|UnixWare*) LINKFORSHARED="-Wl,-Bexport";;
SCO_SV*) LINKFORSHARED="-Wl,-Bexport";;
ReliantUNIX*) LINKFORSHARED="-W1 -Blargedynsym";;
FreeBSD*|NetBSD*|OpenBSD*|DragonFly*)
if [[ "`$CC -dM -E - </dev/null | grep __ELF__`" != "" ]]
then
LINKFORSHARED="-Wl,--export-dynamic"
fi;;
SunOS/5*) if test "$ac_cv_gcc_compat" = "yes"; then
if $CC -Xlinker --help 2>&1 | grep export-dynamic >/dev/null
then
LINKFORSHARED="-Xlinker --export-dynamic"
fi
fi
;;
CYGWIN*)
if test $enable_shared = "no"
then
LINKFORSHARED='-Wl,--out-implib=$(LDLIBRARY)'
fi;;
QNX*)
# -Wl,-E causes the symbols to be added to the dynamic
# symbol table so that they can be found when a module
# is loaded. -N 2048K causes the stack size to be set
# to 2048 kilobytes so that the stack doesn't overflow
# when running test_compile.py.
LINKFORSHARED='-Wl,-E -N 2048K';;
VxWorks*)
LINKFORSHARED='-Wl,-export-dynamic';;
esac
fi
AC_MSG_RESULT([$LINKFORSHARED])
AC_SUBST([CFLAGSFORSHARED])
AC_MSG_CHECKING([CFLAGSFORSHARED])
if test ! "$LIBRARY" = "$LDLIBRARY"
then
case $ac_sys_system in
CYGWIN*)
# Cygwin needs CCSHARED when building extension DLLs
# but not when building the interpreter DLL.
CFLAGSFORSHARED='';;
*)
CFLAGSFORSHARED='$(CCSHARED)'
esac
fi
dnl WASM dynamic linking requires -fPIC.
AS_VAR_IF([enable_wasm_dynamic_linking], [yes], [
CFLAGSFORSHARED='$(CCSHARED)'
])
AC_MSG_RESULT([$CFLAGSFORSHARED])
# SHLIBS are libraries (except -lc and -lm) to link to the python shared
# library (with --enable-shared).
# For platforms on which shared libraries are not allowed to have unresolved
# symbols, this must be set to $(LIBS) (expanded by make). We do this even
# if it is not required, since it creates a dependency of the shared library
# to LIBS. This, in turn, means that applications linking the shared libpython
# don't need to link LIBS explicitly. The default should be only changed
# on systems where this approach causes problems.
AC_SUBST([SHLIBS])
AC_MSG_CHECKING([SHLIBS])
case "$ac_sys_system" in
*)
SHLIBS='$(LIBS)';;
esac
AC_MSG_RESULT([$SHLIBS])
dnl perf trampoline is Linux specific and requires an arch-specific
dnl trampoline in assembly.
AC_MSG_CHECKING([perf trampoline])
AS_CASE([$PLATFORM_TRIPLET],
[x86_64-linux-gnu], [perf_trampoline=yes],
[aarch64-linux-gnu], [perf_trampoline=yes],
[perf_trampoline=no]
)
AC_MSG_RESULT([$perf_trampoline])
AS_VAR_IF([perf_trampoline], [yes], [
AC_DEFINE([PY_HAVE_PERF_TRAMPOLINE], [1], [Define to 1 if you have the perf trampoline.])
PERF_TRAMPOLINE_OBJ=Python/asm_trampoline.o
dnl perf needs frame pointers for unwinding, include compiler option in debug builds
AS_VAR_IF([Py_DEBUG], [true], [
AS_VAR_APPEND([BASECFLAGS], [" -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer"])
])
])
AC_SUBST([PERF_TRAMPOLINE_OBJ])
# checks for libraries
AC_CHECK_LIB([sendfile], [sendfile])
AC_CHECK_LIB([dl], [dlopen]) # Dynamic linking for SunOS/Solaris and SYSV
AC_CHECK_LIB([dld], [shl_load]) # Dynamic linking for HP-UX
dnl check for uuid dependencies
AH_TEMPLATE([HAVE_UUID_H], [Define to 1 if you have the <uuid.h> header file.])
AH_TEMPLATE([HAVE_UUID_UUID_H], [Define to 1 if you have the <uuid/uuid.h> header file.])
AH_TEMPLATE([HAVE_UUID_GENERATE_TIME_SAFE], [Define if uuid_generate_time_safe() exists.])
have_uuid=missing
dnl AIX provides support for RFC4122 (uuid) in libc.a starting with AIX 6.1
dnl (anno 2007). FreeBSD and OpenBSD provides support in libc as well.
dnl Little-endian FreeBSD, OpenBSD and NetBSD needs encoding into an octet
dnl stream in big-endian byte-order
AC_CHECK_HEADERS([uuid.h],
[AC_CHECK_FUNCS([uuid_create uuid_enc_be],
[have_uuid=yes
LIBUUID_CFLAGS=${LIBUUID_CFLAGS-""}
LIBUUID_LIBS=${LIBUUID_LIBS-""}
])
])
AS_VAR_IF([have_uuid], [missing], [
PKG_CHECK_MODULES(
[LIBUUID], [uuid >= 2.20],
[dnl linux-util's libuuid has uuid_generate_time_safe() since v2.20 (2011)
dnl and provides <uuid.h>.
have_uuid=yes
AC_DEFINE([HAVE_UUID_H], [1])
AC_DEFINE([HAVE_UUID_GENERATE_TIME_SAFE], [1])
], [
WITH_SAVE_ENV([
CPPFLAGS="$CPPFLAGS $LIBUUID_CFLAGS"
LDFLAGS="$LDFLAGS $LIBUUID_LIBS"
AC_CHECK_HEADERS([uuid/uuid.h], [
PY_CHECK_LIB([uuid], [uuid_generate_time], [have_uuid=yes])
PY_CHECK_LIB([uuid], [uuid_generate_time_safe],
[have_uuid=yes
AC_DEFINE([HAVE_UUID_GENERATE_TIME_SAFE], [1]) ]) ])
AS_VAR_IF([have_uuid], [yes], [
LIBUUID_CFLAGS=${LIBUUID_CFLAGS-""}
LIBUUID_LIBS=${LIBUUID_LIBS-"-luuid"}
])
])
]
)
])
dnl macOS has uuid/uuid.h but uuid_generate_time is in libc
AS_VAR_IF([have_uuid], [missing], [
AC_CHECK_HEADERS([uuid/uuid.h], [
AC_CHECK_FUNC([uuid_generate_time], [
have_uuid=yes
LIBUUID_CFLAGS=${LIBUUID_CFLAGS-""}
LIBUUID_LIBS=${LIBUUID_LIBS-""}
])
])
])
# gh-124228: While the libuuid library is available on NetBSD, it supports only UUID version 4.
# This restriction inhibits the proper generation of time-based UUIDs.
if test "$ac_sys_system" = "NetBSD"; then
have_uuid=missing
AC_DEFINE([HAVE_UUID_H], [0])
fi
AS_VAR_IF([have_uuid], [missing], [have_uuid=no])
# 'Real Time' functions on Solaris
# posix4 on Solaris 2.6
# pthread (first!) on Linux
AC_SEARCH_LIBS([sem_init], [pthread rt posix4])
# check if we need libintl for locale functions
AC_CHECK_LIB([intl], [textdomain],
[AC_DEFINE([WITH_LIBINTL], [1],
[Define to 1 if libintl is needed for locale functions.])
LIBS="-lintl $LIBS"])
# checks for system dependent C++ extensions support
case "$ac_sys_system" in
AIX*) AC_MSG_CHECKING([for genuine AIX C++ extensions support])
AC_LINK_IFELSE([
AC_LANG_PROGRAM([[@%:@include <load.h>]],
[[loadAndInit("", 0, "")]])
],[
AC_DEFINE([AIX_GENUINE_CPLUSPLUS], [1],
[Define for AIX if your compiler is a genuine IBM xlC/xlC_r
and you want support for AIX C++ shared extension modules.])
AC_MSG_RESULT([yes])
],[
AC_MSG_RESULT([no])
])
dnl The AIX_BUILDDATE is obtained from the kernel fileset - bos.mp64
# BUILD_GNU_TYPE + AIX_BUILDDATE are used to construct the platform_tag
# of the AIX system used to build/package Python executable. This tag serves
# as a baseline for bdist module packages
AC_MSG_CHECKING([for the system builddate])
AIX_BUILDDATE=$(lslpp -Lcq bos.mp64 | awk -F: '{ print $NF }')
AC_DEFINE_UNQUOTED([AIX_BUILDDATE], [$AIX_BUILDDATE],
[BUILD_GNU_TYPE + AIX_BUILDDATE are used to construct the PEP425 tag of the build system.])
AC_MSG_RESULT([$AIX_BUILDDATE])
;;
*) ;;
esac
# check for _Complex C type
#
# Note that despite most compilers define __STDC_IEC_559_COMPLEX__ - almost
# none properly support C11+ Annex G (where pure imaginary types
# represented by _Imaginary are mandatory). This is a bug (see e.g.
# llvm/llvm-project#60269), so we don't rely on presence
# of __STDC_IEC_559_COMPLEX__.
AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <complex.h>
#define test(type, out) \
{ \
type complex z = 1 + 2*I; z = z*z; \
(out) = (out) || creal(z) != -3 || cimag(z) != 4; \
}
int main(void)
{
int res = 0;
test(float, res);
test(double, res);
test(long double, res);
return res;
}]])], [ac_cv_c_complex_supported=yes],
[ac_cv_c_complex_supported=no],
[ac_cv_c_complex_supported=no])
if test "$ac_cv_c_complex_supported" = "yes"; then
AC_DEFINE([Py_HAVE_C_COMPLEX], [1],
[Defined if _Complex C type is available.])
fi
# check for systems that require aligned memory access
AC_CACHE_CHECK([aligned memory access is required], [ac_cv_aligned_required],
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
int main(void)
{
char s[16];
int i, *p1, *p2;
for (i=0; i < 16; i++)
s[i] = i;
p1 = (int*)(s+1);
p2 = (int*)(s+2);
if (*p1 == *p2)
return 1;
return 0;
}]])],
[ac_cv_aligned_required=no],
[ac_cv_aligned_required=yes],
[
# "yes" changes the hash function to FNV, which causes problems with Numba
# (https://github.com/numba/numba/blob/0.59.0/numba/cpython/hashing.py#L470).
if test "$ac_sys_system" = "Linux-android"; then
ac_cv_aligned_required=no
else
ac_cv_aligned_required=yes
fi])
])
if test "$ac_cv_aligned_required" = yes ; then
AC_DEFINE([HAVE_ALIGNED_REQUIRED], [1],
[Define if aligned memory access is required])
fi
# str, bytes and memoryview hash algorithm
AH_TEMPLATE([Py_HASH_ALGORITHM],
[Define hash algorithm for str, bytes and memoryview.
SipHash24: 1, FNV: 2, SipHash13: 3, externally defined: 0])
AC_MSG_CHECKING([for --with-hash-algorithm])
dnl quadrigraphs "@<:@" and "@:>@" produce "[" and "]" in the output
AC_ARG_WITH(
[hash_algorithm],
[AS_HELP_STRING(
[--with-hash-algorithm=@<:@fnv|siphash13|siphash24@:>@],
[select hash algorithm for use in Python/pyhash.c (default is SipHash13)]
)],
[
AC_MSG_RESULT([$withval])
case "$withval" in
siphash13)
AC_DEFINE([Py_HASH_ALGORITHM], [3])
;;
siphash24)
AC_DEFINE([Py_HASH_ALGORITHM], [1])
;;
fnv)
AC_DEFINE([Py_HASH_ALGORITHM], [2])
;;
*)
AC_MSG_ERROR([unknown hash algorithm '$withval'])
;;
esac
],
[AC_MSG_RESULT([default])])
validate_tzpath() {
# Checks that each element of the path is an absolute path
if test -z "$1"; then
# Empty string is allowed: it indicates no system TZPATH
return 0
fi
# Bad paths are those that don't start with /
dnl quadrigraphs "@<:@" and "@:>@" produce "[" and "]" in the output
if ( echo $1 | grep '\(^\|:\)\(@<:@^/@:>@\|$\)' > /dev/null); then
AC_MSG_ERROR([--with-tzpath must contain only absolute paths, not $1])
return 1;
fi
}
TZPATH="/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo"
AC_MSG_CHECKING([for --with-tzpath])
AC_ARG_WITH(
[tzpath],
[AS_HELP_STRING(
[--with-tzpath=<list of absolute paths separated by pathsep>],
[Select the default time zone search path for zoneinfo.TZPATH]
)],
[
case "$withval" in
yes)
AC_MSG_ERROR([--with-tzpath requires a value])
;;
*)
validate_tzpath "$withval"
TZPATH="$withval"
AC_MSG_RESULT(["$withval"])
;;
esac
],
[validate_tzpath "$TZPATH"
AC_MSG_RESULT(["$TZPATH"])])
AC_SUBST([TZPATH])
# Most SVR4 platforms (e.g. Solaris) need -lsocket and -lnsl.
AC_CHECK_LIB([nsl], [t_open], [LIBS="-lnsl $LIBS"]) # SVR4
AC_CHECK_LIB([socket], [socket], [LIBS="-lsocket $LIBS"], [], $LIBS) # SVR4 sockets
case $ac_sys_system/$ac_sys_release in
Haiku*)
AC_CHECK_LIB([network], [socket], [LIBS="-lnetwork $LIBS"], [], [$LIBS])
;;
esac
AC_MSG_CHECKING([for --with-libs])
AC_ARG_WITH(
[libs],
[AS_HELP_STRING(
[--with-libs='lib1 ...'],
[link against additional libs (default is no)]
)],
[
AC_MSG_RESULT([$withval])
LIBS="$withval $LIBS"
],
[AC_MSG_RESULT([no])])
# Check for use of the system expat library
AC_MSG_CHECKING([for --with-system-expat])
AC_ARG_WITH(
[system_expat],
[AS_HELP_STRING(
[--with-system-expat],
[build pyexpat module using an installed expat library, see Doc/library/pyexpat.rst (default is no)]
)], [], [with_system_expat="no"])
AC_MSG_RESULT([$with_system_expat])
AS_VAR_IF([with_system_expat], [yes], [
LIBEXPAT_CFLAGS=${LIBEXPAT_CFLAGS-""}
LIBEXPAT_LDFLAGS=${LIBEXPAT_LDFLAGS-"-lexpat"}
LIBEXPAT_INTERNAL=
], [
LIBEXPAT_CFLAGS="-I\$(srcdir)/Modules/expat"
LIBEXPAT_LDFLAGS="-lm \$(LIBEXPAT_A)"
LIBEXPAT_INTERNAL="\$(LIBEXPAT_HEADERS) \$(LIBEXPAT_A)"
])
AC_SUBST([LIBEXPAT_CFLAGS])
AC_SUBST([LIBEXPAT_INTERNAL])
dnl detect libffi
have_libffi=missing
AS_VAR_IF([ac_sys_system], [Darwin], [
WITH_SAVE_ENV([
CFLAGS="-I${SDKROOT}/usr/include/ffi $CFLAGS"
AC_CHECK_HEADER([ffi.h], [
AC_CHECK_LIB([ffi], [ffi_call], [
dnl use ffi from SDK root
have_libffi=yes
LIBFFI_CFLAGS="-I${SDKROOT}/usr/include/ffi -DUSING_APPLE_OS_LIBFFI=1"
LIBFFI_LIBS="-lffi"
])
])
])
])
AS_VAR_IF([have_libffi], [missing], [
PKG_CHECK_MODULES([LIBFFI], [libffi], [have_libffi=yes], [
WITH_SAVE_ENV([
CPPFLAGS="$CPPFLAGS $LIBFFI_CFLAGS"
LDFLAGS="$LDFLAGS $LIBFFI_LIBS"
AC_CHECK_HEADER([ffi.h], [
AC_CHECK_LIB([ffi], [ffi_call], [
have_libffi=yes
LIBFFI_CFLAGS=${LIBFFI_CFLAGS-""}
LIBFFI_LIBS=${LIBFFI_LIBS-"-lffi"}
], [have_libffi=no])
])
])
])
])
AS_VAR_IF([have_libffi], [yes], [
ctypes_malloc_closure=no
AS_CASE([$ac_sys_system],
[Darwin], [
dnl when do we need USING_APPLE_OS_LIBFFI?
ctypes_malloc_closure=yes
],
[iOS], [
ctypes_malloc_closure=yes
],
[sunos5], [AS_VAR_APPEND([LIBFFI_LIBS], [" -mimpure-text"])]
)
AS_VAR_IF([ctypes_malloc_closure], [yes], [
MODULE__CTYPES_MALLOC_CLOSURE=_ctypes/malloc_closure.c
AS_VAR_APPEND([LIBFFI_CFLAGS], [" -DUSING_MALLOC_CLOSURE_DOT_C=1"])
])
AC_SUBST([MODULE__CTYPES_MALLOC_CLOSURE])
dnl HAVE_LIBDL: for dlopen, see gh-76828
AS_VAR_IF([ac_cv_lib_dl_dlopen], [yes], [AS_VAR_APPEND([LIBFFI_LIBS], [" -ldl"])])
WITH_SAVE_ENV([
CFLAGS="$LIBFFI_CFLAGS $CFLAGS"
LDFLAGS="$LIBFFI_LIBS $LDFLAGS"
PY_CHECK_FUNC([ffi_prep_cif_var], [@%:@include <ffi.h>])
PY_CHECK_FUNC([ffi_prep_closure_loc], [@%:@include <ffi.h>])
PY_CHECK_FUNC([ffi_closure_alloc], [@%:@include <ffi.h>])
])
])
# Check for libffi with real complex double support.
# This is a workaround, since FFI_TARGET_HAS_COMPLEX_TYPE was defined in libffi v3.2.1,
# but real support was provided only in libffi v3.3.0.
# See https://github.com/python/cpython/issues/125206 for more details.
#
AC_CACHE_CHECK([libffi has complex type support], [ac_cv_ffi_complex_double_supported],
[WITH_SAVE_ENV([
CPPFLAGS="$LIBFFI_CFLAGS $CPPFLAGS"
LDFLAGS="$LIBFFI_LIBS $LDFLAGS"
LIBS="$LIBFFI_LIBS $LIBS"
AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <complex.h>
#include <ffi.h>
int z_is_expected(double complex z)
{
const double complex expected = CMPLX(1.25, -0.5);
return z == expected;
}
int main(void)
{
double complex z = 1.25 - 0.5 * I;
ffi_type *args[1] = {&ffi_type_complex_double};
void *values[1] = {&z};
ffi_cif cif;
if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
&ffi_type_sint, args) != FFI_OK)
{
return 2;
}
ffi_arg rc;
ffi_call(&cif, FFI_FN(z_is_expected), &rc, values);
return !rc;
}
]])], [ac_cv_ffi_complex_double_supported=yes],
[ac_cv_ffi_complex_double_supported=no],
[ac_cv_ffi_complex_double_supported=no])
])])
if test "$ac_cv_ffi_complex_double_supported" = "yes"; then
AC_DEFINE([Py_FFI_SUPPORT_C_COMPLEX], [1],
[Defined if _Complex C type can be used with libffi.])
fi
# Check for use of the system libmpdec library
AC_MSG_CHECKING([for --with-system-libmpdec])
AC_ARG_WITH(
[system_libmpdec],
[AS_HELP_STRING(
[--with-system-libmpdec],
[build _decimal module using an installed mpdecimal library, see Doc/library/decimal.rst (default is yes)]
)],
[],
[with_system_libmpdec="yes"])
AC_MSG_RESULT([$with_system_libmpdec])
AC_DEFUN([USE_BUNDLED_LIBMPDEC],
[LIBMPDEC_CFLAGS="-I\$(srcdir)/Modules/_decimal/libmpdec"
LIBMPDEC_LIBS="-lm \$(LIBMPDEC_A)"
LIBMPDEC_INTERNAL="\$(LIBMPDEC_HEADERS) \$(LIBMPDEC_A)"
have_mpdec=yes
with_system_libmpdec=no])
AS_VAR_IF(
[with_system_libmpdec], [yes],
[PKG_CHECK_MODULES(
[LIBMPDEC], [libmpdec >= 2.5.0], [],
[LIBMPDEC_CFLAGS=${LIBMPDEC_CFLAGS-""}
LIBMPDEC_LIBS=${LIBMPDEC_LIBS-"-lmpdec -lm"}
LIBMPDEC_INTERNAL=])],
[USE_BUNDLED_LIBMPDEC()])
AS_VAR_IF([with_system_libmpdec], [yes],
[WITH_SAVE_ENV([
CPPFLAGS="$LIBMPDEC_CFLAGS $CPPFLAGS"
LIBS="$LIBMPDEC_LIBS $LIBS"
AC_LINK_IFELSE([
AC_LANG_PROGRAM([
#include <mpdecimal.h>
#if MPD_VERSION_HEX < 0x02050000
# error "mpdecimal 2.5.0 or higher required"
#endif
], [const char *x = mpd_version();])],
[have_mpdec=yes],
[have_mpdec=no])
])],
[AC_MSG_WARN([m4_normalize([
the bundled copy of libmpdecimal is scheduled for removal in Python 3.15;
consider using a system installed mpdecimal library.])])])
AS_IF([test "$with_system_libmpdec" = "yes" && test "$have_mpdec" = "no"],
[AC_MSG_WARN([m4_normalize([
no system libmpdecimal found; falling back to bundled libmpdecimal
(deprecated and scheduled for removal in Python 3.15)])])
USE_BUNDLED_LIBMPDEC()])
# Disable forced inlining in debug builds, see GH-94847
AS_VAR_IF(
[with_pydebug], [yes],
[AS_VAR_APPEND([LIBMPDEC_CFLAGS], [" -DTEST_COVERAGE"])])
# Check whether _decimal should use a coroutine-local or thread-local context
AC_MSG_CHECKING([for --with-decimal-contextvar])
AC_ARG_WITH(
[decimal_contextvar],
[AS_HELP_STRING(
[--with-decimal-contextvar],
[build _decimal module using a coroutine-local rather than a thread-local context (default is yes)]
)],
[],
[with_decimal_contextvar="yes"])
if test "$with_decimal_contextvar" != "no"
then
AC_DEFINE([WITH_DECIMAL_CONTEXTVAR], [1],
[Define if you want build the _decimal module using a coroutine-local rather than a thread-local context])
fi
AC_MSG_RESULT([$with_decimal_contextvar])
AS_VAR_IF(
[with_system_libmpdec], [no],
[# Check for libmpdec machine flavor
AC_MSG_CHECKING([for decimal libmpdec machine])
AS_CASE([$ac_sys_system],
[Darwin*], [libmpdec_system=Darwin],
[SunOS*], [libmpdec_system=sunos],
[libmpdec_system=other]
)
libmpdec_machine=unknown
if test "$libmpdec_system" = Darwin; then
# universal here means: build libmpdec with the same arch options
# the python interpreter was built with
libmpdec_machine=universal
elif test $ac_cv_sizeof_size_t -eq 8; then
if test "$ac_cv_gcc_asm_for_x64" = yes; then
libmpdec_machine=x64
elif test "$ac_cv_type___uint128_t" = yes; then
libmpdec_machine=uint128
else
libmpdec_machine=ansi64
fi
elif test $ac_cv_sizeof_size_t -eq 4; then
if test "$ac_cv_gcc_asm_for_x87" = yes -a "$libmpdec_system" != sunos; then
AS_CASE([$ac_cv_cc_name],
[*gcc*], [libmpdec_machine=ppro],
[*clang*], [libmpdec_machine=ppro],
[libmpdec_machine=ansi32]
)
else
libmpdec_machine=ansi32
fi
fi
AC_MSG_RESULT([$libmpdec_machine])
AS_CASE([$libmpdec_machine],
[x64], [AS_VAR_APPEND([LIBMPDEC_CFLAGS], [" -DCONFIG_64=1 -DASM=1"])],
[uint128], [AS_VAR_APPEND([LIBMPDEC_CFLAGS], [" -DCONFIG_64=1 -DANSI=1 -DHAVE_UINT128_T=1"])],
[ansi64], [AS_VAR_APPEND([LIBMPDEC_CFLAGS], [" -DCONFIG_64=1 -DANSI=1"])],
[ppro], [AS_VAR_APPEND([LIBMPDEC_CFLAGS], [" -DCONFIG_32=1 -DANSI=1 -DASM=1 -Wno-unknown-pragmas"])],
[ansi32], [AS_VAR_APPEND([LIBMPDEC_CFLAGS], [" -DCONFIG_32=1 -DANSI=1"])],
[ansi-legacy], [AS_VAR_APPEND([LIBMPDEC_CFLAGS], [" -DCONFIG_32=1 -DANSI=1 -DLEGACY_COMPILER=1"])],
[universal], [AS_VAR_APPEND([LIBMPDEC_CFLAGS], [" -DUNIVERSAL=1"])],
[AC_MSG_ERROR([_decimal: unsupported architecture])]
)])
if test "$have_ipa_pure_const_bug" = yes; then
# Some versions of gcc miscompile inline asm:
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=46491
# https://gcc.gnu.org/ml/gcc/2010-11/msg00366.html
AS_VAR_APPEND([LIBMPDEC_CFLAGS], [" -fno-ipa-pure-const"])
fi
if test "$have_glibc_memmove_bug" = yes; then
# _FORTIFY_SOURCE wrappers for memmove and bcopy are incorrect:
# https://sourceware.org/ml/libc-alpha/2010-12/msg00009.html
AS_VAR_APPEND([LIBMPDEC_CFLAGS], [" -U_FORTIFY_SOURCE"])
fi
AC_SUBST([LIBMPDEC_CFLAGS])
AC_SUBST([LIBMPDEC_INTERNAL])
dnl detect sqlite3 from Emscripten emport
PY_CHECK_EMSCRIPTEN_PORT([LIBSQLITE3], [-sUSE_SQLITE3])
dnl Check for SQLite library. Use pkg-config if available.
PKG_CHECK_MODULES(
[LIBSQLITE3], [sqlite3 >= 3.15.2], [], [
LIBSQLITE3_CFLAGS=${LIBSQLITE3_CFLAGS-""}
LIBSQLITE3_LIBS=${LIBSQLITE3_LIBS-"-lsqlite3"}
]
)
AS_VAR_APPEND([LIBSQLITE3_CFLAGS], [' -I$(srcdir)/Modules/_sqlite'])
dnl PY_CHECK_SQLITE_FUNC(FUNCTION, IF-FOUND, IF-NOT-FOUND)
AC_DEFUN([PY_CHECK_SQLITE_FUNC], [
AC_CHECK_LIB([sqlite3], [$1], [$2], [
m4_ifblank([$3], [have_supported_sqlite3=no], [$3])
])
])
WITH_SAVE_ENV([
dnl bpo-45774/GH-29507: The CPP check in AC_CHECK_HEADER can fail on FreeBSD,
dnl hence CPPFLAGS instead of CFLAGS.
CPPFLAGS="$CPPFLAGS $LIBSQLITE3_CFLAGS"
LDFLAGS="$LIBSQLITE3_LIBS $LDFLAGS"
AC_CHECK_HEADER([sqlite3.h], [
have_sqlite3=yes
AC_COMPILE_IFELSE([
AC_LANG_PROGRAM([
#include <sqlite3.h>
#if SQLITE_VERSION_NUMBER < 3015002
# error "SQLite 3.15.2 or higher required"
#endif
], [])
], [
have_supported_sqlite3=yes
dnl Check that required functions are in place. A lot of stuff may be