1 #!/usr/bin/env python3 2 # SPDX-License-Identifier: GPL-2.0 3 # 4 # diffconfig - a tool to compare .config files 5 # 6 # originally written in 2006 by Matt Mackall 7 # (at least, this was in his bloatwatch sourc 8 # last worked on 2008 by Tim Bird 9 # 10 11 import sys, os 12 13 def usage(): 14 print("""Usage: diffconfig [-h] [-m] [<con 15 16 Diffconfig is a simple utility for comparing t 17 Using standard diff to compare .config files o 18 distracting information. This utility produce 19 changes in configuration values between the tw 20 21 Added and removed items are shown with a leadi 22 Changed items show the old and new values on a 23 24 If -m is specified, then output will be in "me 25 changed and new values in kernel config option 26 27 If no config files are specified, .config and 28 29 Example usage: 30 $ diffconfig .config config-with-some-changes 31 -EXT2_FS_XATTR 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 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" 58 else: 59 print("CONFIG_%s=%s" % (config 60 else: 61 if op=="-": 62 print("-%s %s" % (config, value)) 63 elif op=="+": 64 print("+%s %s" % (config, new_valu 65 else: 66 print(" %s %s -> %s" % (config, va 67 68 def show_diff(): 69 global merge_style 70 71 # parse command line args 72 if ("-h" in sys.argv or "--help" in sys.ar 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 argu 83 usage() 84 85 if argc == 1: 86 # if no filenames given, assume .confi 87 build_dir="" 88 if "KBUILD_OUTPUT" in os.environ: 89 build_dir = os.environ["KBUILD_OUT 90 configa_filename = build_dir + ".confi 91 configb_filename = build_dir + ".confi 92 else: 93 configa_filename = sys.argv[1] 94 configb_filename = sys.argv[2] 95 96 try: 97 a = readconfig(open(configa_filename)) 98 b = readconfig(open(configb_filename)) 99 except (IOError): 100 e = sys.exc_info()[1] 101 print("I/O error[%s]: %s\n" % (e.args[ 102 usage() 103 104 # print items in a but not b (accumulate, 105 old = [] 106 for config in a: 107 if config not in b: 108 old.append(config) 109 old.sort() 110 for config in old: 111 print_config("-", config, a[config], N 112 del a[config] 113 114 # print items that changed (accumulate, so 115 changed = [] 116 for config in a: 117 if a[config] != b[config]: 118 changed.append(config) 119 else: 120 del b[config] 121 changed.sort() 122 for config in changed: 123 print_config("->", config, a[config], 124 del b[config] 125 126 # now print items in b but not in a 127 # (items from b that were in a were remove 128 new = sorted(b.keys()) 129 for config in new: 130 print_config("+", config, None, b[conf 131 132 def main(): 133 try: 134 show_diff() 135 except BrokenPipeError: 136 # Python flushes standard streams on e 137 # to devnull to avoid another BrokenPi 138 devnull = os.open(os.devnull, os.O_WRO 139 os.dup2(devnull, sys.stdout.fileno()) 140 sys.exit(1) # Python exits with error 141 142 143 if __name__ == '__main__': 144 main()
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.