# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_python_devel.html # =========================================================================== # # SYNOPSIS # # AX_PYTHON_DEVEL([version]) # # DESCRIPTION # # Note: Defines as a precious variable "PYTHON_VERSION". Don't override it # in your configure.ac. # # This macro checks for Python and tries to get the include path to # 'Python.h'. It provides the $(PYTHON_CPPFLAGS) and $(PYTHON_LIB) output # variables. It also exports $(PYTHON_EXTRA_LIBS) and # $(PYTHON_EXTRA_LDFLAGS) for embedding Python in your code. # # You can search for some particular version of Python by passing a # parameter to this macro, for example ">= '2.3.1'", or "== '2.4'". Please # note that you *have* to pass also an operator along with the version to # match, and pay special attention to the single quotes surrounding the # version number. Don't use "PYTHON_VERSION" for this: that environment # variable is declared as precious and thus reserved for the end-user. # # This macro should work for all versions of Python >= 2.1.0. As an end # user, you can disable the check for the python version by setting the # PYTHON_NOVERSIONCHECK environment variable to something else than the # empty string. # # If you need to use this macro for an older Python version, please # contact the authors. We're always open for feedback. # # LICENSE # # Copyright (c) 2009 Sebastian Huber <sebastian-huber@web.de> # Copyright (c) 2009 Alan W. Irwin # Copyright (c) 2009 Rafael Laboissiere <rafael@laboissiere.net> # Copyright (c) 2009 Andrew Collier # Copyright (c) 2009 Matteo Settenvini <matteo@member.fsf.org> # Copyright (c) 2009 Horst Knorr <hk_classes@knoda.org> # Copyright (c) 2013 Daniel Mullner <muellner@math.stanford.edu> # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation, either version 3 of the License, or (at your # option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General # Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see <http://www.gnu.org/licenses/>. # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 18 AU_ALIAS([AC_PYTHON_DEVEL], [AX_PYTHON_DEVEL]) AC_DEFUN([AX_PYTHON_DEVEL],[ # # Allow the use of a (user set) custom python version # AC_ARG_VAR([PYTHON_VERSION],[The installed Python version to use, for example '2.3'. This string will be appended to the Python interpreter canonical name.]) AC_PATH_PROG([PYTHON],[python[$PYTHON_VERSION]]) if test -z "$PYTHON"; then AC_MSG_ERROR([Cannot find python$PYTHON_VERSION in your system path]) PYTHON_VERSION="" fi # # Check for a version of Python >= 2.1.0 # AC_MSG_CHECKING([for a version of Python >= '2.1.0']) ac_supports_python_ver=`$PYTHON -c "import sys; \ ver = sys.version.split ()[[0]]; \ print (ver >= '2.1.0')"` if test "$ac_supports_python_ver" != "True"; then if test -z "$PYTHON_NOVERSIONCHECK"; then AC_MSG_RESULT([no]) AC_MSG_FAILURE([ This version of the AC@&t@_PYTHON_DEVEL macro doesn't work properly with versions of Python before 2.1.0. You may need to re-run configure, setting the variables PYTHON_CPPFLAGS, PYTHON_LIB, PYTHON_SITE_PKG, PYTHON_EXTRA_LIBS and PYTHON_EXTRA_LDFLAGS by hand. Moreover, to disable this check, set PYTHON_NOVERSIONCHECK to something else than an empty string. ]) else AC_MSG_RESULT([skip at user request]) fi else AC_MSG_RESULT([yes]) fi # # if the macro parameter ``version'' is set, honour it # if test -n "$1"; then AC_MSG_CHECKING([for a version of Python $1]) ac_supports_python_ver=`$PYTHON -c "import sys; \ ver = sys.version.split ()[[0]]; \ print (ver $1)"` if test "$ac_supports_python_ver" = "True"; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) AC_MSG_ERROR([this package requires Python $1. If you have it installed, but it isn't the default Python interpreter in your system path, please pass the PYTHON_VERSION variable to configure. See ``configure --help'' for reference. ]) PYTHON_VERSION="" fi fi # # Check if you have distutils, else fail # AC_MSG_CHECKING([for the distutils Python package]) ac_distutils_result=`$PYTHON -c "import distutils" 2>&1` if test -z "$ac_distutils_result"; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) AC_MSG_ERROR([cannot import Python module "distutils". Please check your Python installation. The error was: $ac_distutils_result]) PYTHON_VERSION="" fi # # Check for Python include path # AC_MSG_CHECKING([for Python include path]) if test -z "$PYTHON_INCLUDE_PATH"; then python_path=`$PYTHON -c "import distutils.sysconfig; \ print (distutils.sysconfig.get_python_inc ());"` plat_python_path=`$PYTHON -c "import distutils.sysconfig; \ print (distutils.sysconfig.get_python_inc (plat_specific=1));"` if test -n "${python_path}"; then if test "${plat_python_path}" != "${python_path}"; then python_path="$python_path $plat_python_path" else python_path="$python_path" fi fi PYTHON_INCLUDE_PATH=$python_path fi AC_MSG_RESULT([$PYTHON_INCLUDE_PATH]) AC_SUBST([PYTHON_INCLUDE_PATH]) # # Check for Python library path # AC_MSG_CHECKING([for Python library path]) if test -z "$PYTHON_LIB"; then # (makes two attempts to ensure we've got a version number # from the interpreter) ac_python_version=`cat<<EOD | $PYTHON - # join all versioning strings, on some systems # major/minor numbers could be in different list elements from distutils.sysconfig import * e = get_config_var('VERSION') if e is not None: print(e) EOD` if test -z "$ac_python_version"; then if test -n "$PYTHON_VERSION"; then ac_python_version=$PYTHON_VERSION else ac_python_version=`$PYTHON -c "import sys; \ print (sys.version[[:3]])"` fi fi # Make the versioning information available to the compiler AC_DEFINE_UNQUOTED([HAVE_PYTHON], ["$ac_python_version"], [If available, contains the Python version number currently in use.]) # First, the library directory: ac_python_libdir=`cat<<EOD | $PYTHON - # There should be only one import distutils.sysconfig e = distutils.sysconfig.get_config_var('LIBDIR') if e is not None: print (e) EOD` # Now, for the library: ac_python_library=`cat<<EOD | $PYTHON - import distutils.sysconfig c = distutils.sysconfig.get_config_vars() if 'LDVERSION' in c: print ('python'+c[['LDVERSION']]) else: print ('python'+c[['VERSION']]) EOD` # This small piece shamelessly adapted from PostgreSQL python macro; # credits goes to momjian, I think. I'd like to put the right name # in the credits, if someone can point me in the right direction... ? # if test -n "$ac_python_libdir" -a -n "$ac_python_library" then # use the official shared library ac_python_library=`echo "$ac_python_library" | sed "s/^lib//"` # PYTHON_LIB="-L$ac_python_libdir -l$ac_python_library" if [[ ! -d $ac_python_libdir ]]; then AC_MSG_ERROR([python library ($ac_python_libdir) is not a directory...]) fi PYTHON_LIB= for ax_dir in `ls $ac_python_libdir/lib$ac_python_library.*`; do if [[ ! -h $ax_dir ]]; then if [[ -z "$PYTHON_LIB" ]]; then PYTHON_LIB=$ax_dir else PYTHON_LIB="$PYTHON_LIB $ax_dir" fi fi done else # old way: use libpython from python_configdir ac_python_libdir=`$PYTHON -c \ "from distutils.sysconfig import get_python_lib as f; \ import os; \ print (os.path.join(f(plat_specific=1, standard_lib=1), 'config'));"` PYTHON_LIB= for ax_dir in `ls $ac_python_libdir/libpython$ac_python_version.*`; do if [[ ! -h $ax_dir ]]; then if [[ -z "$PYTHON_LIB" ]]; then PYTHON_LIB=$ax_dir else PYTHON_LIB="$PYTHON_LIB $ax_dir" fi fi done fi if test -z "PYTHON_LIB"; then AC_MSG_ERROR([ Cannot determine location of your Python DSO. Please check it was installed with dynamic libraries enabled, or try setting PYTHON_LIB by hand. ]) fi fi AC_MSG_RESULT([$PYTHON_LIB]) AC_SUBST([PYTHON_LIB]) # # Check for site packages # AC_MSG_CHECKING([for Python site-packages path]) if test -z "$PYTHON_SITE_PKG"; then PYTHON_SITE_PKG=`$PYTHON -c "import distutils.sysconfig; \ print (distutils.sysconfig.get_python_lib(0,0));"` fi AC_MSG_RESULT([$PYTHON_SITE_PKG]) AC_SUBST([PYTHON_SITE_PKG]) # # libraries which must be linked in when embedding # AC_MSG_CHECKING(python extra libraries) if test -z "$PYTHON_EXTRA_LDFLAGS"; then PYTHON_EXTRA_LDFLAGS=`$PYTHON -c "import distutils.sysconfig; \ conf = distutils.sysconfig.get_config_var; \ print (conf('LIBS') + ' ' + conf('SYSLIBS'))"` fi AC_MSG_RESULT([$PYTHON_EXTRA_LDFLAGS]) AC_SUBST(PYTHON_EXTRA_LDFLAGS) # # linking flags needed when embedding # AC_MSG_CHECKING(python extra linking flags) if test -z "$PYTHON_EXTRA_LIBS"; then PYTHON_EXTRA_LIBS=`$PYTHON -c "import distutils.sysconfig; \ conf = distutils.sysconfig.get_config_var; \ print (conf('LINKFORSHARED'))"` fi AC_MSG_RESULT([$PYTHON_EXTRA_LIBS]) AC_SUBST(PYTHON_EXTRA_LIBS) # # final check to see if everything compiles alright # AC_MSG_CHECKING([consistency of all components of python development environment]) # save current global flags ac_save_LIBS="$LIBS" ac_save_LDFLAGS="$LDFLAGS" ac_save_CPPFLAGS="$CPPFLAGS" LIBS="$ac_save_LIBS $PYTHON_LIB $PYTHON_EXTRA_LIBS" LDFLAGS="$ac_save_LDFLAGS $PYTHON_EXTRA_LDFLAGS" CPPFLAGS="$ac_save_CPPFLAGS `for i in $PYTHON_INCLUDE_PATH; do echo -I$i; done`" AC_LANG_PUSH([C]) AC_LINK_IFELSE([ AC_LANG_PROGRAM([[#include <Python.h>]], [[Py_Initialize();]]) ],[ pythonexists=yes AC_MSG_RESULT([yes]) ],[ dnl## this is likely the correct way to get the linking information dnl## (especially LINKFORSHARED) see: dnl## https://trac.macports.org/ticket/39223#no1 dnl## we fall back to it to preserve all of the other information we dnl## get from distutils (e.g. python site files etc.) AC_MSG_RESULT([hmmm...]) AC_MSG_NOTICE([looking harder for shared library flags...]) AC_PATH_PROG([PYTHON_CONFIG],[python${PYTHON_VERSION}-config]) if test -z "$PYTHON_CONFIG"; then pythonexists=no else AC_MSG_CHECKING(new python extra linking flags) PYTHON_EXTRA_LIBS=`$PYTHON_CONFIG --ldflags` AC_MSG_RESULT([$PYTHON_EXTRA_LIBS]) AC_MSG_CHECKING([consistency of all components of python development environment, again]) LIBS="$ac_save_LIBS $PYTHON_LIB $PYTHON_EXTRA_LIBS" AC_LINK_IFELSE([ AC_LANG_PROGRAM([[#include <Python.h>]], [[Py_Initialize();]]) ],[ pythonexists=yes AC_MSG_RESULT([ok]) ],[ pythonexists=no AC_MSG_RESULT([failed again]) ]) if test "x$pythonexists" != "xyes" ; then AC_MSG_NOTICE([attempting to guess extra library paths based upon Framework path...]) case ${PYTHON_EXTRA_LIBS} in */Library/Frameworks*) AC_MSG_CHECKING([consistency of all components of python development environment, once more]) INFERRED_LIB_PATH=`echo $PYTHON_EXTRA_LIBS | perl -pe 's@(?:^.*?\s+|^.*?-L)(/.*)/Library/Frameworks.*@[$]1/lib@'` if test -d "$INFERRED_LIB_PATH"; then LIBS="$ac_save_LIBS $PYTHON_LIB $PYTHON_EXTRA_LIBS -L$INFERRED_LIB_PATH" AC_LINK_IFELSE([ AC_LANG_PROGRAM([[#include <Python.h>]], [[Py_Initialize();]]) ],[ pythonexists=yes PYTHON_EXTRA_LIBS="$PYTHON_EXTRA_LIBS -L$INFERRED_LIB_PATH" AC_MSG_RESULT([ok]) ],[ pythonexists=no AC_MSG_RESULT([nope]) ]) fi ;; *) ;; esac fi fi ]) AC_LANG_POP([C]) # turn back to default flags CPPFLAGS="$ac_save_CPPFLAGS" LIBS="$ac_save_LIBS" LDFLAGS="$ac_save_LDFLAGS" if test ! "x$pythonexists" = "xyes"; then AC_MSG_WARN([ Could not link test program to Python. Maybe the main Python library has been installed in some non-standard library path. If so, pass it to configure, via the LIBS environment variable. Example: ./configure LIBS="-L/usr/non-standard-path/python/lib" ============================================================================ ERROR! You probably have to install the development version of the Python package for your distribution. The exact name of this package varies among them. ============================================================================ ]) PYTHON_VERSION="" fi # # all done! # ])