Как я могу переопределить флаги компилятора (gcc), которые setup.py использует по умолчанию?
Я понимаю, что setup.py использует те же CFLAGS, которые использовались для сборки Python. У меня есть одно расширение C нашего, которое является segfaulting. Мне нужно построить это без -O2
так как -O2
оптимизирует некоторые значения и код, так что основных файлов недостаточно для определения проблемы.
Мне просто нужно изменить setup.py, чтобы -O2
не используется
Я прочитал документацию distutils, в частности distutils.ccompiler
а также distutils.unixcompiler
и посмотрите, как добавить флаги, библиотеки и библиотеки, но не как изменить стандартные флаги gcc.
В частности, это для устаревшего продукта на Python 2.5.1 с кучей бэкпортов (Fedora 8, да, я знаю...). Нет, я не могу изменить версию ОС или python и не могу без особых проблем перекомпилировать python. Мне просто нужно создать одно расширение C для одного клиента, чья среда является единственным segfaulting.
3 ответа
Prepend
CFLAGS="-O0"
прежде чем бежатьsetup.py
:% CFLAGS="-O0" python ./setup.py
-O0
будет добавлен кCFLAGS
во время компиляции, поэтому переопределит предыдущий-O2
установка.Другой способ добавить
-O0
вextra_compile_args
вsetup.py
:moduleA = Extension('moduleA', ....., include_dirs = ['/usr/include', '/usr/local/include'], extra_compile_args = ["-O0"], )
Если вы хотите удалить все флаги по умолчанию, используйте:
% OPT="" python ./setup.py
Я столкнулся с этой проблемой, когда мне нужно было полностью удалить флаг (-pipe), чтобы я мог скомпилировать SciPy в системе с низким объемом памяти. Я обнаружил, что в качестве хака я могу удалить ненужные флаги, отредактировав /usr/lib/pythonN.N/_sysconfigdata.py, чтобы удалить все экземпляры этого флага, где NN - ваша версия Python. Есть много дубликатов, и я не уверен, какие на самом деле используются в setup.py.
distutils
/
setuptools
позволяет указывать любые флаги компилятора / компоновщика с помощью
extra_compile_args
/
extra_link_args
аргумент при определении расширения Python в
setup.py
сценарий. Эти дополнительные флаги будут добавлены после флагов по умолчанию и переопределят любые взаимоисключающие флаги, существующие ранее.
Однако для регулярного использования это не очень полезно, поскольку пакет, который вы распространяете через PyPI, может быть собран разными компиляторами, имеющими несовместимые параметры.
Следующий код позволяет указать эти параметры в зависимости от расширения и компилятора :
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
):
--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