自动工具(AX_PYTHON_DEVEL 和 AM_PATH_PYTHON)

Autotools (AX_PYTHON_DEVEL and AM_PATH_PYTHON)

我想在 3.4 以上找到 python,其中有 python-devel。 我在 configure.ac:

中想出了这段代码
AM_PATH_PYTHON([3.4],
          [AX_PYTHON_DEVEL([>= '3.4'])],
          [AC_MSG_FAILURE([Cannot find python.])]
         )]

但这并没有捕捉到这种糟糕的情况: 机器有 python3.4、python3.6 和 python3.6-devel

在这种情况下,AM_PATH_PYTHON 会找到 python 3.4 而 AX_PYTHON_DEVEL 会失败。

所以,我的问题是:满足此类要求的最佳方法是什么?

在伪代码中,逻辑应该是这样的:

for ver in python_version_list; do
   AM_PATH_PYTHON($ver, AX_PYTHON_DEVEL($ver), [:]
   if "x$pythonexists" != "x:"
      break
done
AM_CONDITIONAL([HAVE_PYTHON], [test "x$pythonexists" = "xyes"])

谢谢

恐怕 AX_PYTHON_DEVEL 不提供为开发组件搜索多个 Python 安装 - 无论是内部还是外部。它选择一个 Python 解释器(您可以通过多种方式影响选择),然后期望能够识别并报告与该解释器关联的开发组件。如果它不能这样做,那么它将中止配置。

但我认为您可能无益地框定了问题。问题不应该是针对哪个 Python 存在开发组件,而是 Python 用户希望为哪个 Python 安装您的模块/包。可以合理地假设他们想要系统默认的 Python,如果有的话,或者肯定是用户指定的 Python。但面对多个已安装的 Python,假设他们想要它是不合理的,足够新的 Python 碰巧有可用的开发组件。

因此,我会简单地这样做:

# By default, aborts if no suitable Python is found:
AM_PATH_PYTHON([3.4])

# Will assume the Python interpreter previously identified by AM_PATH_PYTHON:
AX_PYTHON_DEVEL

在必须与多个 Python 竞争的环境中构建您的包的人需要足够的智慧来处理这种情况,在这种情况下,这意味着使用 PYTHON 环境变量,用于指定要使用的 Python(如 configure --help 将提示的那样),如果需要的话。