pkg-config kombiniert mit distutils.extension

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hi,

beim Kompilieren von C-Code, der GNOME-Bibliotheken verwendet, nutzt man normalerweise die Einstellungen, die `pkg-config` einem ausgibt.

Hier eine Funktion, die diese Flags in einem für `distutils` verständlichen Format übernimmt, damit man keine Handarbeit mehr beim Bau von Setupfiles für Python-Extensions hat:

Code: Alles auswählen

from Cython.Distutils import build_ext
from distutils.core import setup
from distutils.extension import Extension
from subprocess import PIPE, Popen


def pkgconfig(*packages):
    flags = {
        '-D': 'define_macros',
        '-I': 'include_dirs',
        '-L': 'library_dirs',
        '-l': 'libraries'}
    cmd = ['pkg-config', '--cflags', '--libs'] + list(packages)
    proc = Popen(cmd, stdout=PIPE, stderr=PIPE)
    output, error = proc.stdout.read(), proc.stderr.read()
    if error:
        raise ValueError(error)
    config = {}
    for token in output.split():
        flag, value = token[:2], token[2:]
        config.setdefault(flags[flag], []).append(value)
    if config.has_key('define_macros'):
        macros = [(name, None) for name in config['define_macros']]
        config['define_macros'] = macros
    return config

setup(
    cmdclass = {'build_ext': build_ext},
    ext_modules = [
        Extension('webkittest', ['webkittest.pyx'], **pkgconfig('webkit-1.0'))
    ]
)
Ich habe beispielhaft Webkit genommen, weil dort (zumindest auf meinem System) alle 4 Flags genutzt werden. Und ja, Cython weil ich das gerade selber nutze. ;)

Meine Vorlage war: http://code.activestate.com/recipes/502261/

EDIT: Wer findet den User, der sich in den Flags versteckt? ;P
Antworten