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

Lui*_*uis 7 c c++ python autotools

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

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

cla*_*ete 12

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

创建Makefile.am文件

首先,您需要在项目的根目录中创建一个Makefile.am,基本上(但不是唯一地)列出应该处理的子目录.你最终会得到这样的东西:

SUBDIRS = src
Run Code Online (Sandbox Code Playgroud)

第二个,在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
Run Code Online (Sandbox Code Playgroud)

编写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])
Run Code Online (Sandbox Code Playgroud)

包起来

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

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


Ali*_*har 4

所有 PyGTK 扩展都使用自动工具,因此如果 PyGTK 方面不能为您解决所有问题,那么可能值得查看PyGTK 源代码。另外,这是我写的一个更简单的。