Использование distutils и build_clib для сборки библиотеки C

Есть ли у кого-нибудь хороший пример использования команды build_clib в distutils для создания внешней (не-питонной) библиотеки C из setup.py? Документация по этому предмету кажется редкой или несуществующей.

Моя цель - создать очень простую внешнюю библиотеку, а затем создать оболочку cython, которая ссылается на нее. Самый простой пример, который я нашел, здесь, но он использует вызов system() для gcc, который я не могу себе представить, это лучшая практика.

Ответ 1

Вместо того, чтобы передавать имя библиотеки в виде строки, передайте кортеж с источниками для компиляции:

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

Код доступен как сущность: https://gist.github.com/snorfalorpagus/2346f9a7074b432df959