def defconfig_merge( kconf: kconfiglib.Kconfig, sources: T.List[pathlib.Path], fail_on_unknown: bool, ) -> GenerationResult: for path in sources: kconf.load_config(str(path.absolute()), replace=False) if kconf.missing_syms and fail_on_unknown: raise ValueError("Unknown symbols: {}".format(kconf.missing_syms)) stats = Stats( nb_symbols=len([ symbol for symbol in kconf.unique_defined_syms if symbol.user_value ]), files=sources, ) with tempfile.NamedTemporaryFile(mode='r') as f: kconf.write_min_config(f.name, header='') lines = f.read() return GenerationResult( stats=stats, output=lines, )
def defconfig_split( kconf: kconfiglib.Kconfig, fail_on_unknown: bool, categories: T.List[T.Text], destdir: pathlib.Path, source: T.TextIO, prefix: T.Text, ) -> Stats: with tempfile.TemporaryDirectory() as d: config_path = os.path.join(d, '.config') defconfig_path = os.path.join(d, 'defconfig') with open(config_path, 'w', encoding='utf-8') as f: for line in source: f.write(line) kconf.load_config(config_path) if fail_on_unknown and kconf.missing_syms: raise ValueError("Unknown symbols: {}".format(kconf.missing_syms)) kconf.write_min_config(defconfig_path) kconf.load_config(defconfig_path) symbols_by_category: T.Dict[T.Text, T.List[kconfiglib.Symbol]] = { cat: [] for cat in categories } symbols_by_category[''] = [] for symbol in kconf.unique_defined_syms: if symbol.user_value is not None: category = max(cat for cat in symbols_by_category if symbol.nodes[0].filename.startswith(cat)) symbols_by_category[category].append(symbol) stats = Stats( nb_symbols=sum( len(symbols) for symbols in symbols_by_category.values()), files=[], ) for category, symbols in sorted(symbols_by_category.items()): if category: path = destdir / '{}.{}'.format(prefix, category.replace('/', '_')) else: path = destdir / prefix stats.files.append(path) with path.open('w', encoding='utf-8') as output: for symbol in symbols: output.write(symbol.config_string) return stats