| # ax_python_interpreter.m4 detect a versioned python interpreter. |
| # |
| # Copyright (C) 2026 Free Software Foundation, Inc. |
| # |
| # 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 <https://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. |
| # |
| # This code is heavily derived and pruned from: |
| # |
| # =========================================================================== |
| # https://www.gnu.org/software/autoconf-archive/ax_python_devel.html |
| # =========================================================================== |
| # |
| # SYNOPSIS |
| # |
| # AX_PYTHON_INTERPRETER([version]) |
| # |
| # DESCRIPTION |
| # |
| # This macro checks for a particular version of Python. |
| # The parameter is manditory, for example ">= '2.3.1'", or "== '2.4'". |
| # Please note that you also *have* to pass an operator along with the |
| # version to match, and pay special attention to the single quotes |
| # surrounding the version number. |
| # |
| # The ax_python_interpreter_found variable will be "no" if the incorrect |
| # version of Python is found. It will be "yes" if found. |
| # |
| # PYTHON_VERSION can be set to force the interpreter program name. |
| # For example PYTHON_VERSION=2.7.1 which searches for python2.7.1. |
| # Otherwise it searches for a program named python, python2 or python3. |
| # |
| # For example: |
| # |
| # AX_PYTHON_INTERPRETER([>= '3.0']) searches for a Python3 interpreter. |
| # |
| # This macro should work for all versions of Python >= 2.1.0. |
| # |
| |
| AC_DEFUN([AC_PYTHON_INTERPRETER],[ |
| # Default to no. |
| ax_python_interpreter_found=no |
| AC_MSG_CHECKING([do we have a Python interpreter]) |
| # |
| # 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.]) |
| for version in $PYTHON_VERSION 3 2 ""; do |
| AC_PATH_PROG([PYTHON],[python[$version]]) |
| if test -z "$PYTHON"; then |
| AC_MSG_RESULT([no]) |
| else |
| AC_MSG_RESULT([yes]) |
| # Note: omitted the test for Python version < 2.1.0. |
| # |
| # If the macro parameter ``version'' is set, honour it. |
| # A Python shim class, VPy, is used to implement correct version comparisons via |
| # string expressions, since e.g. a naive textual ">= 2.7.3" won't work for |
| # Python 2.7.10 (the ".1" being evaluated as less than ".3"). |
| if test -n "$1"; then |
| AC_MSG_CHECKING([whether internal python version string is $1]) |
| cat << EOF > ax_python_interpreter_vpy.py |
| class VPy: |
| def vtup(self, s): |
| return tuple(map(int, s.strip().replace("rc", ".").split("."))) |
| def __init__(self): |
| import sys |
| self.vpy = tuple(sys.version_info)[[:3]] |
| def __eq__(self, s): |
| return self.vpy == self.vtup(s) |
| def __ne__(self, s): |
| return self.vpy != self.vtup(s) |
| def __lt__(self, s): |
| return self.vpy < self.vtup(s) |
| def __gt__(self, s): |
| return self.vpy > self.vtup(s) |
| def __le__(self, s): |
| return self.vpy <= self.vtup(s) |
| def __ge__(self, s): |
| return self.vpy >= self.vtup(s) |
| EOF |
| ac_supports_python_ver=`$PYTHON -c """import ax_python_interpreter_vpy; \ |
| ver = ax_python_interpreter_vpy.VPy(); \ |
| print (ver $1) """` |
| rm -rf ax_python_interpreter_vpy*.py* __pycache__/ax_python_interpreter_vpy*.py* |
| if test "$ac_supports_python_ver" = "True"; then |
| # Found correct version, now break from the loop. |
| AC_MSG_RESULT([yes]) |
| PYTHON_VERSION=$version |
| ax_python_interpreter_found=yes |
| break |
| else |
| AC_MSG_RESULT([no]) |
| PYTHON_VERSION="" |
| fi |
| fi |
| fi |
| done |
| AC_SUBST([ax_python_interpreter_found]) |
| AC_MSG_CHECKING([result of having a Python $1 interpreter]) |
| if test "$ax_python_interpreter_found" = "yes"; then |
| AC_MSG_RESULT([yes, all done.]) |
| else |
| AC_MSG_RESULT([no]) |
| PYTHON_VERSION="" |
| fi |
| # |
| # all done! |
| # |
| ]) |