使用distutils为python扩展构建RPM时的相对包含路径

时间:2013-03-25 17:54:09

标签: python rpm distutils python-extensions

使用python 2.6,我正在尝试为python C扩展模块构建RPM。

我正在使用的setup.py包含类似的内容:

from distutils.core import setup, Extension

foo_ext = Extension('foo',
                    sources=['foo.c', '../src/common.c'],
                    include_dirs=['../includes'])

setup(... , ext_modules=[foo_ext])

例如,如果我从python setup.py build运行/devel/foo,它会编译并构建没有任何错误,并且使用正确的路径调用gcc,即:

gcc ... -I/devel/includes ...

当我使用python setup.py bdist_rpm代替时,上面使用的相对路径将转换为相对于RPM构建目录的绝对路径,这会导致gcc尝试使用以下编译:

gcc ... -I/devel/foo/build/bdist.linux-x86_64/rpm/BUILD/includes ...

然后编译失败,因为在包含路径中找不到所需的.h文件。

对此有任何建议或解决方法吗?

2 个答案:

答案 0 :(得分:2)

通过在第一次通过脚本期间设置环境变量来解决,然后在构建RPM时再次读取:

import os
from distutils.core import setup, Extension

src_path = os.path.abspath('../src/common.c')
inc_path = os.path.abspath('../includes')

if 'SRC_PATH' not in os.environ:
    os.environ['SRC_PATH'] = src_path
    os.environ['INC_PATH'] = inc_path
else:
    src_path = os.environ['SRC_PATH']
    inc_path = os.environ['INC_PATH']

foo_ext = Extension('foo',
                sources=['foo.c', src_path],
                include_dirs=[inc_path])

setup(... , ext_modules=[foo_ext])

答案 1 :(得分:0)

我可以通过向 distutils 提供一个正确的MANIFEST.in文件来解决类似的问题,该文件枚举了我想要包含的所有头文件。就我而言,它是这样的:

include src/_rvlm_fdtd/include/rvlm/fdtd/* –or–
recursive-include src/_rvlm_fdtd *.h

但我认为这不适用于您的../路径。相反,我建议您将所有源代码放在包基目录中。

RPM构建阶段无法找到您的标头的原因是它首先构建了一个源代码分发(使用setup.py sdist)并将解压缩结果压缩到临时构建目录中。因此,您的源代码分发不包含构建所需的所有文件。