我怎样才能覆盖setup.py默认使用的编译器(gcc)标志?

时间:2011-08-03 14:28:36

标签: python gcc setup.py

据我所知,setup.py使用与构建python相同的CFLAGS。我有一个我们的C扩展,即segfaulting。我需要构建而不是 -O2,因为-O2正在优化某些值和代码,以便核心文件不足以解决问题。

我只需要修改setup.py,以便不使用-O2

我已阅读distutils文档,特别是distutils.ccompilerdistutils.unixcompiler,并了解如何添加标记和库并包含但不包含如何修改默认gcc标记。

具体来说,这是针对Python 2.5.1上的遗留产品,带有一堆反向端口(Fedora 8,是的,我知道......)。不,我无法更改操作系统或python版本,我不能,没有很大的问题,重新编译python。我只需要为一个客户构建一个C扩展,其中一个客户的环境是唯一的一个segfaulting。

3 个答案:

答案 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