Skip to content

Commit

Permalink
python: move MakeVars class into separate module
Browse files Browse the repository at this point in the history
... so I can reuse it.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
  • Loading branch information
eqvinox committed Apr 27, 2020
1 parent 2768748 commit 879a9dc
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 42 deletions.
1 change: 1 addition & 0 deletions Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,7 @@ EXTRA_DIST += \
\
python/clidef.py \
python/clippy/__init__.py \
python/makevars.py \
\
redhat/frr.logrotate \
redhat/frr.pam \
Expand Down
50 changes: 50 additions & 0 deletions python/makevars.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,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
44 changes: 2 additions & 42 deletions tools/symalyzer.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,49 +21,9 @@
import re
from collections import namedtuple

class MakeVars(object):
'''
makevars['FOO_CFLAGS'] gets you "FOO_CFLAGS" from Makefile
'''
def __init__(self):
self._data = dict()
sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'python'))

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
from makevars import MakeVars

SymRowBase = namedtuple('SymRow', ['target', 'object', 'name', 'address', 'klass', 'typ', 'size', 'line', 'section', 'loc'])
class SymRow(SymRowBase):
Expand Down

0 comments on commit 879a9dc

Please sign in to comment.