| # |
| # 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. |
| # |
| # 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 -a "$python_minorversion" -lt 7; then |
| AC_MSG_ERROR([Python version $python_version is too old (version 2.7 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 |
| # We don't know the platform DLSUFFIX here, so check 'em all. |
| 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 |