1

使用 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/foogcc

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

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

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

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

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

4

2 回答 2

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])
于 2013-03-26T10:08:18.953 回答
0

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

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

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

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

于 2015-02-12T17:01:34.173 回答