23

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,055
  • 4
  • 19
  • 52

3 Answers3

20

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
  • 77,540
  • 18
  • 155
  • 159
15

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,232
  • 28
  • 25
1

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
  • 990
  • 2
  • 10
  • 27