7

大多数可用于构建 Python 扩展模块的文档都使用 distutils,但我想通过使用适当的 python autoconf & automake 宏来实现这一点。

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

4

2 回答 2

14

假设您有一个项目,其目录名为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

于 2012-12-04T20:22:22.087 回答
4

所有 PyGTK 扩展都使用自动工具,所以如果 PyGTK 方面没有为你杀死整个事情,那么可能值得看看PyGTK 源代码。另外,这是我写的一个更简单的。

于 2008-11-04T13:10:44.060 回答