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

Vla*_*oiu 5 c++ python distutils build

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

>>> 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
Run Code Online (Sandbox Code Playgroud)

这个问题的答案是行不通的;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
Run Code Online (Sandbox Code Playgroud)

好像OPTmakefile中为空,但实际上设置OPT=""没有效果。有什么方法可以告诉 distutils 不要添加这些标志吗?我知道我可以通过添加自己的标志来覆盖其中的大部分(手动取消定义宏,如-DNDEBUGwith-UNDEBUG和覆盖-O2with -O0),但这真的很丑陋,肯定应该有更好的方法。

icz*_*ala 2

我也遇到同样的问题,设置后OPT没有CFLAGS效果。似乎其他版本也有这个问题,这是一个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']
Run Code Online (Sandbox Code Playgroud)

新的

    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']
Run Code Online (Sandbox Code Playgroud)

这至少允许您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
Run Code Online (Sandbox Code Playgroud)