首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重写setup.py默认使用的编译器(GCC)标志?

如何重写setup.py默认使用的编译器(GCC)标志?
EN

Stack Overflow用户
提问于 2011-08-03 14:28:36
回答 3查看 37.6K关注 0票数 67

据我所知,setup.py使用与构建Python相同的CFLAGS。我有一个C扩展,那就是分段断层。我需要在没有 -O2的情况下构建它,因为-O2正在优化一些值和代码,这样核心文件就不足以解决问题。

我只需要修改setup.py,这样就不用使用-O2了。

我阅读了distutils文档,特别是distutils.ccompilerdistutils.unixccompiler,并了解了如何添加标志、库和包含,但没有看到如何修改默认的GCC标志。

具体来说,这是针对Python2.5.1上的一个遗留产品,它有许多后端(Fedora 8,是的,我知道.)。不,我不能更改OS或Python版本,而且我不能在没有重大问题的情况下重新编译Python。我只需要为一个客户构建一个C扩展,它的环境是唯一的分段错误。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-03 00:40:30

  • 在运行CFLAGS="-O0"之前准备好setup.py: % CFLAGS="-O0“python ./setup.py -O0将在编译时附加到CFLAGS,因此将覆盖以前的-O2设置。
  • 另一种方法是将-O0添加到setup.py中的extra_compile_args中: moduleA =扩展(‘moduleA’,.,include_dirs =‘/usr/include_dirs’,'/usr/local/include',extra_compile_args = "-O0",)
  • 如果要删除所有默认标志,请使用: % OPT="“python ./setup.py
票数 80
EN

Stack Overflow用户

发布于 2020-03-20 00:10:35

当我需要完全删除标志(-pipe)以便在低内存系统上编译SciPy时,我遇到了这个问题。我发现,作为一个黑客,我可以通过编辑/usr/lib/pythonN.N/_sysconfigdata.py来删除该标志的每个实例,其中N.N是Python版本。有很多重复的,我不确定哪些是setup.py实际使用的。

票数 5
EN

Stack Overflow用户

发布于 2021-07-12 14:46:18

distutils/​setuptools允许在setup.py脚本中定义setuptools扩展时使用extra_compile_args/​extra_link_args参数指定任何编译器/​链接器标志。这些额外的标志将在默认标志之后添加,并将覆盖前面出现的任何互斥标志。

然而,对于常规使用来说,这并没有多大用处,因为您通过PyPI分发的包可以由具有不兼容选项的不同编译器构建。

以下代码允许您以特定于扩展和编译器的方式指定这些选项:

代码语言:javascript
复制
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},
    ...
)

当然,如果希望所有扩展都使用相同(但仍然是特定于编译器的)选项,则可以简化它。

下面是一个受支持的编译器类型列表 (由setup.py build_ext --help-compiler返回):

代码语言:javascript
复制
--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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6928110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档