【发布时间】:2010-09-20 15:54:18
【问题描述】:
大部分可用于构建 Python 扩展模块的文档 使用 distutils,但我想通过使用适当的来实现这一点 改为使用 python autoconf 和 automake 宏。
我想知道是否有开源项目可以做到 正是这个。我发现的大多数最终都依赖于 setup.py 文件。 使用这种方法是可行的,但不幸的是最终重建了整个 每当我对模块源文件进行修改时,源树。
【问题讨论】:
大部分可用于构建 Python 扩展模块的文档 使用 distutils,但我想通过使用适当的来实现这一点 改为使用 python autoconf 和 automake 宏。
我想知道是否有开源项目可以做到 正是这个。我发现的大多数最终都依赖于 setup.py 文件。 使用这种方法是可行的,但不幸的是最终重建了整个 每当我对模块源文件进行修改时,源树。
【问题讨论】:
假设您有一个项目,其目录名为src,那么让我们按照以下步骤使用 autotools 构建和打包一个 python 扩展:
首先,您需要在项目的根目录中创建一个 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
此文件必须在项目的根目录中创建,并且必须列出您的项目需要构建的所有库、程序或任何类型的工具,例如编译器、链接器、库等。
像我这样的懒人一般不会从头开始创建,我更喜欢使用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
【讨论】:
所有 PyGTK 扩展都使用自动工具,所以如果 PyGTK 方面没有为您解决所有问题,可能值得一看 PyGTK source code。另外,here is one I wrote which is more simple.
【讨论】: