2013-05-31 12 views
11

Czy ktoś ma dobry przykład użycia polecenia build_clib w distutils do zbudowania zewnętrznej (nie pythonowej) biblioteki C z setup.py? Dokumentacja na ten temat wydaje się być rozproszona lub nieistniejąca.Używanie distutils i build_clib do budowy biblioteki C

Moim celem jest zbudowanie bardzo prostej biblioteki zewnętrznej, a następnie zbudowanie owijki cytonowej, która łączy się z nią. Najprostszy przykład, jaki znalazłem, to here, ale używa on połączenia system() do gcc, którego nie mogę sobie wyobrazić, jest najlepszą praktyką.

+1

„Jak zbudować innej firmy C/Biblioteka C++ z setup.py? " Jest to ważne pytanie i typowe przypadki użycia (jeśli piszesz powiązania Pythona dla biblioteki C, to instalator musi zbudować bibliotekę ze źródła, zanim będzie mogła zbudować rozszerzenie Pythona). Szkoda, że ​​dokumentacja nie pokryła tego lepiej (w ogóle!). –

+2

Dzięki za podzielenie się, nigdy bym tego nie wymyślił. Mam moje do pracy na https://github.com/hickford/primesieve-python/blob/master/setup.py –

Odpowiedz

10

Zamiast przekazując nazwę biblioteki jako ciąg, przechodzą krotka ze źródłami do kompilacji:

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() 

hello.c

int hello(void) { return 42; } 

hello.h

int hello(void); 

demo.pyx

cimport demo 
cpdef test(): 
    return hello() 

demo.pxd

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

Kod jest dostępny jako GIST: https://gist.github.com/snorfalorpagus/2346f9a7074b432df959

+0

Witam. Próbowałem to zrobić, ale najwyraźniej argument "biblioteki" oczekuje tylko listy ciągów z nazwami bibliotek. Czy to prawda? ... – dividebyzero

+0

Argumenty biblioteki powinny być listą 2-tek, których pierwszym elementem jest ciąg znaków dla biblioteki, a drugi jako słownik parametrów. Zobacz funkcję build_libraries() ze źródła: http://svn.python.org/projects/python/branches/pep-0384/Lib/distutils/command/build_clib.py – Snorfalorpagus

Powiązane problemy