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