删除setup.py中的所有默认编译参数

时间:2013-11-04 23:40:24

标签: c++ python build distutils

我正在构建一个带有distutils的扩展模块,遗憾的是,它使用一堆我不想要的参数来调用编译器。具体来说,它使用/usr/lib64/python2.7/config/Makefile中定义的CFLAGS变量,该变量也由

返回
>>> from distutils import sysconfig
>>> print(sysconfig.get_config_vars()['CFLAGS'])
-fno-strict-aliasing -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4  -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv   -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4  -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv

给出question的答案不起作用;从命令行设置CFLAGS =“”会导致使用

调用gcc
-DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv

好像OPT在makefile中为空,但实际上设置OPT =“”无效。有没有办法告诉distutils不添加这些标志?我知道我可以通过添加自己的标志来覆盖其中的大多数(手动取消定义宏 - 如-DNDEBUG和-UNDEBUG并用-O0覆盖-O2),但这真的很丑陋,肯定应该有更好的方法。

1 个答案:

答案 0 :(得分:1)

我遇到的问题是设置OPTCFLAGS没有效果。似乎other builds也有这个问题,而且它是Distutils bug

这绝不是一个令人满意的解决方案,并且不会比你建议的那么难看,但我能够最终禁用这些标志并通过修改python/distutils/sysconfig.py来扩展我的扩展。我在customize_compiler函数中插入了几行(从我的安装的第206行开始)

    if 'LDFLAGS' in os.environ:
        ldshared = ldshared + ' ' + os.environ['LDFLAGS']
    if 'CFLAGS' in os.environ:
        cflags = opt + ' ' + os.environ['CFLAGS']
        ldshared = ldshared + ' ' + os.environ['CFLAGS']

    if 'LDFLAGS' in os.environ:
        ldshared = ldshared + ' ' + os.environ['LDFLAGS']
    if 'OPT' in os.environ:
        opt = os.environ['OPT']
    if 'CFLAGS' in os.environ:
        cflags = opt + ' ' + os.environ['CFLAGS']
        ldshared = ldshared + ' ' + os.environ['CFLAGS']

这至少允许您使用自己的参数完全覆盖默认的OPT参数。很可能有必要在那些没有引起问题的论据中加回来。

例如,对于我自己的项目,我用

编译
$OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 -DNDEBUG -g -fwrapv -O3" CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4" python setup.py build_ext --inplace