File: libmpi.py

package info (click to toggle)
mpi4py 1.3.1%2Bhg20131106-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 2,224 kB
  • ctags: 6,415
  • sloc: python: 12,056; ansic: 7,022; makefile: 697; f90: 158; cpp: 103; sh: 60
file content (80 lines) | stat: -rw-r--r-- 1,981 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import os.path as _pth
import cffi as _cffi

_wdir = _pth.abspath(_pth.dirname(__file__))

def _ffi_create(header, source, **kargs):
    ffi = _cffi.FFI()
    _ffi_define(ffi, header, **kargs)
    lib = _ffi_verify(ffi, source, **kargs)
    return ffi, lib

def _ffi_define(ffi, csource, **kargs):
    opt = kargs.pop('override', False)
    ffi.cdef(csource, opt)

def _ffi_verify(ffi, csource, **kargs):
    cc = kargs.pop('compiler', None)
    ld = kargs.pop('linker',   None)
    _ffi_verify_push(cc, ld)
    try:
        lib =  ffi.verify(csource, **kargs)
    finally:
        _ffi_verify_pop()
    return lib

def _ffi_verify_push(cc, ld):
    from distutils import sysconfig
    from distutils.spawn import find_executable
    global customize_compiler_orig
    customize_compiler_orig = sysconfig.customize_compiler
    if not cc and not ld: return
    def customize_compiler(compiler):
        customize_compiler_orig(compiler)
        if cc:
            compiler.compiler_so[0] = find_executable(cc)
        if ld:
            compiler.linker_so[0]= find_executable(ld)
    sysconfig.customize_compiler = customize_compiler

def _ffi_verify_pop():
    from distutils import sysconfig
    global customize_compiler_orig
    sysconfig.customize_compiler = customize_compiler_orig
    del customize_compiler_orig

def _read(filename):
    f = open(filename)
    try:
        return f.read()
    finally:
        f.close()

ffi, mpi = _ffi_create(
_read(_pth.join(_wdir, "libmpi.h")),
_read(_pth.join(_wdir, "libmpi.c")),
compiler='mpicc', linker='mpicc',
#ext_package='mpi4py',
#modulename='_cffi_mpi',
#tmpdir=_wdir,
#tmpdir='build'
)

import sys as _sys
_sys.modules[__name__+'.mpi'] = mpi
del _sys

#new = ffi.new
#cast = ffi.cast
#asbuffer = ffi.buffer
#globals().update(mpi.__dict__)

#del _sys, _cffi
#del _ffi_setup
#del _ffi_verify
#del _ffi_verify_enter
#del _ffi_verify_exit

if __name__ == '__main__':
    mpi.MPI_Init(ffi.NULL, ffi.NULL);
    mpi.MPI_Finalize()