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