mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-22 15:38:11 +00:00
pb2py: smarter protobuf include handling
support PROTOC_INCLUDE env variable (fixes #158) support multiple `-I` arguments smarter detection of `protoc` presence and its include dirs
This commit is contained in:
parent
d522f211fd
commit
6575418de9
24
protob/pb2py
24
protob/pb2py
@ -33,14 +33,25 @@ FIELD_TYPES = {
|
|||||||
}
|
}
|
||||||
# fmt: on
|
# fmt: on
|
||||||
|
|
||||||
|
PROTOC = shutil.which("protoc")
|
||||||
|
if not PROTOC:
|
||||||
|
print("protoc command not found")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
def protoc(files, additional_include_dirs=()):
|
PROTOC_PREFIX = os.path.dirname(os.path.dirname(PROTOC))
|
||||||
|
PROTOC_INCLUDE = os.path.join(PROTOC_PREFIX, "include")
|
||||||
|
|
||||||
|
|
||||||
|
def protoc(files, additional_includes=()):
|
||||||
"""Compile code with protoc and return the data."""
|
"""Compile code with protoc and return the data."""
|
||||||
include_dirs = set(additional_include_dirs)
|
include_dirs = set()
|
||||||
|
include_dirs.add(PROTOC_INCLUDE)
|
||||||
|
include_dirs.update(additional_includes)
|
||||||
|
|
||||||
for file in files:
|
for file in files:
|
||||||
dirname = os.path.dirname(file) or "."
|
dirname = os.path.dirname(file) or "."
|
||||||
include_dirs.add(dirname)
|
include_dirs.add(dirname)
|
||||||
protoc_includes = ["-I" + dir for dir in include_dirs]
|
protoc_includes = ["-I" + dir for dir in include_dirs if dir]
|
||||||
|
|
||||||
# Note that we could avoid creating temp files if protoc let us write to stdout
|
# Note that we could avoid creating temp files if protoc let us write to stdout
|
||||||
# directly. this is currently only possible on Unix, by passing /dev/stdout as
|
# directly. this is currently only possible on Unix, by passing /dev/stdout as
|
||||||
@ -49,7 +60,7 @@ def protoc(files, additional_include_dirs=()):
|
|||||||
with tempfile.TemporaryDirectory() as tmpdir:
|
with tempfile.TemporaryDirectory() as tmpdir:
|
||||||
outfile = os.path.join(tmpdir, "DESCRIPTOR_SET")
|
outfile = os.path.join(tmpdir, "DESCRIPTOR_SET")
|
||||||
subprocess.check_call(
|
subprocess.check_call(
|
||||||
["protoc", "--descriptor_set_out={}".format(outfile)]
|
[PROTOC, "--descriptor_set_out={}".format(outfile)]
|
||||||
+ protoc_includes
|
+ protoc_includes
|
||||||
+ files
|
+ files
|
||||||
)
|
)
|
||||||
@ -312,11 +323,12 @@ if __name__ == "__main__":
|
|||||||
parser.add_argument("-P", "--protobuf-module", default="protobuf", help="Name of protobuf module")
|
parser.add_argument("-P", "--protobuf-module", default="protobuf", help="Name of protobuf module")
|
||||||
parser.add_argument("-l", "--no-init-py", action="store_true", help="Do not generate __init__.py with list of modules")
|
parser.add_argument("-l", "--no-init-py", action="store_true", help="Do not generate __init__.py with list of modules")
|
||||||
parser.add_argument("--message-type", default="MessageType", help="Name of enum with message IDs")
|
parser.add_argument("--message-type", default="MessageType", help="Name of enum with message IDs")
|
||||||
parser.add_argument("--protobuf-default-include", default="/usr/include", help="Location of protobuf's default .proto files.")
|
parser.add_argument("-I", "--protoc-include", action="append", help="protoc include path")
|
||||||
# fmt: on
|
# fmt: on
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
descriptor_proto = protoc(args.proto, (args.protobuf_default_include,))
|
protoc_includes = args.protoc_include or (os.environ.get("PROTOC_INCLUDE"),)
|
||||||
|
descriptor_proto = protoc(args.proto, protoc_includes)
|
||||||
descriptor = Descriptor(descriptor_proto, args.message_type, args.protobuf_module)
|
descriptor = Descriptor(descriptor_proto, args.message_type, args.protobuf_module)
|
||||||
|
|
||||||
with tempfile.TemporaryDirectory() as tmpdir:
|
with tempfile.TemporaryDirectory() as tmpdir:
|
||||||
|
Loading…
Reference in New Issue
Block a user