summaryrefslogtreecommitdiffstats
path: root/config/python.m4
diff options
context:
space:
mode:
Diffstat (limited to 'config/python.m4')
-rw-r--r--config/python.m4182
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