portable extensions options for external libraries

A

Alexandre Guimond

Hi.

I want to create a portable setup.py file for windows / linux for an
extension package that i need to link with external libraries (gsl and
boost). on windows i do something like this:

imaging = Extension( 'pyag.imaging._imaging',
sources = ( glob.glob(
'Source/pyag/imaging/Src/*.cpp' ) +
glob.glob(
'Source/pyag/imaging/Src/*.h' ) ),
include_dirs = ( get_numpy_include_dirs() +
[ 'Source/pyag/imaging/Src/',
'C:/Program
Files/boost/include/boost-1_35',
'C:/Program
Files/GnuWin32/include'] ),
library_dirs = [ 'C:/Program Files/GnuWin32/lib'
],
libraries = [ 'libgsl', 'libgslcblas' ] )

obviously, the paths could vary. on unix, i need something like:

imaging = Extension( 'pyag.imaging._imaging',
sources = ( glob.glob(
'Source/pyag/imaging/Src/*.cpp' ) +
glob.glob(
'Source/pyag/imaging/Src/*.h' ) ),
include_dirs = ( get_numpy_include_dirs() +
[ 'Source/pyag/imaging/Src/' ] )
)

so my question is: what is the right way of specifying extensions
options (include_dirs, libraries, library_dirs) so that they are
portable between windows and linux? i'm thinking environment variables.
Though fairly easy to do, i was wondering if python/distutils provided
something more convenient, like searching through "common" directories,
though those aren't very standard on windows? Optimally, i would like
to have something like:

imaging = Extension( 'pyag.imaging._imaging',
sources = ( glob.glob(
'Source/pyag/imaging/Src/*.cpp' ) +
glob.glob(
'Source/pyag/imaging/Src/*.h' ) ),
include_dirs = ( get_numpy_include_dirs() +
[ 'Source/pyag/imaging/Src/' ] +
boost_include_dirs +
gsl_include_dirs ),
library_dirs = boost_library_dirs +
gsl_library_dirs,
libraries = boost_libraries + gsl_libraries )


thx for any help.

alex.
 
R

Robert Kern

Alexandre said:
so my question is: what is the right way of specifying extensions
options (include_dirs, libraries, library_dirs) so that they are
portable between windows and linux? i'm thinking environment variables.

The user can already use command-line options and CFLAGS if he so desires, so I
wouldn't add any new environment variables.

$ CFLAGS=-I/opt/local/include python setup.py build_ext -L/opt/local/lib
Though fairly easy to do, i was wondering if python/distutils provided
something more convenient, like searching through "common" directories,
though those aren't very standard on windows?

distutils wouldn't do any searching at all. Your compiler will, though.
Optimally, i would like
to have something like:

imaging = Extension( 'pyag.imaging._imaging',
sources = ( glob.glob(
'Source/pyag/imaging/Src/*.cpp' ) +
glob.glob(
'Source/pyag/imaging/Src/*.h' ) ),
include_dirs = ( get_numpy_include_dirs() +
[ 'Source/pyag/imaging/Src/' ] +
boost_include_dirs +
gsl_include_dirs ),
library_dirs = boost_library_dirs +
gsl_library_dirs,
libraries = boost_libraries + gsl_libraries )

That's pretty much how everyone else does it. Just make sure that
boost_{include,library}_dirs and gsl_{include,library}_dirs are defined near the
top of the file with suitable comments to draw attention to them.

However, I might suggest making a setup.cfg with something like the following
section (unindented):

# Uncomment and modify the following section to configure the locations of the
# Boost and GSL headers and libraries.

#[build_ext]
#include-dirs=/opt/local/include,/usr/local/include
#library-dirs=/opt/local/lib,/usr/local/lib

Changing data in a data file feels better to me than changing data in a program
for some reason.

--
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
that is made terrible by our own mad attempt to interpret it as though it had
an underlying truth."
-- Umberto Eco
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top