diff --git a/Makefile b/Makefile index bcbfdad4..6356f077 100644 --- a/Makefile +++ b/Makefile @@ -52,3 +52,25 @@ configure-gba: .PHONY: configure-gba-debug configure-gba-debug: ${BC_CMD_SETUP_BUILD} --toolchain=deps/gbabuildcore/cmake/modules/GBA.cmake --target=gba --current_build=0 --build_type=debug --build_root=${BC_VAR_BUILD_PATH} + +.PHONY: loc +loc: + ${BC_PY3} util/scripts/loc.py \ + --search-dirs \ + src \ + deps/ox/src \ + deps/buildcore \ + deps/gbabuildcore \ + deps/glutils \ + deps/teagba \ + --include-exts \ + .cpp \ + .hpp \ + .py \ + .s \ + .cmake \ + --exclude-paths \ + deps/teagba/src/gba_crt0.s \ + src/olympic/studio/applib/src/font.cpp \ + src/olympic/studio/applib/src/font.hpp \ + src/nostalgia/studio/icondata.cpp diff --git a/util/scripts/loc.py b/util/scripts/loc.py new file mode 100755 index 00000000..c887801b --- /dev/null +++ b/util/scripts/loc.py @@ -0,0 +1,59 @@ +#! /usr/bin/env python3 + +from pathlib import Path +import argparse + +def parse_args(): + parser = argparse.ArgumentParser(description="Count and sort lines of code in selected files.") + parser.add_argument( + "--search-dirs", nargs="+", required=True, + help="List of directories to search (recursively)." + ) + parser.add_argument( + "--include-exts", nargs="+", required=True, + help="List of file extensions to include (e.g. .cpp .hpp .py)" + ) + parser.add_argument( + "--exclude-paths", nargs="*", default=[], + help="Full file paths to exclude from counting." + ) + return parser.parse_args() + + +def main(): + args = parse_args() + include_exts = tuple(args.include_exts) + exclude_paths = {Path(p).resolve() for p in args.exclude_paths} + files = [] + for base in args.search_dirs: + path = Path(base) + if path.is_dir(): + for file in path.rglob("*"): + try: + resolved_file = file.resolve() + if ( + file.is_file() + and file.name.endswith(include_exts) + and resolved_file not in exclude_paths + ): + files.append(str(resolved_file)) + except FileNotFoundError: + continue + line_counts = [] + total_lines = 0 + for f in files: + try: + with open(f, "r", encoding="utf-8", errors="ignore") as file: + lines = sum(1 for _ in file) + line_counts.append((lines, f)) + total_lines += lines + except Exception as e: + print(f"Failed to read {f}: {e}") + line_counts.sort() + for count, filename in line_counts: + print(f"{count:>7} {filename}") + print(f"{total_lines:>7} total") + + +if __name__ == "__main__": + main()