pass build_ext options to pip install

build, installation, pip, python

Solution

It's possible using `pip --global-option=build_ext`.

For example this is `requirements.txt` for Pillow with PNG and JPEG support and no other external libraries:

pillow \
        --global-option="build_ext" \
        --global-option="--enable-zlib" \
        --global-option="--enable-jpeg" \
        --global-option="--disable-tiff" \
        --global-option="--disable-freetype" \
        --global-option="--disable-tcl" \
        --global-option="--disable-tk" \ 
        --global-option="--disable-lcms" \
        --global-option="--disable-webp" \
        --global-option="--disable-webpmux" \
        --global-option="--disable-jpeg2000"

This is really an abuse of `pip --global-option`, inspired by this answer, as `build_ext` is a pip command and not really a global pip option. But this would make pip to execute two commands — first `build_ext` and then `install` — like this:

pip \
    build_ext \
        --enable-zlib --enable-jpeg \
        --disable-tiff --disable-freetype --disable-tcl --disable-tk \
        --disable-lcms --disable-webp --disable-webpmux --disable-jpeg2000 \
    install pillow

Problem

Is there some way to pass `build_ext` options to pip install to alter how an extension included in a package is compiled? (Yes, I know that one can download the source and build/install with a custom `setup.cfg`, but I'm curious whether it is possible to pass options that can be specified in `setup.cfg` directly through pip.)

Original source

Related problems