[SciPy-dev] distutils, mtrand, Monte Carlo

Pearu Peterson pearu at scipy.org
Wed Apr 19 09:22:00 CDT 2006



On Wed, 19 Apr 2006, Ed Schofield wrote:

>> That would be a desirable feature. For example, when scipy would ship
>> blas/lapack source codes then it would be desirable to install blas/lapack
>> libraries so that various scipy subpackages could use them.
>> I have started implementing the support for this feature about half a year
>> ago but I haven't finished it yet, mostly because of I haven't had time
>> to figure out what would be good (portable,etc) locations of such
>> libraries and how would subpackages access them in different situations
>> (building whole scipy, building a subpackage without building scipy,
>> etc..).
>>
> I've been playing around with it some more, and it actually seems that
> config.add_extension already supports building and installing shared
> libraries.  Normally this is used for building Python extension modules,
> but the symbol table seems to be independent of Python unless the source
> files explicitly use Python symbols.  So, unless I'm very mistaken, this
> works already -- by using the machinery of add_extension rather than
> add_library.  Here's an example patch (to NumPy) that builds a beautiful
> shared library for randomkit:
>
> Index: numpy/random/setup.py
> ===================================================================
> --- numpy/random/setup.py       (revision 2374)
> +++ numpy/random/setup.py       (working copy)
> @@ -32,6 +32,10 @@
>                         )
>
>     config.add_data_files(('.', join('mtrand', 'randomkit.h')))
> +
> +    config.add_extension('librandomkit',
> +                         sources=[join('mtrand', 'randomkit.c')],
> +                         depends=[join('mtrand', 'randomkit.h')])
>
>     return config

Hmm, I haven't thought about the above approach but it can work. However,
there are some side effect that we should get rid of:
   the shared library will be linked against python library and so it's
   an unclean solution

To do things right, we should review command/build_ext.py code and
see if it can be used for building "clean" shared libraries when
Extension object has some is_shared_library flag set True (that is set via 
(to be implemented) add_shared_library method). If that does not work,
the next step is to copy necessary hooks for shared libraries from
build_ext.py to build_clib.py or create a new command build_slib (or 
something like that) altogether.


> I've also committed a new sandbox/montecarlo/setup.py file to scipy that
> uses this.  The relevant lines are:
>
>    random_lib_dir = os.path.dirname(numpy.random.__file__)
>
>    config.add_extension('_intsampler',
>              include_dirs = [numpy.get_numpy_include(), random_lib_dir],
>              libraries=['randomkit'],
>              library_dirs=[random_lib_dir],
>              runtime_library_dirs=[random_lib_dir],
>              sources = [join('src', f) for f in
>                        ['_intsamplermodule.c', 'compact5table.c']])
>
> This works fine under Linux.  I'll also test it out with Win32/MinGW.
> (By the way, does distutils provide its own way of retrieving the
> site-packages/numpy/random directory?)

See

     distutils.sysconfig.get_python_lib

function. Using smth like

   random_lib_dir = os.path.join(get_python_lib(),'numpy','random')

should work in this particular case but it's not a general solution. For 
in-place builds random_lib_dir should probably be the one starting with
path that build_py.get_package_dir(..) method would return, for instance.

So, supporting installing shared libraries in a robust way may require 
some work. Though, simple solutions like above might work already for 
certain platforms, we should be careful for not breaking scipy/numpy 
builds for other platforms.

Pearu




More information about the Scipy-dev mailing list