26

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.)

lebedov
  • 1,371
  • 2
  • 12
  • 27

3 Answers3

19

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
Community
  • 1
  • 1
Tometzky
  • 22,573
  • 5
  • 59
  • 73
12

You can create .pydistutils.cfg file in your home directory and override build options like you could do with custom setup.cfg, but without need to unpack package first.

So, for example, you can write something like this to alter include & lib search path:

[build_ext]
include_dirs=/usr/local/include
library_dirs=/usr/local/lib64
rpath=/usr/local/lib64
ACyclic
  • 5,904
  • 6
  • 26
  • 28
toriningen
  • 7,196
  • 3
  • 46
  • 68
1

I searched for such option in pip and found none (searched the source too).

I don't think there is no such option in easy_install/setuptools too.

The only solution I see is an old-school way:

download / unpack / setup.py build_ext [options] / setup.py install.

Robert Lujo
  • 15,383
  • 5
  • 56
  • 73