Commit a717417e7f96ad2c6c3d80cdd0836e49597399a3
Committed by
Sam Ravnborg
1 parent
c28ca3aaa1
Exists in
master
and in
7 other branches
kconfig: add diffconfig utility
Diffconfig is a simple utility for comparing two kernel configuration files. See usage in the script for more info. Signed-off-by: Tim Bird <tim.bird@am.sony.com> Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Showing 1 changed file with 129 additions and 0 deletions Side-by-side Diff
scripts/diffconfig
1 | +#!/usr/bin/python | |
2 | +# | |
3 | +# diffconfig - a tool to compare .config files. | |
4 | +# | |
5 | +# originally written in 2006 by Matt Mackall | |
6 | +# (at least, this was in his bloatwatch source code) | |
7 | +# last worked on 2008 by Tim Bird | |
8 | +# | |
9 | + | |
10 | +import sys, os | |
11 | + | |
12 | +def usage(): | |
13 | + print """Usage: diffconfig [-h] [-m] [<config1> <config2>] | |
14 | + | |
15 | +Diffconfig is a simple utility for comparing two .config files. | |
16 | +Using standard diff to compare .config files often includes extraneous and | |
17 | +distracting information. This utility produces sorted output with only the | |
18 | +changes in configuration values between the two files. | |
19 | + | |
20 | +Added and removed items are shown with a leading plus or minus, respectively. | |
21 | +Changed items show the old and new values on a single line. | |
22 | + | |
23 | +If -m is specified, then output will be in "merge" style, which has the | |
24 | +changed and new values in kernel config option format. | |
25 | + | |
26 | +If no config files are specified, .config and .config.old are used. | |
27 | + | |
28 | +Example usage: | |
29 | + $ diffconfig .config config-with-some-changes | |
30 | +-EXT2_FS_XATTR n | |
31 | +-EXT2_FS_XIP n | |
32 | + CRAMFS n -> y | |
33 | + EXT2_FS y -> n | |
34 | + LOG_BUF_SHIFT 14 -> 16 | |
35 | + PRINTK_TIME n -> y | |
36 | +""" | |
37 | + sys.exit(0) | |
38 | + | |
39 | +# returns a dictionary of name/value pairs for config items in the file | |
40 | +def readconfig(config_file): | |
41 | + d = {} | |
42 | + for line in config_file: | |
43 | + line = line[:-1] | |
44 | + if line[:7] == "CONFIG_": | |
45 | + name, val = line[7:].split("=", 1) | |
46 | + d[name] = val | |
47 | + if line[-11:] == " is not set": | |
48 | + d[line[9:-11]] = "n" | |
49 | + return d | |
50 | + | |
51 | +def print_config(op, config, value, new_value): | |
52 | + global merge_style | |
53 | + | |
54 | + if merge_style: | |
55 | + if new_value: | |
56 | + if new_value=="n": | |
57 | + print "# CONFIG_%s is not set" % config | |
58 | + else: | |
59 | + print "CONFIG_%s=%s" % (config, new_value) | |
60 | + else: | |
61 | + if op=="-": | |
62 | + print "-%s %s" % (config, value) | |
63 | + elif op=="+": | |
64 | + print "+%s %s" % (config, new_value) | |
65 | + else: | |
66 | + print " %s %s -> %s" % (config, value, new_value) | |
67 | + | |
68 | +def main(): | |
69 | + global merge_style | |
70 | + | |
71 | + # parse command line args | |
72 | + if ("-h" in sys.argv or "--help" in sys.argv): | |
73 | + usage() | |
74 | + | |
75 | + merge_style = 0 | |
76 | + if "-m" in sys.argv: | |
77 | + merge_style = 1 | |
78 | + sys.argv.remove("-m") | |
79 | + | |
80 | + argc = len(sys.argv) | |
81 | + if not (argc==1 or argc == 3): | |
82 | + print "Error: incorrect number of arguments or unrecognized option" | |
83 | + usage() | |
84 | + | |
85 | + if argc == 1: | |
86 | + # if no filenames given, assume .config and .config.old | |
87 | + build_dir="" | |
88 | + if os.environ.has_key("KBUILD_OUTPUT"): | |
89 | + build_dir = os.environ["KBUILD_OUTPUT"]+"/" | |
90 | + | |
91 | + configa_filename = build_dir + ".config.old" | |
92 | + configb_filename = build_dir + ".config" | |
93 | + else: | |
94 | + configa_filename = sys.argv[1] | |
95 | + configb_filename = sys.argv[2] | |
96 | + | |
97 | + a = readconfig(file(configa_filename)) | |
98 | + b = readconfig(file(configb_filename)) | |
99 | + | |
100 | + # print items in a but not b (accumulate, sort and print) | |
101 | + old = [] | |
102 | + for config in a: | |
103 | + if config not in b: | |
104 | + old.append(config) | |
105 | + old.sort() | |
106 | + for config in old: | |
107 | + print_config("-", config, a[config], None) | |
108 | + del a[config] | |
109 | + | |
110 | + # print items that changed (accumulate, sort, and print) | |
111 | + changed = [] | |
112 | + for config in a: | |
113 | + if a[config] != b[config]: | |
114 | + changed.append(config) | |
115 | + else: | |
116 | + del b[config] | |
117 | + changed.sort() | |
118 | + for config in changed: | |
119 | + print_config("->", config, a[config], b[config]) | |
120 | + del b[config] | |
121 | + | |
122 | + # now print items in b but not in a | |
123 | + # (items from b that were in a were removed above) | |
124 | + new = b.keys() | |
125 | + new.sort() | |
126 | + for config in new: | |
127 | + print_config("+", config, None, b[config]) | |
128 | + | |
129 | +main() |