summaryrefslogtreecommitdiff
path: root/python/makevars.py
blob: e0e2031a0d4ad8b57e4661a1618309cc1ecc65f0 (plain)
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
43
44
45
46
47
48
49
50
#
# helper class to grab variables from FRR's Makefile
#

import os
import subprocess

class MakeVars(object):
    '''
    makevars['FOO_CFLAGS'] gets you "FOO_CFLAGS" from Makefile
    '''
    def __init__(self):
        self._data = dict()

    def getvars(self, varlist):
        '''
        get a batch list of variables from make.  faster than individual calls.
        '''
        rdfd, wrfd = os.pipe()

        shvars = ['shvar-%s' % s for s in varlist]
        make = subprocess.Popen(['make', '-s', 'VARFD=%d' % wrfd] + shvars, pass_fds = [wrfd])
        os.close(wrfd)
        data = b''

        rdf = os.fdopen(rdfd, 'rb')
        while True:
            rdata = rdf.read()
            if len(rdata) == 0:
                break
            data += rdata

        del rdf
        make.wait()

        data = data.decode('US-ASCII').strip().split('\n')
        for row in data:
            k, v = row.split('=', 1)
            v = v[1:-1]
            self._data[k] = v

    def __getitem__(self, k):
        if k not in self._data:
            self.getvars([k])
        return self._data[k]

    def get(self, k, defval = None):
        if k not in self._data:
            self.getvars([k])
        return self._data[k] or defval