# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_python_embed.html # =========================================================================== # # SYNOPSIS # # AX_PYTHON_DEFAULT # AX_PYTHON_ENABLE # AX_PYTHON_WITH # AX_PYTHON_PATH # AX_PYTHON_VERSION_ENSURE( [2.2] ) # AX_PYTHON_CSPEC # AX_PYTHON_LSPEC # # DESCRIPTION # # This file provides autoconf support for those applications that want to # embed python. It supports all pythons >= 2.2 which is the first official # release containing distutils. Version 2.2 of python was released # December 21, 2001. Since it actually executes the python, cross platform # configuration will probably not work. Also, most of the platforms # supported are consistent until you look into Mac OS X. The python # included with it is installed as a framework which is a very different # environment to set up the normal tools such as gcc and libtool to deal # with. Therefore, once we establish which python that we are going to # use, we use its distutils to actually compile and link our modules or # applications. # # At this time, it does NOT support linking with Python statically. It # does support dynamic linking. # # This set of macros help define $PYTHON, $PYTHON_USE, $PYTHON_CSPEC and # $PYTHON_LSPEC. $PYTHON defines the full executable path for the Python # being linked to and is used within these macros to determine if that has # been specified or found. These macros do execute this python version so # it must be present on the system at configure time. # # $PYTHON_USE is an automake variable that defines whether Python support # should be included or not in your application. $PYTHON_CSPEC is a # variable that supplies additional CFLAGS for the compilation of the # application/shared library. $PYTHON_LSPEC is a variable that supplies # additional LDFLAGS for linking the application/shared library. # # The following is an example of how to set up for python usage within # your application in your configure.in: # # AX_PYTHON_DEFAULT( ) # AX_PYTHON_ENABLE( ) # Optional # AX_PYTHON_WITH( ) # Optional # AX_PYTHON_PATH( ) # or AX_PYTHON_INSIST( ) # # if $PYTHON is not defined, then the following do nothing. # AX_PYTHON_VERSION_ENSURE( [2.2] ) # AX_PYTHON_CSPEC # AX_PYTHON_LSPEC # # The AX_PYTHON_DEFAULT sets the $PYTHON_USE to false. Thereby, excluding # it if it was optional. # # The AX_PYTHON_ENABLE looks for the optional configure parameters of # --enable-python/--disable-python and establishes the $PYTHON and # $PYTHON_USE variables accordingly. # # The AX_PYTHON_WITH looks for the optional configure parameters of # --with-python/--without-python and establishes the $PYTHON and # $PYTHON_USE variables accordingly. # # The AX_PYTHON_PATH looks for python assuming that none has been # previously found or defined and issues an error if it does not find it. # If it does find it, it establishes the $PYTHON and $PYTHON_USE variables # accordingly. AX_PYTHON_INSIST could be used here instead if you want to # insist that Python support be included using the --enable-python or # --with-python checks previously done. # # The AX_PYTHON_VERSION_ENSURE issues an error if the Python previously # found is not of version 2.2 or greater. # # Once that these macros have be run, we can use PYTHON_USE within the # makefile.am file to conditionally add the Python support such as: # # Makefile.am example showing optional inclusion of directories: # # if PYTHON_USE # plugins = plugins # src = src # else # plugins = # src = # endif # # SUBDIRS = . $(plugins) $(src) # # Makefile.am example showing optional shared library build: # # if PYTHON_USE # lib_LTLIBRARIES = libElemList.la # libElemList_la_SOURCES = libElemList.c # libElemList_la_CFLAGS = @PYTHON_CSPEC@ # libElemList_la_LDFLAGS = @PYTHON_LSPEC@ # endif # # Makefile.am example showing optional program build: # # if PYTHON_USE # bin_PROGRAMS = runFunc # runFunc_SOURCES = runFunc.c # runFunc_CFLAGS = @PYTHON_CSPEC@ # runFunc_LDFLAGS = @PYTHON_LSPEC@ # endif # # The above compiles the modules only if PYTHON_USE was specified as true. # Also, the else portion of the if was optional. # # LICENSE # # Copyright (c) 2008 Robert White # Copyright (c) 2008 Dustin J. Mitchell # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 15 # AX_PYTHON_DEFAULT( ) # ----------------- # Sets the default to not include Python support. AC_DEFUN([AX_PYTHON_DEFAULT], [ ax_python_use=false AM_CONDITIONAL(PYTHON_USE, test x"$ax_python_use" = x"true") ]) # AX_PYTHON_ENABLE( [path] ) # ----------------------------------------------------------------- # Handles the various --enable-python commands. # Input: # $1 is the optional search path for the python executable if needed # Output: # PYTHON_USE (AM_CONDITIONAL) is true if python executable found # and --enable-python was requested; otherwise false. # $PYTHON contains the full executable path to python if PYTHON_ENABLE_USE # is true. # # Example: # AX_PYTHON_ENABLE( ) # or # AX_PYTHON_ENABLE( "/usr/bin" ) AC_DEFUN([AX_PYTHON_ENABLE], [ AC_ARG_VAR([PYTHON],[Python Executable Path]) # unless PYTHON was supplied to us (as a precious variable), # see if --enable-python[=PythonExecutablePath], --enable-python, # --disable-python or --enable-python=no was given. if test -z "$PYTHON" then AC_MSG_CHECKING(for --enable-python) AC_ARG_ENABLE( python, AS_HELP_STRING([--enable-python@<:@=PYTHON@:>@], [absolute path name of Python executable] ), [ if test "$enableval" = "yes" then # "yes" was specified, but we don't have a path # for the executable. # So, let's search the PATH Environment Variable. AC_MSG_RESULT(yes) AC_PATH_PROG( [PYTHON], python, [], $1 ) if test -z "$PYTHON" then AC_MSG_ERROR(no path to python found) fi ax_python_use=true AM_CONDITIONAL(PYTHON_USE, test x"$ax_python_use" = x"true") AX_PYTHON_PREFIX( ) elif test "$enableval" = "no" then AC_MSG_RESULT(no) ax_python_use=false AM_CONDITIONAL(PYTHON_USE, test x"$ax_python_use" = x"true") else # $enableval must be the executable path then. AC_SUBST([PYTHON], ["${enableval}"]) AC_MSG_RESULT($withval) ax_python_use=true AM_CONDITIONAL(PYTHON_USE, test x"$ax_python_use" = x"true") AX_PYTHON_PREFIX( ) fi ], [ # --with-python was not specified. AC_MSG_RESULT(no) ax_python_use=false AM_CONDITIONAL(PYTHON_USE, test x"$ax_python_use" = x"true") ] ) fi ]) # AX_PYTHON_CSPEC( ) # ----------------- # Set up the c compiler options to compile Python # embedded programs/libraries in $PYTHON_CSPEC if # $PYTHON has been defined. AC_DEFUN([AX_PYTHON_CSPEC], [ AC_ARG_VAR( [PYTHON], [Python Executable Path] ) if test -n "$PYTHON" then ax_python_prefix=`${PYTHON} -c "import sys; print(sys.prefix)"` if test -z "$ax_python_prefix" then AC_MSG_ERROR([Python Prefix is not known]) fi ax_python_execprefix=`${PYTHON} -c "import sys; print(sys.exec_prefix)"` ax_python_version=`$PYTHON -c "import sys; print(sys.version[[:3]])"` ax_python_includespec="-I${ax_python_prefix}/include/python${ax_python_version}" if test x"$python_prefix" != x"$python_execprefix"; then ax_python_execspec="-I${ax_python_execprefix}/include/python${ax_python_version}" ax_python_includespec="${ax_python_includespec} $ax_python_execspec" fi ax_python_ccshared=`${PYTHON} -c "import distutils.sysconfig; print(distutils.sysconfig.get_config_var('CFLAGSFORSHARED'))"` ax_python_cspec="${ax_python_ccshared} ${ax_python_includespec}" AC_SUBST([PYTHON_CSPEC], [${ax_python_cspec}]) AC_MSG_NOTICE([PYTHON_CSPEC=${ax_python_cspec}]) fi ]) # AX_PYTHON_INSIST( ) # ----------------- # Look for Python and set the output variable 'PYTHON' # to 'python' if found, empty otherwise. AC_DEFUN([AX_PYTHON_INSIST], [ AC_ARG_VAR( [PYTHON], [Python Executable Path] ) if test -z "$PYTHON" then AC_MSG_ERROR([Python Executable not found]) fi ]) # AX_PYTHON_LSPEC( ) # ----------------- # Set up the linker options to link Python embedded # programs/libraries in $PYTHON_LSPEC if $PYTHON # has been defined. AC_DEFUN([AX_PYTHON_LSPEC], [ AC_ARG_VAR( [PYTHON], [Python Executable Path] ) if test -n "$PYTHON" then AX_PYTHON_RUN([ import sys import distutils.sysconfig strUseFrameWork = "--enable-framework" dictConfig = distutils.sysconfig.get_config_vars( ) strConfigArgs = dictConfig.get("CONFIG_ARGS") strLinkSpec = dictConfig.get('LDFLAGS') if -1 == strConfigArgs.find(strUseFrameWork): strLibPL = dictConfig.get("LIBPL") if strLibPL and (strLibPL != ""): strLinkSpec += " -L%s" % (strLibPL) strSys = dictConfig.get("SYSLIBS") if strSys and (strSys != ""): strLinkSpec += " %s" % (strSys) strSHL = dictConfig.get("SHLIBS") if strSHL and (strSHL != ""): strLinkSpec += " %s" % (strSHL) # Construct the Python Library Name. strTmplte = " -lpython%d.%d" if (sys.platform == "win32") or (sys.platform == "os2emx"): strTmplte = " -lpython%d%d" strWrk = strTmplte % ( (sys.hexversion >> 24), ((sys.hexversion >> 16) & 0xff)) strLinkSpec += strWrk else: # This is not ideal since it changes the search path # for Frameworks which could have side-effects on # other included Frameworks. However, it is necessary # where someone has installed more than one frameworked # Python. Frameworks are really only used in MacOSX. strLibFW = dictConfig.get("PYTHONFRAMEWORKPREFIX") if strLibFW and (strLibFW != ""): strLinkSpec += " -F%s" % (strLibFW) strLinkSpec += " %s" % (dictConfig.get('LINKFORSHARED')) print(strLinkSpec) ]) AC_SUBST([PYTHON_LSPEC], [${ax_python_output}]) AC_MSG_NOTICE([PYTHON_LSPEC=${ax_python_output}]) fi ]) # AX_PYTHON_PATH( ) # ----------------- # Look for Python and set the output variable 'PYTHON' # to 'python' if found, empty otherwise. AC_DEFUN([AX_PYTHON_PATH], [ AC_ARG_VAR( [PYTHON], [Python Executable Path] ) AC_PATH_PROG( PYTHON, python, [], $1 ) if test -z "$PYTHON" then AC_MSG_ERROR([Python Executable not found]) else ax_python_use=true fi AM_CONDITIONAL(PYTHON_USE, test "$ax_python_use" = "true") ]) # AX_PYTHON_PREFIX( ) # ------------------- # Use the values of $prefix and $exec_prefix for the corresponding # values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. AC_DEFUN([AX_PYTHON_PREFIX], [ if test -z "$PYTHON" then AC_MSG_ERROR([Python Executable Path is not known]) fi ax_python_prefix=`${PYTHON} -c "import sys; print(sys.prefix)"` ax_python_execprefix=`${PYTHON} -c "import sys; print(sys.exec_prefix)"` AC_SUBST([PYTHON_PREFIX], ["${ax_python_prefix}"]) AC_SUBST([PYTHON_EXECPREFIX], ["${ax_python_execprefix}"]) ]) # AX_PYTHON_RUN( PYTHON_PROGRAM ) # ----------------- # Run a Python Test Program saving its output # in ax_python_output and its condition code # in ax_python_cc. AC_DEFUN([AX_PYTHON_RUN], [ AC_ARG_VAR( [PYTHON], [Python Executable Path] ) if test -z "$PYTHON" then AC_MSG_ERROR([Python Executable not found]) else cat >conftest.py <<_ACEOF $1 _ACEOF ax_python_output=`$PYTHON conftest.py` ax_python_cc=$? rm conftest.py if test -f "conftest.pyc" then rm conftest.pyc fi fi ]) # AX_PYTHON_VERSION_CHECK( VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE] ) # ----------------------------------------------------------------------------- # Run ACTION-IF-TRUE if the Python interpreter has version >= VERSION. # Run ACTION-IF-FALSE otherwise. # This test uses sys.hexversion instead of the string equivalent (first # word of sys.version), in order to cope with versions such as 2.2c1. # hexversion has been introduced in Python 1.5.2; it's probably not # worth to support older versions (1.5.1 was released on October 31, 1998). AC_DEFUN([AX_PYTHON_VERSION_CHECK], [ AC_ARG_VAR( [PYTHON], [Python Executable Path] ) if test -n "$PYTHON" then AC_MSG_CHECKING([whether $PYTHON version >= $1]) AX_PYTHON_RUN([ import sys # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. # It accepts a string like "X[.Y[.Z]]" with X,Y,Z=digits # and [] means optional. minver = list(map(int, '$1'.split('.'))) + [[0, 0, 0]] minver[3] = 255 minverhex = 0 for i in range(0, 4): minverhex = (minverhex << 8) + minver[[i]] if sys.hexversion >= minverhex: sys.exit( 0 ) else: sys.exit( 1 ) ]) if test $ax_python_cc -eq 0 then $2 m4_ifvaln( [$3], [else $3] ) fi fi ]) # AX_PYTHON_VERSION_ENSURE( VERSION ) # ----------------- # Insure that the Python Interpreter Version # is greater than or equal to the VERSION # parameter. AC_DEFUN([AX_PYTHON_VERSION_ENSURE], [ AX_PYTHON_VERSION_CHECK( [$1], [AC_MSG_RESULT(yes)], [AC_MSG_ERROR(too old)] ) ]) # AX_PYTHON_WITH( [path] ) # ----------------------------------------------------------------- # Handles the various --with-python commands. # Input: # $1 is the optional search path for the python executable if needed # Output: # PYTHON_USE (AM_CONDITIONAL) is true if python executable found # and --with-python was requested; otherwise false. # $PYTHON contains the full executable path to python if PYTHON_USE # is true. # # Example: # AX_PYTHON_WITH( ) # or # AX_PYTHON_WITH("/usr/bin") AC_DEFUN([AX_PYTHON_WITH], [ AC_ARG_VAR([PYTHON],[Python Executable Path]) # unless PYTHON was supplied to us (as a precious variable), # see if --with-python[=PythonExecutablePath], --with-python, # --without-python or --with-python=no was given. if test -z "$PYTHON" then AC_MSG_CHECKING(for --with-python) AC_ARG_WITH( python, AS_HELP_STRING([--with-python@<:@=PYTHON@:>@], [absolute path name of Python executable] ), [ if test "$withval" = "yes" then # "yes" was specified, but we don't have a path # for the executable. # So, let's search the PATH Environment Variable. AC_MSG_RESULT(yes) AC_PATH_PROG( [PYTHON], python, [], $1 ) if test -z "$PYTHON" then AC_MSG_ERROR(no path to python found) fi ax_python_use=true AM_CONDITIONAL(PYTHON_USE, test x"$ax_python_use" = x"true") AX_PYTHON_PREFIX( ) elif test "$withval" = "no" then AC_MSG_RESULT(no) ax_python_use=false AM_CONDITIONAL(PYTHON_USE, test x"$ax_python_use" = x"true") else # $withval must be the executable path then. AC_SUBST([PYTHON], ["${withval}"]) AC_MSG_RESULT($withval) ax_python_use=true AM_CONDITIONAL(PYTHON_USE, test x"$ax_python_use" = x"true") AX_PYTHON_PREFIX( ) fi ], [ # --with-python was not specified. AC_MSG_RESULT(no) ax_python_use=false AM_CONDITIONAL(PYTHON_USE, test x"$ax_python_use" = x"true") ] ) fi ])