130 lines
		
	
	
	
		
			3.6 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			130 lines
		
	
	
	
		
			3.6 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
| 
								 | 
							
								#!/usr/bin/python
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# diffconfig - a tool to compare .config files.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# originally written in 2006 by Matt Mackall
							 | 
						||
| 
								 | 
							
								#  (at least, this was in his bloatwatch source code)
							 | 
						||
| 
								 | 
							
								# last worked on 2008 by Tim Bird
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import sys, os
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def usage():
							 | 
						||
| 
								 | 
							
								    print """Usage: diffconfig [-h] [-m] [<config1> <config2>]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Diffconfig is a simple utility for comparing two .config files.
							 | 
						||
| 
								 | 
							
								Using standard diff to compare .config files often includes extraneous and
							 | 
						||
| 
								 | 
							
								distracting information.  This utility produces sorted output with only the
							 | 
						||
| 
								 | 
							
								changes in configuration values between the two files.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Added and removed items are shown with a leading plus or minus, respectively.
							 | 
						||
| 
								 | 
							
								Changed items show the old and new values on a single line.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If -m is specified, then output will be in "merge" style, which has the
							 | 
						||
| 
								 | 
							
								changed and new values in kernel config option format.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If no config files are specified, .config and .config.old are used.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Example usage:
							 | 
						||
| 
								 | 
							
								 $ diffconfig .config config-with-some-changes
							 | 
						||
| 
								 | 
							
								-EXT2_FS_XATTR  n
							 | 
						||
| 
								 | 
							
								-EXT2_FS_XIP  n
							 | 
						||
| 
								 | 
							
								 CRAMFS  n -> y
							 | 
						||
| 
								 | 
							
								 EXT2_FS  y -> n
							 | 
						||
| 
								 | 
							
								 LOG_BUF_SHIFT  14 -> 16
							 | 
						||
| 
								 | 
							
								 PRINTK_TIME  n -> y
							 | 
						||
| 
								 | 
							
								"""
							 | 
						||
| 
								 | 
							
								    sys.exit(0)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# returns a dictionary of name/value pairs for config items in the file
							 | 
						||
| 
								 | 
							
								def readconfig(config_file):
							 | 
						||
| 
								 | 
							
								    d = {}
							 | 
						||
| 
								 | 
							
								    for line in config_file:
							 | 
						||
| 
								 | 
							
								        line = line[:-1]
							 | 
						||
| 
								 | 
							
								        if line[:7] == "CONFIG_":
							 | 
						||
| 
								 | 
							
								            name, val = line[7:].split("=", 1)
							 | 
						||
| 
								 | 
							
								            d[name] = val
							 | 
						||
| 
								 | 
							
								        if line[-11:] == " is not set":
							 | 
						||
| 
								 | 
							
								            d[line[9:-11]] = "n"
							 | 
						||
| 
								 | 
							
								    return d
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def print_config(op, config, value, new_value):
							 | 
						||
| 
								 | 
							
								    global merge_style
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if merge_style:
							 | 
						||
| 
								 | 
							
								        if new_value:
							 | 
						||
| 
								 | 
							
								            if new_value=="n":
							 | 
						||
| 
								 | 
							
								                print "# CONFIG_%s is not set" % config
							 | 
						||
| 
								 | 
							
								            else:
							 | 
						||
| 
								 | 
							
								                print "CONFIG_%s=%s" % (config, new_value)
							 | 
						||
| 
								 | 
							
								    else:
							 | 
						||
| 
								 | 
							
								        if op=="-":
							 | 
						||
| 
								 | 
							
								            print "-%s %s" % (config, value)
							 | 
						||
| 
								 | 
							
								        elif op=="+":
							 | 
						||
| 
								 | 
							
								            print "+%s %s" % (config, new_value)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            print " %s %s -> %s" % (config, value, new_value)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def main():
							 | 
						||
| 
								 | 
							
								    global merge_style
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # parse command line args
							 | 
						||
| 
								 | 
							
								    if ("-h" in sys.argv or "--help" in sys.argv):
							 | 
						||
| 
								 | 
							
									usage()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    merge_style = 0
							 | 
						||
| 
								 | 
							
								    if "-m" in sys.argv:
							 | 
						||
| 
								 | 
							
								        merge_style = 1
							 | 
						||
| 
								 | 
							
								        sys.argv.remove("-m")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    argc = len(sys.argv)
							 | 
						||
| 
								 | 
							
								    if not (argc==1 or argc == 3):
							 | 
						||
| 
								 | 
							
								        print "Error: incorrect number of arguments or unrecognized option"
							 | 
						||
| 
								 | 
							
								        usage()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if argc == 1:
							 | 
						||
| 
								 | 
							
								        # if no filenames given, assume .config and .config.old
							 | 
						||
| 
								 | 
							
								        build_dir=""
							 | 
						||
| 
								 | 
							
								        if os.environ.has_key("KBUILD_OUTPUT"):
							 | 
						||
| 
								 | 
							
								            build_dir = os.environ["KBUILD_OUTPUT"]+"/"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        configa_filename = build_dir + ".config.old"
							 | 
						||
| 
								 | 
							
								        configb_filename = build_dir + ".config"
							 | 
						||
| 
								 | 
							
								    else:
							 | 
						||
| 
								 | 
							
								        configa_filename = sys.argv[1]
							 | 
						||
| 
								 | 
							
								        configb_filename = sys.argv[2]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    a = readconfig(file(configa_filename))
							 | 
						||
| 
								 | 
							
								    b = readconfig(file(configb_filename))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # print items in a but not b (accumulate, sort and print)
							 | 
						||
| 
								 | 
							
								    old = []
							 | 
						||
| 
								 | 
							
								    for config in a:
							 | 
						||
| 
								 | 
							
								        if config not in b:
							 | 
						||
| 
								 | 
							
								            old.append(config)
							 | 
						||
| 
								 | 
							
								    old.sort()
							 | 
						||
| 
								 | 
							
								    for config in old:
							 | 
						||
| 
								 | 
							
								        print_config("-", config, a[config], None)
							 | 
						||
| 
								 | 
							
								        del a[config]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # print items that changed (accumulate, sort, and print)
							 | 
						||
| 
								 | 
							
								    changed = []
							 | 
						||
| 
								 | 
							
								    for config in a:
							 | 
						||
| 
								 | 
							
								        if a[config] != b[config]:
							 | 
						||
| 
								 | 
							
								            changed.append(config)
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            del b[config]
							 | 
						||
| 
								 | 
							
								    changed.sort()
							 | 
						||
| 
								 | 
							
								    for config in changed:
							 | 
						||
| 
								 | 
							
								        print_config("->", config, a[config], b[config])
							 | 
						||
| 
								 | 
							
								        del b[config]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # now print items in b but not in a
							 | 
						||
| 
								 | 
							
								    # (items from b that were in a were removed above)
							 | 
						||
| 
								 | 
							
								    new = b.keys()
							 | 
						||
| 
								 | 
							
								    new.sort()
							 | 
						||
| 
								 | 
							
								    for config in new:
							 | 
						||
| 
								 | 
							
								        print_config("+", config, None, b[config])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								main()
							 |