#!/usr/bin/env python3 # build-aux/kicad-sym-cat - Merge several KiCad symbol libraries # # Copyright (C) 2025 Luke T. Shumaker # SPDX-License-Identifier: AGPL-3.0-or-later import os.path import sys common = os.path.abspath(os.path.dirname(__file__)) if common not in sys.path: sys.path.insert(0, common) import kicad_sexpr # pylint: disable=wrong-import-position def symbol_name(sym: kicad_sexpr.Expr) -> str: assert isinstance(sym, list) assert len(sym) > 1 assert sym[0] == kicad_sexpr.Symbol("symbol") assert isinstance(sym[1], str) return sym[1] def main(src_lib_filenames: list[str]) -> None: symbols: kicad_sexpr.List = [] for src_lib_filename in src_lib_filenames: with open(src_lib_filename, "r", encoding="utf-8") as fh: src_obj = kicad_sexpr.unmarshal(fh.read()) assert isinstance(src_obj, list) assert len(src_obj) > 1 assert src_obj[0] == kicad_sexpr.Symbol("kicad_symbol_lib") for item in src_obj: if ( isinstance(item, list) and len(item) > 1 and item[0] == kicad_sexpr.Symbol("symbol") ): symbols.append(item) symbols = sorted(symbols, key=symbol_name) combined_obj: kicad_sexpr.List = [ kicad_sexpr.Symbol("kicad_symbol_lib"), [kicad_sexpr.Symbol("version"), 20241209], [kicad_sexpr.Symbol("generator"), "kicad_symbol_editor"], [kicad_sexpr.Symbol("generator_version"), "9.0"], *symbols, ] print(kicad_sexpr.marshal(combined_obj)) if __name__ == "__main__": main(sys.argv[1:])