1# -*- bazel-starlark -*- 2# Copyright 2023 The Chromium Authors 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5"""Siso configuration for protoc_wrapper and protoc_java. 6 7scripts: 8- https://chromium.googlesource.com/chromium/src/+/refs/heads/main/tools/protoc_wrapper/protoc_wrapper.py 9- https://chromium.googlesource.com/chromium/src/+/refs/heads/main/build/protoc_java.py 10 11gn: 12- https://chromium.googlesource.com/chromium/src/+/refs/heads/main/third_party/protobuf/proto_library.gni 13- https://chromium.googlesource.com/chromium/src/+/refs/heads/main/build/config/android/rules.gni 14 15sample command line: 16 command = python3 ../../tools/protoc_wrapper/protoc_wrapper.py test.proto --protoc ./protoc --proto-in-dir ../../base/test --descriptor-set-out gen/base/test/test_proto.descriptor --descriptor-set-dependency-file gen/base/test/test_proto.descriptor.d 17 18 command = python3 ../../build/protoc_java.py --depfile gen/android_webview/proto/aw_variations_seed_proto_java__protoc_java.d --protoc ../../third_party/android_protoc/protoc --proto-path ../../android_webview/proto --srcjar gen/android_webview/proto/aw_variations_seed_proto_java__protoc_java.srcjar ../../android_webview/proto/aw_variations_seed.proto 19""" 20 21load("@builtin//struct.star", "module") 22load("@builtin//path.star", "path") 23 24def __protoc_scandeps(ctx, proto, proto_paths = []): 25 inputs = [proto] 26 for line in str(ctx.fs.read(proto)).split("\n"): 27 if line.startswith("import "): 28 line = line.removeprefix("import ").strip() 29 line = line.removeprefix("public ").strip() 30 line = line.removeprefix("\"") 31 i = line.find("\"") 32 name = line[:i] 33 for d in proto_paths: 34 fname = path.join(d, name) 35 if ctx.fs.exists(fname): 36 inputs.extend(__protoc_scandeps(ctx, fname, proto_paths)) 37 break 38 return inputs 39 40def __scandeps(ctx, args): 41 protoc_wrapper_args = [] 42 for i, arg in enumerate(args): 43 if path.base(arg) in ["protoc_wrapper.py", "protoc_java.py"]: 44 protoc_wrapper_args = args[i + 1:] 45 break 46 inputs = [] 47 protos = [] 48 proto_in_dir = ctx.fs.canonpath(".") 49 inc_dirs = [] 50 flag = "" 51 flags = ( 52 "--proto-in-dir", 53 "--import-dir", 54 "--protoc", 55 "--protoc-gen-js", 56 "--cc-out-dir", 57 "--py-out-dir", 58 "--js-out-dir", 59 "--plugin-out-dir", 60 "--plugin", 61 "--plugin-options", 62 "--cc-options", 63 "--include", 64 "--descriptor-set-out", 65 "--descriptor-set-dependency-file", 66 "--depfile", # protoc_java 67 "--protoc", # protoc_java 68 "--proto-path", # protoc_java 69 "--srcjar", # protoc_java 70 ) 71 for i, arg in enumerate(protoc_wrapper_args): 72 if flag == "--proto-in-dir": 73 proto_in_dir = ctx.fs.canonpath(arg) 74 flag = "" 75 continue 76 elif flag == "--import-dir": 77 inc_dirs.append(ctx.fs.canonpath(arg)) 78 flag = "" 79 continue 80 elif flag == "--plugin": 81 inputs.append(ctx.fs.canonpath(arg)) 82 flag = "" 83 continue 84 elif flag == "--protoc": 85 inputs.append(ctx.fs.canonpath(arg)) 86 flag = "" 87 continue 88 elif flag == "--protoc-gen-js": 89 inputs.append(ctx.fs.canonpath(arg)) 90 flag = "" 91 continue 92 elif flag == "--proto-path": 93 inc_dirs = [ctx.fs.canonpath(arg)] + inc_dirs 94 flag = "" 95 continue 96 elif flag != "": 97 flag = "" 98 continue 99 elif arg in flags: 100 flag = arg 101 continue 102 elif arg.startswith("--import-dir="): 103 inc_dirs.append(ctx.fs.canonpath(arg.removeprefix("--import-dir="))) 104 continue 105 elif arg.startswith("-"): 106 continue 107 protos.append(arg) 108 proto_paths = [proto_in_dir] + inc_dirs 109 protos = [path.join(proto_in_dir, name) for name in protos] 110 for proto in protos: 111 inputs.extend(__protoc_scandeps(ctx, proto, proto_paths = proto_paths)) 112 return inputs 113 114protoc_wrapper = module( 115 "protoc_wrapper", 116 scandeps = __scandeps, 117) 118