| #!/usr/bin/env python3 | |
| # Copyright 2022 The ChromiumOS Authors | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| """Compares generated D-Bus header files. | |
| This confirms that new dbus-binding generator outputs the same file | |
| (except for the header guard parts) as original dbus-binding generator. | |
| """ | |
| import argparse | |
| import difflib | |
| import pathlib | |
| import re | |
| import sys | |
| def get_parser(): | |
| """Returns an argument parser.""" | |
| parser = argparse.ArgumentParser(description=__doc__) | |
| parser.add_argument( | |
| "--out", | |
| required=True, | |
| type=pathlib.Path, | |
| help="file to output diff result", | |
| ) | |
| parser.add_argument( | |
| "--cpp", | |
| required=True, | |
| type=pathlib.Path, | |
| help="header file generated by generate-chromeos-dbus-bindings", | |
| ) | |
| parser.add_argument( | |
| "--go", | |
| required=True, | |
| type=pathlib.Path, | |
| help="header file generated by go-generate-chromeos-dbus-bindings", | |
| ) | |
| return parser | |
| def main(argv): | |
| parser = get_parser() | |
| opts = parser.parse_args(argv) | |
| # New dbus-binding generator outputs to a different directory than | |
| # original dbus-binding generator. So we need to erase the extra string | |
| # caused by this difference. | |
| dbus_tmp_headerguard_re = re.compile( | |
| r"^(#(?:ifndef|define|endif //) [_A-Z0-9]*)_DBUS_TMP" | |
| ) | |
| headers_by_cpp = [ | |
| dbus_tmp_headerguard_re.sub(r"\1", x) | |
| for x in opts.cpp.read_text(encoding="utf-8").splitlines() | |
| ] | |
| headers_by_go = opts.go.read_text(encoding="utf-8").splitlines() | |
| diff_result = list( | |
| difflib.unified_diff( | |
| headers_by_cpp, | |
| headers_by_go, | |
| fromfile=f"a/{opts.cpp.name}", | |
| tofile=f"b/{opts.go.name}", | |
| lineterm="", | |
| ) | |
| ) | |
| # Even if there is no diff result, write to a file. Because an action rule | |
| # in gn file requires at least one output file. | |
| opts.out.write_text("\n".join(diff_result), encoding="utf-8") | |
| if diff_result: | |
| # Just for convenience, also output to stderr on error so that the | |
| # build log includes the diff result. | |
| print("\n".join(diff_result), file=sys.stderr) | |
| return 1 if diff_result else 0 | |
| if __name__ == "__main__": | |
| sys.exit(main(sys.argv[1:])) |