Приведение в порядок флагов сборки Cython, используемых gcc - PullRequest
0 голосов
/ 25 июня 2018

В настоящее время я использую 'setuptools', чтобы автоматически цитировать и компилировать мои модули Cython в Linux с помощью gcc. Отныне мне нужно больше контролировать флаги сборки, предоставляемые gcc. Если я использую следующее в моем setup.py:

cythonize(
    [Extension("*", ["project/*.pyx"])
    nthreads=4
)

Я получаю флаги сборки, которые выглядят так:

gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt -fPIC -I./fastmat/core -I/home/seb/.local/lib/python3.6/site-packages/numpy/core/include -Iproject/core -Ifastmat/inspect -Iutil -I/usr/include/python3.6m -c project/BlockDiag.c -o build/temp.linux-x86_64-3.6/project/BlockDiag.o

Здесь я совершенно поражен тем фактом, что несколько флагов сборки встречаются несколько раз и без выдачи этого каким-либо (для меня очевидным) способом.

Как я могу очистить эти флаги сборки, чтобы они выглядели так, как предложено здесь ? Я надеюсь узнать кое-что о setuptools, чтобы в конечном итоге получить полный контроль над процессом сборки без использования самостоятельного make-файла.

1 Ответ

0 голосов
/ 25 июня 2018

Флаги, которые GCC получает от одной из переменных env.Введите

$ python -c "from distutils import sysconfig;\
print(sysconfig.get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS',\
'BASECFLAGS', 'LDFLAGS', 'CCSHARED', 'LDSHARED', 'SO'))"

, чтобы распечатать их.Это то, что distutils использует по умолчанию для компиляции расширений.Теперь проверьте, какая env var вводит, какой флаг и соответственно переопределяет переменные env, например,

$ CC="gcc-7.3.0" CFLAGS="-Ofast" python setup.py build_ext

, чтобы использовать конкретную версию компилятора и включить O3 оптимизации.

Кроме того, это выглядиткак будто вы используете numpy.distutils вместо ванили distutils, так что помните о дополнительных флагах include / link numpy добавляет под капот.

...