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