Я строю модуль расширения с 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
Ответ на этот вопрос вопрос не работает; установка 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 был пуст в make-файле, но на самом деле установка OPT = «» не имеет никакого эффекта. Есть ли способ сказать distutils не добавлять эти флаги? Я знаю, что могу переопределить большинство из них, добавив свои собственные флаги (вручную отменяя определения макросов, таких как -DNDEBUG с -UNDEBUG и переопределяя -O2 с -O0), но это действительно ужасно, и определенно должен быть лучший способ.
У меня была та же проблема, что установка OPT
а также CFLAGS
не имел никакого эффекта. Кажется как будто другие сборки также есть эта проблема, и это Distutils ошибка.
Это ни в коем случае не является удовлетворительным решением и не менее уродливым, чем то, что вы предлагаете, но я смог, наконец, отключить эти флаги и получить свое расширение для сборки, изменив 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
Других решений пока нет …