[kernel] r6540 - in dists/sid/linux-2.6/debian: bin lib/python/debian_linux

Bastian Blank waldi at costa.debian.org
Tue May 9 10:52:31 UTC 2006


Author: waldi
Date: Tue May  9 10:52:30 2006
New Revision: 6540

Added:
   dists/sid/linux-2.6/debian/bin/abicheck.py   (contents, props changed)
   dists/sid/linux-2.6/debian/lib/python/debian_linux/abi.py   (contents, props changed)
Modified:
   dists/sid/linux-2.6/debian/rules.real

Log:
Add automatic abi checker.

* debian/bin/abicheck.py, debian/lib/python/debian_linux/abi.py: Add.
* debian/rules.real: Call abicheck.


Added: dists/sid/linux-2.6/debian/bin/abicheck.py
==============================================================================
--- (empty file)
+++ dists/sid/linux-2.6/debian/bin/abicheck.py	Tue May  9 10:52:30 2006
@@ -0,0 +1,89 @@
+#!/usr/bin/env python2.4
+
+import sys
+from debian_linux.abi import *
+from debian_linux.config import *
+
+class checker(object):
+    def __init__(self, dir, arch, subarch, flavour):
+        self.config = config_reader(["debian/arch"])
+        self.filename_new = "%s/Module.symvers" % dir
+        abiname = self.config['abiname',]['abiname']
+        if subarch == 'none':
+            self.filename_ref = "debian/arch/%s/abi-%s.%s" % (arch, abiname, flavour)
+        else:
+            self.filename_ref = "debian/arch/%s/%s/abi-%s.%s" % (arch, subarch, abiname, flavour)
+
+    def __call__(self, out):
+        ret = 0
+
+        new = symbols()
+        new.read_kernel(file(self.filename_new))
+        try:
+            ref = symbols(self.filename_ref)
+        except IOError:
+            out.write("Can't read ABI reference.  ABI not checked!  Continuing.\n")
+            return 0
+
+        add_info, change_info, remove_info = ref.cmp(new)
+        add = set(add_info.keys())
+        change = set(change_info.keys())
+        remove = set(remove_info.keys())
+        add_ignore, change_ignore, remove_ignore = self._ignore(add_info, change_info, remove_info)
+
+        add_effective = add - add_ignore
+        change_effective = change - change_ignore
+        remove_effective = remove - remove_ignore
+
+        if change_effective or remove_effective:
+            out.write("ABI has changed!  Refusing to continue.\n")
+            ret = 1
+        elif change or remove:
+            out.write("ABI has changed but all changes have been ignored.  Continuing.\n")
+        elif add_effective:
+            out.write("New symbols have been added.  Continuing.\n")
+        elif add:
+            out.write("New symbols have been added but have been ignored.  Continuing.\n")
+        else:
+            out.write("No ABI changes.\n")
+        if add:
+            out.write("\nAdded symbols:\n")
+            t = list(add)
+            t.sort()
+            for symbol in t:
+                info = []
+                if symbol in add_ignore:
+                    info.append("ignored")
+                info.append("module: %s" % add_info[symbol]['module'])
+                out.write("%-48s %s\n" % (symbol, ", ".join(info)))
+        if change:
+            out.write("\nChanged symbols:\n")
+            t = list(change)
+            t.sort()
+            for symbol in t:
+                info = []
+                if symbol in change_ignore:
+                    info.append("ignored")
+                if change_info[symbol].has_key('module'):
+                    info.append("module: %s -> %s" % change_info[symbol]['module'])
+                if change_info[symbol].has_key('version'):
+                    info.append("version: %s -> %s" % change_info[symbol]['version'])
+                out.write("%-48s %s\n" % (symbol, ", ".join(info)))
+        if remove:
+            out.write("\nRemoved symbols:\n")
+            t = list(remove)
+            t.sort()
+            for symbol in t:
+                info = []
+                if symbol in remove_ignore:
+                    info.append("ignored")
+                info.append("module: %s" % remove_info[symbol]['module'])
+                out.write("%-48s %s\n" % (symbol, ", ".join(info)))
+
+        return ret
+
+    def _ignore(self, add, change, remove):
+        return set(), set(), set()
+
+if __name__ == '__main__':
+    sys.exit(checker(*sys.argv[1:])(sys.stdout))

