[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