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