26

I want to pass some extra options to the Cython compiler by using extra_compile_args.

My setup.py:

from distutils.core import setup

from Cython.Build import cythonize

setup(
  name = 'Test app',
  ext_modules = cythonize("test.pyx", language="c++", extra_compile_args=["-O3"]),
)

However, when I run python setup.py build_ext --inplace, I get the following warning:

UserWarning: got unknown compilation option, please remove: extra_compile_args

Question: How does one use extra_compile_args correctly?

I use Cython 0.23.4 under Ubuntu 14.04.3.

Roman
  • 2,225
  • 5
  • 26
  • 55

3 Answers3

21

Use the more traditional way without cythonize to supply extra compiler options:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

setup(
  name = 'Test app',
  ext_modules=[
    Extension('test',
              sources=['test.pyx'],
              extra_compile_args=['-O3'],
              language='c++')
    ],
  cmdclass = {'build_ext': build_ext}
)
Mike Müller
  • 82,630
  • 20
  • 166
  • 161
16

Mike Muller's answer works, but builds extensions in the current directory, not next to the .pyx file when --inplace is given as in:

python3 setup.py build_ext --inplace

So my workaround is to compose a CFLAGS string and override the env variable:

os.environ['CFLAGS'] = '-O3 -Wall -std=c++11 -I"some/custom/paths"'
setup(ext_modules = cythonize(src_list_pyx, language = 'c++'))
Nick
  • 2,342
  • 28
  • 25
4

There's another way to do this, I found it to be the best one from other two presented because with this you still can use all regular cythonize arguments in usual way:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize

setup(
    name="Test app",
    ext_modules=cythonize(
        Extension(
            "test_ext", ["test.pyx"],
            extra_compile_args=["-O3"],
            language="c++",
        ),
    ),
)
0dminnimda
  • 1,242
  • 3
  • 12
  • 29