Откуда берутся эти дополнительные флаги компилятора при использовании setup.py для компиляции расширения Cython? - PullRequest
1 голос
/ 14 апреля 2020

Я пытаюсь скомпилировать простой маленький пример с миром Hello, чтобы почувствовать Cython. Работает, но компиляция завалена флагами, которые мне не нужны. Следуя примеру здесь Я смог очистить большую часть нежелательных флагов, но некоторые из них сохранились, несмотря на все мои усилия по контролю переменных среды. Последний комментарий в связанном вопросе указывает, что дополнительные флаги могут быть добавлены в компилятор производителем, но я убедился, что это маловероятно, используя несколько разных компиляторов, каждый из которых по умолчанию использует одни и те же дополнительные флаги.

Мой вызов setup.py выглядит следующим образом:

CC="gcc" CXX="g++" OPT="" CFLAGS="-O3 -D_GNU_SOURCE" BASECFLAGS="" LDFLAGS="" CCSHARED="" LDSHARED="gcc -shared" PY_CORE_FLAGS="" PY_CFLAGS="" AR="" ARFLAGS="" CPPFLAGS="" CPP="" SHLIB_SUFFIX="" python3 setup.py build_ext --inplace

setup.py очень прост:

from setuptools import Extension, setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize([Extension("hellotest", ["hellotest.pyx"])], language_level="3")
)

И, наконец, вывод g cc во время компиляции с нежелательными флагами, заключенными в квадратные скобки:

gcc [-DNDEBUG -g -fwrapv -O2 -Wall] -O3 -D_GNU_SOURCE -fPIC -I./ -I. -I/usr/include/python3.6m -c hellotest.c -o build/temp.linux-x86_64-3.6/hellotest.o
gcc [-DNDEBUG -g -fwrapv -O2 -Wall] -O3 -D_GNU_SOURCE -fPIC -I./ -I. -I/usr/include/python3.6m -c ./funcs.c -o build/temp.linux-x86_64-3.6/./funcs.o
gcc -shared -O3 -D_GNU_SOURCE build/temp.linux-x86_64-3.6/hellotest.o build/temp.linux-x86_64-3.6/./funcs.o -o build/lib.linux-x86_64-3.6/hellotest.cpython-36m-x86_64-linux-gnu.so

Кто-нибудь знает, где они находят свой путь в опции компилятора?

1 Ответ

1 голос
/ 15 апреля 2020

Setuptools наследует множество функциональных возможностей от distutils, и одним из них является определение cflags для сборки c -extensions.

Когда команда build_ext запущена, она вызывает distutils.sysconfig.customize_compiler(), который, в свою очередь, вызывает distutils.sysconfig.get_config_vars():

def customize_compiler(compiler):
    ...
        (cc, cxx, cflags, ccshared, ldshared, shlib_suffix, ar, ar_flags) = \
            get_config_vars('CC', 'CXX', 'CFLAGS',
                            'CCSHARED', 'LDSHARED', 'SHLIB_SUFFIX', 'AR', 'ARFLAGS')
   ...

, чтобы получить флаги по умолчанию, которые позже будут расширены значениями из переменной окружения CFLAGS и из файла настроек и , передаваемых компилятору .

get_config_vars() анализирует (по крайней мере, на Linux ) makefile, а также config-header, то есть pyconfig.h, и, таким образом, получает cflags (среди прочего), с которыми был собран текущий исполняемый файл Python. Затем для построения расширений используются те же самые cflags.

При необходимости можно манипулировать этими встроенными флагами, как я показал, например, в этом SO-post . Является ли это умным делом, это другой вопрос.


Это немного более тонко на Windows, где get_config_vars() не предоставляет такой большой информации - поэтому используются другие приемы строить с правильными параметрами (см., например, SO-post ).

...