xref: /aosp_15_r20/external/cronet/build/config/siso/protoc_wrapper.star (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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