c++ - 如何使用 autotools 构建 Python C 扩展模块

标签 c++ python c autotools

大多数可用于构建 Python 扩展模块的文档 使用 distutils,但我想通过使用适当的 改为使用 python autoconf 和 automake 宏。

我想知道是否有一个开源项目可以做到 正是这个。我发现的大多数最终都依赖于 setup.py 文件。 使用这种方法可行,但不幸的是最终会重建整个 任何时候我对模块源文件进行修改时的源树。

最佳答案

假设您有一个名为 src 的项目,那么让我们按照以下步骤使用 autotools 构建和打包 python 扩展:

创建 Makefile.am 文件

首先,您需要在项目的根目录中创建一个 Makefile.am,基本上(但不限于)列出还应处理的子目录。你最终会得到这样的结果:

SUBDIRS = src

第二个,在 src 目录中,将包含实际编译 python 扩展的指令。它看起来像这样:

myextdir = $(pkgpythondir)
myext_PYTHON = file1.py file2.py

pyexec_LTLIBRARIES = _myext.la

_myext_la_SOURCES = myext.cpp
_myext_la_CPPFLAGS = $(PYTHON_CFLAGS)
_myext_la_LDFLAGS = -module -avoid-version -export-symbols-regex initmyext
_myext_la_LIBADD = $(top_builddir)/lib/libhollow.la

EXTRA_DIST = myext.h

编写configure.ac

此文件必须在项目的根目录中创建,并且必须列出您的项目需要构建的所有库、程序或任何类型的工具,例如编译器、链接器、库等。

像我这样懒惰的人通常不会从头开始创建它,我更喜欢使用 autoscan 工具,它会查找您正在使用的东西并生成 configure.scan 文件,可用作您真正的 configure.ac 的基础。

要通知 automake 您将需要 python 的东西,您可以将其添加到您的 configure.ac:

dnl python checks (you can change the required python version bellow)
AM_PATH_PYTHON(2.7.0)
PY_PREFIX=`$PYTHON -c 'import sys ; print sys.prefix'`
PYTHON_LIBS="-lpython$PYTHON_VERSION"
PYTHON_CFLAGS="-I$PY_PREFIX/include/python$PYTHON_VERSION"
AC_SUBST([PYTHON_LIBS])
AC_SUBST([PYTHON_CFLAGS])

总结

基本上,automake 有一个内置的扩展,知道如何处理 python 的东西,你只需要将它添加到你的 configure.ac 文件中,然后使用在您的 Makefile.am 中利用此功能。

PyGtk 绝对是一个很棒的例子,但它相当大,所以也许你会想检查另一个项目,比如 Guake

关于c++ - 如何使用 autotools 构建 Python C 扩展模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/261500/

相关文章:

c++ - 在 sparc solaris 上使用 gcc 为长整数赋值

c++ - 使用 FFTW_MEASURE 时 FFT 输出为空白,但使用 FFTW_ESTIMATE 时可以正常工作

python - 设置 yticks 颜色以匹配条形图颜色 python

从 makefile 调用 flex

c - 为什么我的程序的常驻集大小 (RSS) 大于可执行文件?

c++ - C 的 BlueZ 蓝牙库是否是 Google 的 native 客户端 SDK 的白名单 API 之一?

c++ - move : what does it take?

c++ - 无法在 QWIndow (Qt5) 中使用 OpenGL 启用深度测试

python - 未知命令 : 'collectstatic' Django 1. 7

javascript - 使用 Prototype 发布复杂的 JSON 对象