2013-05-31 18 views
11

誰かがdistutilsでbuild_clibコマンドを使用して、setup.pyの外部(非Python)Cライブラリを構築する良い例はありますか?対象に関する文書はまれであるか存在しないようです。distutilsとbuild_clibを使ってCライブラリを構築する

私の目的は、非常に単純な外部ライブラリを構築し、次にそれにリンクするcythonラッパーを構築することです。私が見つけた最も簡単な例はhereですが、これはsystem()というgccの呼び出しを使用していますが、これはベストプラクティスではありません。

+1

「どのようにサードパーティ製のCを構築するために/ setup.pyのC++ライブラリ? "これは重要な質問です。(Cライブラリ用のPythonバインディングを作成する場合は、Python拡張をビルドする前にsetup.pyがソースからライブラリをビルドする必要があります)。私はこの文書をもっとうまくカバーしてほしいと思っています。 –

+2

共有してくれてありがとう、私は決してこれを考え出さなかったでしょう。 https://github.com/hickford/primesieve-python/blob/master/setup.py –

答えて

10

代わりに文字列としてライブラリ名を渡す、コンパイルするソースとタプルを渡す:

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

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

コードを要旨として提供されていますdemo.pxd:https://gist.github.com/snorfalorpagus/2346f9a7074b432df959

+0

こんにちは。私はそれをやろうとしていましたが、明らかに "libraries"引数はライブラリ名の文字列のリストしか期待していません。それは正しいですか?... – dividebyzero

+0

ライブラリ引数は、2つのタプルのリストでなければなりません。最初の要素はライブラリの名前文字列で、2番目の要素はパラメータの辞書です。ソースのbuild_libraries()関数を参照してください:http://svn.python.org/projects/python/branches/pep-0384/Lib/distutils/command/build_clib.py – Snorfalorpagus

関連する問題