如何使用autotools构建Python C扩展模块
大部分关于如何构建Python扩展模块的文档都是使用distutils这个工具,但我想用合适的python autoconf和automake宏来实现这个目标。
我想知道有没有开源项目正好是这样做的。我找到的大多数项目最终还是依赖于一个setup.py文件。虽然这种方法可以用,但不幸的是,每次我修改模块的源文件时,它都会重新构建整个源代码树。
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。