aboutsummaryrefslogtreecommitdiff
path: root/third_party/nanopb/generate_nanopb_proto.py
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/nanopb/generate_nanopb_proto.py')
-rw-r--r--third_party/nanopb/generate_nanopb_proto.py41
1 files changed, 37 insertions, 4 deletions
diff --git a/third_party/nanopb/generate_nanopb_proto.py b/third_party/nanopb/generate_nanopb_proto.py
index 2934d0635..fc83df024 100644
--- a/third_party/nanopb/generate_nanopb_proto.py
+++ b/third_party/nanopb/generate_nanopb_proto.py
@@ -27,14 +27,28 @@ that nanopb_pb2.py is guaranteed to exist before they need it.
import argparse
import importlib.util
from pathlib import Path
+import os
import sys
-def generate_nanopb_proto(root: Path) -> None:
- sys.path.append(str(root / 'generator'))
+def generate_nanopb_proto(
+ nanopb_root: Path, protoc_binary: Path, aggressive_regen: bool
+) -> None:
+ generated_nanopb_pb2 = nanopb_root / 'generator' / 'proto' / 'nanopb_pb2.py'
+
+ # If protoc was updated, ensure the file is regenerated.
+ if generated_nanopb_pb2.is_file():
+ if (
+ aggressive_regen
+ or protoc_binary.stat().st_mtime
+ > generated_nanopb_pb2.stat().st_mtime
+ ):
+ os.remove(generated_nanopb_pb2)
+
+ sys.path.append(str(nanopb_root / 'generator'))
spec = importlib.util.spec_from_file_location(
- 'proto', root / 'generator' / 'proto' / '__init__.py'
+ 'proto', nanopb_root / 'generator' / 'proto' / '__init__.py'
)
assert spec is not None
proto_module = importlib.util.module_from_spec(spec)
@@ -43,7 +57,26 @@ def generate_nanopb_proto(root: Path) -> None:
def _parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(description=__doc__)
- parser.add_argument('root', type=Path, help='Nanopb root')
+ parser.add_argument(
+ '--nanopb-root',
+ type=Path,
+ help='Nanopb root',
+ )
+ parser.add_argument(
+ '--protoc-binary',
+ type=Path,
+ help='Protoc binary path',
+ )
+ parser.add_argument(
+ '--aggressive-regen',
+ action="store_true",
+ default=False,
+ help=(
+ 'If true, always regenerates nanopb_pb2.py when this script is '
+ 'run. If this is false, the file is only regenerated when the '
+ 'protoc binary is updated'
+ ),
+ )
return parser.parse_args()