portable extensions options for external libraries

Discussion in 'Python' started by Alexandre Guimond, Oct 18, 2006.

  1. 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.
     
    Alexandre Guimond, Oct 18, 2006
    #1
    1. Advertising

  2. Alexandre Guimond

    Robert Kern Guest

    Alexandre Guimond wrote:

    > 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
     
    Robert Kern, Oct 18, 2006
    #2
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Eli Bendersky
    Replies:
    1
    Views:
    1,206
    Mike Treseler
    Mar 1, 2006
  2. Christian  Decker

    Portable libraries for Mac/Win/Lin?

    Christian Decker, Oct 19, 2004, in forum: C++
    Replies:
    3
    Views:
    334
    Mike Wahler
    Oct 19, 2004
  3. John Hunter

    building portable win32 extensions

    John Hunter, Mar 3, 2004, in forum: Python
    Replies:
    0
    Views:
    302
    John Hunter
    Mar 3, 2004
  4. Replies:
    7
    Views:
    947
  5. lovecreatesbeauty

    What gcc options guarantee more portable C code

    lovecreatesbeauty, Jun 15, 2006, in forum: C Programming
    Replies:
    28
    Views:
    1,220
    Peter Nilsson
    Jun 17, 2006
Loading...

Share This Page