据我所知,setup.py使用与构建python相同的CFLAGS。我有一个我们的C扩展,即segfaulting。我需要构建而不是 -O2
,因为-O2
正在优化某些值和代码,以便核心文件不足以解决问题。
我只需要修改setup.py,以便不使用-O2
。
我已阅读distutils文档,特别是distutils.ccompiler
和distutils.unixcompiler
,并了解如何添加标记和库并包含但不包含如何修改默认gcc标记。
具体来说,这是针对Python 2.5.1上的遗留产品,带有一堆反向端口(Fedora 8,是的,我知道......)。不,我无法更改操作系统或python版本,我不能,没有很大的问题,重新编译python。我只需要为一个客户构建一个C扩展,其中一个客户的环境是唯一的一个segfaulting。
答案 0 :(得分:66)
在运行CFLAGS="-O0"
之前添加setup.py
:
% CFLAGS="-O0" python ./setup.py
-O0
会在编译时附加到CFLAGS
,因此会覆盖以前的-O2
设置。
另一种方法是将-O0
添加到extra_compile_args
中的setup.py
:
moduleA = Extension('moduleA', .....,
include_dirs = ['/usr/include', '/usr/local/include'],
extra_compile_args = ["-O0"],
)
如果要删除所有默认标志,请使用:
% OPT="" python ./setup.py
答案 1 :(得分:3)
当我需要完全删除标志(-pipe)以便在低内存系统上编译SciPy时遇到了这个问题。我发现,作为一种黑客,我可以通过编辑/usr/lib/pythonN.N/_sysconfigdata.py删除该标志的每个实例来删除不需要的标志,其中N.N是您的Python版本。有很多重复项,我不确定setup.py实际使用了哪些重复项。
答案 2 :(得分:1)
distutils
/ setuptools
允许在 extra_compile_args
中定义 Python 扩展时使用 extra_link_args
/ setup.py
参数指定任何编译器/ 链接器标志脚本。这些额外的标志将添加在默认标志之后,并将覆盖之前存在的任何互斥标志。
然而,对于常规使用,这并没有多大用处,因为您通过 PyPI 分发的包可以由具有不兼容选项的不同编译器构建。
以下代码允许您以特定于扩展和编译器的方式指定这些选项:
from setuptools import setup
from setuptools.command.build_ext import build_ext
class build_ext_ex(build_ext):
extra_compile_args = {
'extension_name': {
'unix': ['-O0'],
'msvc': ['/Od']
}
}
def build_extension(self, ext):
extra_args = self.extra_compile_args.get(ext.name)
if extra_args is not None:
ctype = self.compiler.compiler_type
ext.extra_compile_args = extra_args.get(ctype, [])
build_ext.build_extension(self, ext)
setup(
...
cmdclass = {'build_ext': build_ext_ex},
...
)
当然,如果您希望所有扩展都使用相同的(但仍然是特定于编译器的)选项,您可以简化它。
这是一个 list of supported compiler types(由 setup.py build_ext --help-compiler
返回):
--compiler=bcpp Borland C++ Compiler
--compiler=cygwin Cygwin port of GNU C Compiler for Win32
--compiler=mingw32 Mingw32 port of GNU C Compiler for Win32
--compiler=msvc Microsoft Visual C++
--compiler=unix standard UNIX-style compiler