2017-05-16 2 views
0

Ich bin am Anfang eine generierte Header-Datei in ffi.cdef(), mit einem Bündel von typedefs wie diese Fütterung:Python CFFI kopiert nicht typedef aus cdef() in generierten C-Datei

typedef enum 
{ 
    LE_GPIO_EDGE_NONE = 0, 
    LE_GPIO_EDGE_RISING = 1, 
    // ...etc... 
} 
le_gpio_Edge_t; 

Dann versuche ich, zu kompilieren:

with open(args.api_name + '_cdef.h') as f: 
    cdef = f.read() 

ffibuilder.cdef(cdef) 
if __name__ == "__main__": 
    ffibuilder.compile(verbose=True) 

Aber es erzeugt C-Code wie folgt aus:

static int _cffi_const_LE_GPIO_EDGE_RISING(unsigned long long *o) 
{ 
    int n = (LE_GPIO_EDGE_RISING) <= 0; 
    *o = (unsigned long long)((LE_GPIO_EDGE_RISING) | 0); /* check that LE_GPIO_EDGE_RISING is an integer */ 
    return n; 
} 

Welche th verursacht e bauen, scheitern, weil das Symbol LE_GPIO_EDGE_RISING nicht überall definiert ist (oder anderswo verwiesen)

le_gpio.c: In function ‘_cffi_const_LE_GPIO_EDGE_RISING’: 
le_gpio.c:494:12: error: ‘LE_GPIO_EDGE_RISING’ undeclared (first use in this function) 
    int n = (LE_GPIO_EDGE_RISING) <= 0; 

Antwort

2

Methode ffibuilder.set_source die Typdefinition auf die erzeugte C-Datei zu platzieren scheint.

import cffi 

ffibuilder = cffi.FFI() 

tdef = r""" 
typedef enum 
{ 
    LE_GPIO_EDGE_NONE = 0, 
    LE_GPIO_EDGE_RISING = 1, 
    // ...etc... 
} le_gpio_Edge_t; 
""" 

ffibuilder.set_source("package._foo", tdef) 
ffibuilder.cdef(tdef) 

if __name__ == "__main__": 
    ffibuilder.compile(verbose=True) 

Siehe documentation for c_header_source argument of set_source.