#!/usr/bin/env python import os import re import sys def common_config(configs): allconfigs = {} for config in configs: if not config.endswith("config"): continue allconfigs[config] = set() for line in open(config): m = re.match("#*\s*(BR2_\w+)[\s=](.*)$", line) if not m: continue option, value = m.groups() allconfigs[config].add((option, value)) common = allconfigs.values()[0].copy() for config in allconfigs.keys(): common &= allconfigs[config] for config in allconfigs.keys(): allconfigs[config] -= common print(common) def load_base(base_cfgs, cfg): base_cfgs[cfg] = set() for line in open(cfg): n = re.match('\s*#include\s*"(\w+\.\w+)"\s*$', line) if n: name = n.group(1) path = os.path.dirname(os.path.realpath(cfg)) if not path.endswith("rockchip"): path += "/rockchip" name = path + '/' + name load_base(base_cfgs, name) continue m = re.match("#*\s*(BR2_\w+)[\s=](.*)$", line) if m: option, value = m.groups() base_cfgs[cfg].add((option, value)) def split_config(base_cfgs, config, output): load_base(base_cfgs, config) base_cfgs.pop(config) with open(output, "w+") as f: for line in open(config): m = re.match("#*\s*(BR2_\w+)[\s=](.*)$", line) if not m: f.write(line) continue option, value = m.groups() temp = set() temp.add((option, value)) if option == "BR2_ROOTFS_OVERLAY" and value != "is not set": values = value.strip('"').split(' ') for cfg in base_cfgs.keys(): for item in base_cfgs[cfg]: opt, val = item if opt != option: # Skip not BR2_ROOTFS_OVERLAY continue vals = val.strip('"').split(' ') for v in vals: try: while True: values.remove(v) except ValueError as e: pass if len(values): val = '' for v in values: val = val + v + ' '; val = val.strip() f.write('BR2_ROOTFS_OVERLAY="' + val + '"\n') else: discard = False for cfg in base_cfgs.keys(): if temp.issubset(base_cfgs[cfg]): discard = True if not discard: f.write(m.group() + '\n') def merge_base(config): result = '' overlay = '' for line in open(config): n = re.match('#include\s*"(\w+\.\w+)"$', line) if n: path = os.path.dirname(os.path.realpath(config)) if not path.endswith("rockchip"): path += "/rockchip" name = path + '/' + n.group(1) res, ovl = merge_base(name) result += res overlay = (overlay + " " + ovl).strip() else: # W/O quotation mark(") m = re.match('BR2_ROOTFS_OVERLAY="(.*)"$', line) if m: overlay = (overlay + " " + m.group(1)).strip() else: result += line return result, overlay def merge_cfgs(config, output): with open(output, "w+") as f: result, overlay = merge_base(config) for line in open(config): # override ROOTS_OVERLAY m = re.match('BR2_ROOTFS_OVERLAY:="(.*)"$', line) if m: overlay = m.group(1) f.write(result) f.write('BR2_ROOTFS_OVERLAY="' + overlay + '"\n') def print_usage(): print ("Usage:") print (" Split defconfig: " + sys.argv[0] + " -s ") print (" Merge defconfig: " + sys.argv[0] + " -m ") if __name__ == '__main__': #common_config(sys.argv) if len(sys.argv) != 4: print_usage() sys.exit(-1) if sys.argv[1] == '-s': base_cfgs = {} split_config(base_cfgs, sys.argv[2], sys.argv[3]) elif sys.argv[1] == '-m': merge_cfgs(sys.argv[2], sys.argv[3]) else: print_usage()