我正在构建一个带有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),但这真的很丑陋,肯定应该有更好的方法。
答案 0 :(得分:1)
我遇到的问题是设置OPT
和CFLAGS
没有效果。似乎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