2013-05-31 16 views
11

Qualcuno ha un buon esempio di utilizzo del comando build_clib in distutils per creare una libreria C esterna (non python) da setup.py? La documentazione sull'argomento sembra essere scarsa o inesistente.Uso di distutils e build_clib per creare la libreria C

Il mio obiettivo è creare una libreria esterna molto semplice, quindi creare un wrapper cython che si collega ad esso. L'esempio più semplice che ho trovato è here, ma questo utilizza una chiamata a gcc system() che non riesco a immaginare è la migliore pratica.

+1

"Come costruire terze parti C/Libreria C++ da setup.py? " Questa è una domanda importante e un caso di uso comune (se si stanno scrivendo binding Python per una libreria C, quindi setup.py deve creare la libreria dal sorgente prima di poter creare l'estensione Python). Mi auguro che la documentazione lo abbia trattato meglio (per niente!) –

+2

Grazie per la condivisione, non l'avrei mai capito diversamente. Ho trovato il mio a lavorare su https://github.com/hickford/primesieve-python/blob/master/setup.py –

risposta

10

Invece di passare un nome di libreria come una stringa, passare una tupla con le fonti per compilare:

setup.py

import sys 
from distutils.core import setup 
from distutils.command.build_clib import build_clib 
from distutils.extension import Extension 
from Cython.Distutils import build_ext 

libhello = ('hello', {'sources': ['hello.c']}) 

ext_modules=[ 
    Extension("demo", ["demo.pyx"]) 
] 

def main(): 
    setup(
     name = 'demo', 
     libraries = [libhello], 
     cmdclass = {'build_clib': build_clib, 'build_ext': build_ext}, 
     ext_modules = ext_modules 
    ) 

if __name__ == '__main__': 
    main() 

ciao.c

int hello(void) { return 42; } 

ciao.h

int hello(void); 

demo.pyx

cimport demo 
cpdef test(): 
    return hello() 

demo.pxd

cdef extern from "hello.h": 
    int hello() 

codice è disponibile sotto forma di succo: https://gist.github.com/snorfalorpagus/2346f9a7074b432df959

+0

Ciao. Stavo cercando di farlo, ma a quanto pare l'argomento "librerie" si aspetta solo un elenco di stringhe con nomi di librerie. È corretto? ... – dividebyzero

+0

L'argomento delle librerie dovrebbe essere un elenco di tuple di 2, il cui primo elemento è una stringa di nomi per la libreria e il secondo come dizionario di parametri. Vedi la funzione build_libraries() la fonte: http://svn.python.org/projects/python/branches/pep-0384/Lib/distutils/command/build_clib.py – Snorfalorpagus

Problemi correlati