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 "--cc-out-dir", 56 "--py-out-dir", 57 "--js-out-dir", 58 "--plugin-out-dir", 59 "--plugin", 60 "--plugin-options", 61 "--cc-options", 62 "--include", 63 "--descriptor-set-out", 64 "--descriptor-set-dependency-file", 65 "--depfile", # protoc_java 66 "--protoc", # protoc_java 67 "--proto-path", # protoc_java 68 "--srcjar", # protoc_java 69 ) 70 for i, arg in enumerate(protoc_wrapper_args): 71 if flag == "--proto-in-dir": 72 proto_in_dir = ctx.fs.canonpath(arg) 73 flag = "" 74 continue 75 elif flag == "--import-dir": 76 inc_dirs.append(ctx.fs.canonpath(arg)) 77 flag = "" 78 continue 79 elif flag == "--plugin": 80 inputs.append(ctx.fs.canonpath(arg)) 81 flag = "" 82 continue 83 elif flag == "--protoc": 84 inputs.append(ctx.fs.canonpath(arg)) 85 flag = "" 86 continue 87 elif flag == "--proto-path": 88 inc_dirs = [ctx.fs.canonpath(arg)] + inc_dirs 89 flag = "" 90 continue 91 elif flag != "": 92 flag = "" 93 continue 94 elif arg in flags: 95 flag = arg 96 continue 97 elif arg.startswith("--import-dir="): 98 inc_dirs.append(ctx.fs.canonpath(arg.removeprefix("--import-dir="))) 99 continue 100 elif arg.startswith("-"): 101 continue 102 protos.append(arg) 103 proto_paths = [proto_in_dir] + inc_dirs 104 protos = [path.join(proto_in_dir, name) for name in protos] 105 for proto in protos: 106 inputs.extend(__protoc_scandeps(ctx, proto, proto_paths = proto_paths)) 107 return inputs 108 109protoc_wrapper = module( 110 "protoc_wrapper", 111 scandeps = __scandeps, 112) 113