diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2013-03-31 01:35:19 +0100 |
---|---|---|
committer | Johannes Berg <johannes@sipsolutions.net> | 2013-03-31 01:35:19 +0100 |
commit | 69f20651c12f1595abb4297d47265dd7f56e1154 (patch) | |
tree | 612ab82b720458dd971f567e2ea9c16e761613d9 /lib | |
parent | 29879860f4acced68c000fd30c5f0a87c1aa873e (diff) |
disable impossible symbols
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/kconfig.py | 12 | ||||
-rw-r--r-- | lib/make.py | 66 |
2 files changed, 78 insertions, 0 deletions
diff --git a/lib/kconfig.py b/lib/kconfig.py index 3ea534a8..f2dc894d 100644 --- a/lib/kconfig.py +++ b/lib/kconfig.py @@ -76,3 +76,15 @@ class ConfigTree(object): outf = open(os.path.join(self.basedir, nf), 'w') outf.write(out) outf.close() + + def disable_symbols(self, syms): + for nf in self._walk(self.rootfile): + out = '' + for l in open(os.path.join(self.basedir, nf), 'r'): + m = cfg_line.match(l) + out += l + if m and m.group('sym') in syms: + out += "\tdepends on n\n" + outf = open(os.path.join(self.basedir, nf), 'w') + outf.write(out) + outf.close() diff --git a/lib/make.py b/lib/make.py new file mode 100644 index 00000000..3ed2b675 --- /dev/null +++ b/lib/make.py @@ -0,0 +1,66 @@ +# +# Small helper library to read and manipulate kernel Makefiles +# + +import os, re + +obj_line = re.compile(r'^obj-(?P<dep>[^\s]*)\s*.?=\s*(?P<tgt>[^\\]*)\s*(?P<cont>\\?)') + +class MakeTree(object): + def __init__(self, rootfile): + self.basedir = os.path.dirname(rootfile) + self.rootfile = os.path.basename(rootfile) + self._no_syms = [] + self._walked = False + self._found_makefiles = [] + + def _check_for_sym(self, f, sym): + # re-read Makefile to see if it declared this symbol ... + r = re.compile('^%s-(y|objs)\s*[+:]?=' % sym) + for l in open(os.path.join(self.basedir, f), 'r'): + if r.match(l): + # FIXME: check if symbol dependencies can be satisfied! + return True + return False + + def _walk(self, f=None, subdir='', sym=None): + if self._walked: + return + if not os.path.exists(os.path.join(self.basedir, subdir, f)): + #print "no %s" % os.path.join(self.basedir, subdir, f) + assert not sym is None + self._no_syms.append(sym) + return + self._found_makefiles.append(os.path.join(self.basedir, subdir, f)) + for l in open(os.path.join(self.basedir, subdir, f), 'r'): + m = obj_line.match(l) + if not m: + continue + dep = m.group('dep') + if dep[:2] == '$(': + if dep[-1] != ')': + raise Exception("Couldn't parse make dependency %s" % dep) + dep = dep[2:-1] + tgt = m.group('tgt') + for t in tgt.strip().split(): + t = t.strip() + if not t: + continue + if t[-1] == '/': + self._walk(f='Makefile', subdir=os.path.join(subdir, t), sym=dep) + elif t[-2:] == '.o': + t = t[:-2] + '.c' + if not os.path.exists(os.path.join(self.basedir, subdir, t)): + if not self._check_for_sym(os.path.join(subdir, f), t[:-2]): + self._no_syms.append(dep) + else: + assert False + # FIXME: consider continuation lines! + + def get_impossible_symbols(self): + self._walk(self.rootfile) + return self._no_syms + + def get_makefiles(self): + self._walk(self.rootfile) + return self._found_makefiles |