What is the easiest way to make an optional C extension for a python package?
There's actually a distribute/setuptools feature called "Features" that can be used for this. It's explicitly designed to have setup.py do different things based on --with-xxx
and --without-xxx
command line options.
- This blog post gives a nice introduction, I can't find any better documentation at this time (besides the Distribute source - the Feature class and features keyword).
- The jinja project's setup.py uses Features for your exact purpose, it might be a good template to work from.
- The simplejson setup.py also does something similar, except that it's coded to always try to build the C-extension feature it defines, and fall back gracefully to pure-python when building fails; this may also be useful for your purpose.
ext_modules = []if '--add-this' in sys.argv: ext_modules.append(Extension(...)) sys.argv.remove('--add-this')setup(... ext_modules = ext_modules)
This is hacky, but might be easiest. A more advanced approach would be to extend the Distribution class to support a flag, say --with-modules
and then customize ext_modules inside finalize_options.