使用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
文件。
对此有任何建议或解决方法吗?
答案 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
)并将解压缩结果压缩到临时构建目录中。因此,您的源代码分发不包含构建所需的所有文件。