diff options
Diffstat (limited to 'config/python.m4')
-rw-r--r-- | config/python.m4 | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/config/python.m4 b/config/python.m4 new file mode 100644 index 0000000..e500873 --- /dev/null +++ b/config/python.m4 @@ -0,0 +1,182 @@ +# +# Autoconf macros for configuring the build of Python extension modules +# +# config/python.m4 +# + +# PGAC_PATH_PYTHON +# ---------------- +# Look for Python and set the output variable 'PYTHON' if found, +# fail otherwise. +# +# Since we are supporting only Python 3.x, prefer python3 to plain python. If +# the latter exists at all, it very possibly points to python2. + +# As the Python 3 transition happens and PEP 394 isn't updated, we +# need to cater to systems that don't have unversioned "python" by +# default. Some systems ship with "python3" by default and perhaps +# have "python" in an optional package. Some systems only have +# "python2" and "python3", in which case it's reasonable to prefer the +# newer version. +AC_DEFUN([PGAC_PATH_PYTHON], +[PGAC_PATH_PROGS(PYTHON, [python3 python]) +AC_ARG_VAR(PYTHON, [Python program])dnl +if test x"$PYTHON" = x""; then + AC_MSG_ERROR([Python not found]) +fi +]) + + +# _PGAC_CHECK_PYTHON_DIRS +# ----------------------- +# Determine the name of various directories of a given Python installation, +# as well as the Python version. +AC_DEFUN([_PGAC_CHECK_PYTHON_DIRS], +[AC_REQUIRE([PGAC_PATH_PYTHON]) +python_fullversion=`${PYTHON} -c "import sys; print(sys.version)" | sed q` +AC_MSG_NOTICE([using python $python_fullversion]) +# python_fullversion is typically n.n.n plus some trailing junk +python_majorversion=`echo "$python_fullversion" | sed '[s/^\([0-9]*\).*/\1/]'` +python_minorversion=`echo "$python_fullversion" | sed '[s/^[0-9]*\.\([0-9]*\).*/\1/]'` +python_version=`echo "$python_fullversion" | sed '[s/^\([0-9]*\.[0-9]*\).*/\1/]'` +# Reject unsupported Python versions as soon as practical. +if test "$python_majorversion" -lt 3; then + AC_MSG_ERROR([Python version $python_version is too old (version 3 or later is required)]) +fi + +AC_MSG_CHECKING([for Python sysconfig module]) +if "${PYTHON}" -c 'import sysconfig' 2>&AS_MESSAGE_LOG_FD +then + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) + AC_MSG_ERROR([sysconfig module not found]) +fi + +AC_MSG_CHECKING([Python configuration directory]) +python_configdir=`${PYTHON} -c "import sysconfig; print(' '.join(filter(None,sysconfig.get_config_vars('LIBPL'))))"` +AC_MSG_RESULT([$python_configdir]) + +AC_MSG_CHECKING([Python include directory]) +python_includespec=`${PYTHON} -c "import sysconfig; print('-I' + sysconfig.get_config_var('INCLUDEPY'))"` +if test "$PORTNAME" = win32 ; then + python_includespec=`echo $python_includespec | sed 's,[[\]],/,g'` +fi +AC_MSG_RESULT([$python_includespec]) + +AC_SUBST(python_majorversion)[]dnl +AC_SUBST(python_version)[]dnl +AC_SUBST(python_includespec)[]dnl +])# _PGAC_CHECK_PYTHON_DIRS + + +# PGAC_CHECK_PYTHON_EMBED_SETUP +# ----------------------------- +# +# Set python_libdir to the path of the directory containing the Python shared +# library. Set python_libspec to the -L/-l linker switches needed to link it. +# Set python_additional_libs to contain any additional linker switches needed +# for subsidiary libraries. +# +# In modern, well-configured Python installations, LIBDIR gives the correct +# directory name and LDLIBRARY is the file name of the shlib. But in older +# installations LDLIBRARY is frequently a useless path fragment, and it's also +# possible that the shlib is in a standard library directory such as /usr/lib +# so that LIBDIR is irrelevant. Also, some packagers put the .so symlink for +# the shlib in ${python_configdir} even though Python itself never does. +# We must also check that what we found is a shared library not a plain +# library, which we do by checking its extension. (We used to rely on +# Py_ENABLE_SHARED, but that only tells us that a shlib exists, not that +# we found it.) +AC_DEFUN([PGAC_CHECK_PYTHON_EMBED_SETUP], +[AC_REQUIRE([_PGAC_CHECK_PYTHON_DIRS]) +AC_MSG_CHECKING([how to link an embedded Python application]) + +python_libdir=`${PYTHON} -c "import sysconfig; print(' '.join(filter(None,sysconfig.get_config_vars('LIBDIR'))))"` +python_ldlibrary=`${PYTHON} -c "import sysconfig; print(' '.join(filter(None,sysconfig.get_config_vars('LDLIBRARY'))))"` + +# If LDLIBRARY exists and has a shlib extension, use it verbatim. +ldlibrary=`echo "${python_ldlibrary}" | sed -e 's/\.so$//' -e 's/\.dll$//' -e 's/\.dylib$//' -e 's/\.sl$//'` +if test -e "${python_libdir}/${python_ldlibrary}" -a x"${python_ldlibrary}" != x"${ldlibrary}" +then + ldlibrary=`echo "${ldlibrary}" | sed "s/^lib//"` + found_shlib=1 +else + # Otherwise, guess the base name of the shlib. + # LDVERSION was added in Python 3.2, before that use VERSION, + # or failing that, $python_version from _PGAC_CHECK_PYTHON_DIRS. + python_ldversion=`${PYTHON} -c "import sysconfig; print(' '.join(filter(None,sysconfig.get_config_vars('LDVERSION'))))"` + if test x"${python_ldversion}" != x""; then + ldlibrary="python${python_ldversion}" + else + python_version_var=`${PYTHON} -c "import sysconfig; print(' '.join(filter(None,sysconfig.get_config_vars('VERSION'))))"` + if test x"${python_version_var}" != x""; then + ldlibrary="python${python_version_var}" + else + ldlibrary="python${python_version}" + fi + fi + # Search for a likely-looking file. + found_shlib=0 + for d in "${python_libdir}" "${python_configdir}" /usr/lib64 /usr/lib + do + # Note: DLSUFFIX is for loadable modules, not shared + # libraries, so cannot be used here portably. Just + # check all known possibilities. + for e in .so .dll .dylib .sl; do + if test -e "$d/lib${ldlibrary}$e"; then + python_libdir="$d" + found_shlib=1 + break 2 + fi + done + done + # Some platforms (OpenBSD) require us to accept a bare versioned shlib + # (".so.n.n") as well. However, check this only after failing to find + # ".so" anywhere, because yet other platforms (Debian) put the .so + # symlink in a different directory from the underlying versioned shlib. + if test "$found_shlib" != 1; then + for d in "${python_libdir}" "${python_configdir}" /usr/lib64 /usr/lib + do + for f in "$d/lib${ldlibrary}.so."* ; do + if test -e "$f"; then + python_libdir="$d" + found_shlib=1 + break 2 + fi + done + done + fi + # As usual, Windows has its own ideas. Possible default library + # locations include c:/Windows/System32 and (for Cygwin) /usr/bin, + # and the "lib" prefix might not be there. + if test "$found_shlib" != 1 -a \( "$PORTNAME" = win32 -o "$PORTNAME" = cygwin \); then + for d in "${python_libdir}" "${python_configdir}" c:/Windows/System32 /usr/bin + do + for f in "$d/lib${ldlibrary}.dll" "$d/${ldlibrary}.dll" ; do + if test -e "$f"; then + python_libdir="$d" + found_shlib=1 + break 2 + fi + done + done + fi +fi +if test "$found_shlib" != 1; then + AC_MSG_ERROR([could not find shared library for Python +You might have to rebuild your Python installation. Refer to the +documentation for details. Use --without-python to disable building +PL/Python.]) +fi +python_libspec="-L${python_libdir} -l${ldlibrary}" + +python_additional_libs=`${PYTHON} -c "import sysconfig; print(' '.join(filter(None,sysconfig.get_config_vars('LIBS','LIBC','LIBM','BASEMODLIBS'))))"` + +AC_MSG_RESULT([${python_libspec} ${python_additional_libs}]) + +AC_SUBST(python_libdir)[]dnl +AC_SUBST(python_libspec)[]dnl +AC_SUBST(python_additional_libs)[]dnl + +])# PGAC_CHECK_PYTHON_EMBED_SETUP |