Welcome, guest | Sign In | My Account | Store | Cart

This recipe creates a class to allow access to variables stored in pkg-config files ( or '.pc' files ). This is usefull in conjunction with distutils to get correct information for compiling external C/C++ modules. Variable substitution is performed with string.Template.

Python, 42 lines
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import os
from string import Template

class pkgconfig(dict):
  _paths = ['/usr/lib/pkgconfig', '/usr/local/lib/pkgconfig']

  def __init__(self, package):
    self._load(package)

  def _load(self, package):
    for path in self._paths:
      fn = os.path.join(path, '%s.pc' % package)
      if os.path.exists(fn):
        self._parse(fn)

  def _parse(self, filename):
    lines = open(filename).readlines()

    lokals = {}

    for line in lines:
      line = line.strip()

      if not line:
        continue
      elif ':' in line: # exported variable
        name, val = line.split(':')
        val = val.strip()
        if '$' in val:
          try:
            val = Template(val).substitute(lokals)
          except ValueError:
            raise ValueError("Error in variable substitution!")
        self[name] = val
      elif '=' in line: # local variable
        name, val = line.split('=')
        if '$' in val:
          try:
            val = Template(val).substitute(lokals)
          except ValueError:
            raise ValueError("Error in variable substitution!")
        lokals[name] = val

The pkg-config command can provide both compiler and linker arguments given the name of a library. This class reads pkg-config files exposing the information to Python. It is usefull in conjunction with distutils when building external C/C++ libraries.

I have subclassed a dict as the information held is simple key/val strings. Variables in pkg-config are stored like '${myvar}' which just so happens to be what string.Template uses :)

I do not know about pkg-config paths on Win32 systems but it should be simple enough to add any extra required paths.