Added: dists/sid/linux-2.6/debian/lib/python/debian_linux/abi.py
==============================================================================
--- (empty file)
+++ dists/sid/linux-2.6/debian/lib/python/debian_linux/abi.py	Tue May  9 10:52:30 2006
@@ -0,0 +1,87 @@
+class symbols(object):
+    def __init__(self, filename = None):
+        if filename is not None:
+            self.read(file(filename))
+
+    def cmp(self, new):
+        symbols_ref = set(self.symbols.keys())
+        symbols_new = set(new.symbols.keys())
+
+        symbols_add = {}
+        symbols_remove = {}
+
+        symbols_change = {}
+
+        for symbol in symbols_new - symbols_ref:
+            symbols_add[symbol] = {'module': new.symbols[symbol][0]}
+
+        for symbol in symbols_ref.intersection(symbols_new):
+            module_ref, version_ref = self.symbols[symbol]
+            module_new, version_new = new.symbols[symbol]
+
+            ent = {}
+            if module_ref != module_new:
+                ent['module'] = module_ref, module_new
+            if version_ref != version_new:
+                ent['version'] = version_ref, version_new
+            if ent:
+                symbols_change[symbol] = ent
+
+        for symbol in symbols_ref - symbols_new:
+            symbols_remove[symbol] = {'module': self.symbols[symbol][0]}
+
+        return symbols_add, symbols_change, symbols_remove
+
+    def read(self, file):
+        self.modules = {}
+        self.symbols = {}
+
+        for line in file.readlines():
+            symbol, module, version = line.strip().split()
+
+            symbols = self.modules.get(module, {})
+            symbols[symbol] = version
+            self.modules[module] = symbols
+            if self.symbols.has_key(symbol):
+                pass
+            self.symbols[symbol] = module, version
+
+    def read_kernel(self, file):
+        self.modules = {}
+        self.symbols = {}
+
+        for line in file.readlines():
+            version, symbol, module = line.strip().split('\t')
+
+            symbols = self.modules.get(module, {})
+            symbols[symbol] = version
+            self.modules[module] = symbols
+            if self.symbols.has_key(symbol):
+                pass
+            self.symbols[symbol] = module, version
+
+    def write(self, file):
+        symbols = self.symbols.items()
+        symbols.sort()
+        for symbol, i in symbols:
+            module, version = i
+            file.write("%s %s %s\n" % (symbol, module, version))
+
+    def write_human(self, file):
+        modules = self.modules.keys()
+        modules.sort()
+        modules.remove('vmlinux')
+
+        file.write("Symbols in vmlinux\n\n")
+        symbols = self.modules['vmlinux'].items()
+        symbols.sort()
+        for symbol, version in symbols:
+            file.write("%-48s %s\n" % (symbol, version))
+
+        for module in modules:
+            file.write("\n\nSymbols in module %s\n\n" % module)
+            symbols = self.modules[module].items()
+            symbols.sort()
+            for symbol, version in symbols:
+                file.write("%-48s %s\n" % (symbol, version))
+

Modified: dists/sid/linux-2.6/debian/rules.real
==============================================================================
--- dists/sid/linux-2.6/debian/rules.real	(original)
+++ dists/sid/linux-2.6/debian/rules.real	Tue May  9 10:52:30 2006
@@ -137,6 +137,7 @@
 
 $(STAMPS_DIR)/build-$(ARCH)-$(SUBARCH)-$(FLAVOUR)-kernel-package: $(STAMPS_DIR)/setup-$(ARCH)-$(SUBARCH)-$(FLAVOUR)-$(TYPE)
 	cd '$(DIR)'; $(setup_env) $(setup_env_kpkg_jobs) PATH='$(CURDIR)/build:$(CURDIR)/bin:$(PATH)' $(kpkg_image) build
+	python2.4 debian/bin/abicheck.py $(DIR) $(ARCH) $(SUBARCH) $(FLAVOUR)
 	touch '$@'
 
 $(STAMPS_DIR)/build-$(ARCH)-$(SUBARCH)-$(FLAVOUR)-plain-xen: $(STAMPS_DIR)/setup-$(ARCH)-$(SUBARCH)-$(FLAVOUR)-$(TYPE)



More information about the Kernel-svn-changes mailing list