Как использовать флаги оптимизации C в SWIG?

#c #python #swig

#c #python #swig

Вопрос:

Я создаю модуль python, который реализован на C . Я использую SWIG для создания интерфейса. Существуют различные способы создания расширения, я использую «предпочтительный подход», который используется через дистрибутивы python и который описан здесь. Имя моего модуля «ParseEvents», и для его компиляции я запускаю следующие две команды:

 swig -c   -python ParseEvents.i
python setup.py build_ext --inplace
  

Первая команда создает файл ParseEvents_wrap.cxx

Вторая команда использует следующее setup.py файл:

 from distutils.core import setup, Extension

ParseEvents_module = Extension('_ParseEvents',
                               sources=['ParseEvents_wrap.cxx',],
                               extra_compile_args=["-Wno-deprecated","-O3"],
                               )
setup (name = 'ParseEvents',
              ext_modules = [ParseEvents_module,],
              py_modules = ["ParseEvents"]
              )
  

Вопрос: Где и как мне указать, что я хочу, чтобы мой код C был скомпилирован с тегом компилятора -O3? Я предположил, что это будет просто в «extra_compile_args» части setup.py файл, но, похоже, это не тот случай. Когда я запускаю вторую команду (python setup.py build_ext —inplace), вот результат:

 running build_ext
building '_ParseEvents' extension
creating build
creating build/temp.linux-x86_64-2.6
gcc -pthread -fno-strict-aliasing -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 -fPIC -I/usr/include/python2.4 -c ParseEvents_wrap.cxx -o build/temp.linux-x86_64-2.4/ParseEvents_wrap.o -Wno-deprecated -O3
c   -pthread -shared build/temp.linux-x86_64-2.4/ParseEvents_wrap.o -o _ParseEvents.so
  

Обратите внимание, что оба флага -O2 и -O3 присутствуют в предпоследней строке выходных данных — Я бы хотел удалить -O2.

Комментарии:

1. Проверьте Make-файлы. Флаги компилятора указаны в файлах makefile. Если они сгенерированы make-файлами, то лучше всего проверить ваши файлы конфигурации и сборки.

Ответ №1:

В документе GCC явно сказано:

http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Optimize-Options.html

If you use multiple -O options, with or without level numbers, the last such option is the one that is effective.

Это означает, что ваш код будет скомпилирован с использованием -O3 фактически, так, как вы этого хотите. Не нужно беспокоиться о дублирующихся флагах оптимизации.

Ответ №2:

Distutils обладает прекрасной особенностью предоставления всех тех же флагов, с которыми был скомпилирован Python. В результате добавить дополнительные флаги легко, но удалить их — сплошная мука. Для этого необходимо создать подкласс класса компилятора, перехватить аргументы и вручную удалить флаг-нарушитель из списка аргументов, используемого функцией компиляции. В любом случае, это теория, документы слишком бедны, чтобы на самом деле показать вам, что вам нужно сделать, чтобы это произошло.

Но, как сказал Лютер, в вашем случае лишнее -O2 ничему не повредит.