xref: /aosp_15_r20/external/cronet/build/config/siso/android.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 Android builds."""
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Workerload("@builtin//encoding.star", "json")
8*6777b538SAndroid Build Coastguard Workerload("@builtin//lib/gn.star", "gn")
9*6777b538SAndroid Build Coastguard Workerload("@builtin//struct.star", "module")
10*6777b538SAndroid Build Coastguard Workerload("./config.star", "config")
11*6777b538SAndroid Build Coastguard Worker
12*6777b538SAndroid Build Coastguard Workerdef __enabled(ctx):
13*6777b538SAndroid Build Coastguard Worker    if "args.gn" in ctx.metadata:
14*6777b538SAndroid Build Coastguard Worker        gn_args = gn.args(ctx)
15*6777b538SAndroid Build Coastguard Worker        if gn_args.get("target_os") == '"android"':
16*6777b538SAndroid Build Coastguard Worker            return True
17*6777b538SAndroid Build Coastguard Worker    return False
18*6777b538SAndroid Build Coastguard Worker
19*6777b538SAndroid Build Coastguard Workerdef __filegroups(ctx):
20*6777b538SAndroid Build Coastguard Worker    return {}
21*6777b538SAndroid Build Coastguard Worker
22*6777b538SAndroid Build Coastguard Workerdef __step_config(ctx, step_config):
23*6777b538SAndroid Build Coastguard Worker    remote_run = True  # Turn this to False when you do file access trace.
24*6777b538SAndroid Build Coastguard Worker    step_config["rules"].extend([
25*6777b538SAndroid Build Coastguard Worker        # See also https://chromium.googlesource.com/chromium/src/build/+/HEAD/android/docs/java_toolchain.md
26*6777b538SAndroid Build Coastguard Worker        {
27*6777b538SAndroid Build Coastguard Worker            "name": "android/write_build_config",
28*6777b538SAndroid Build Coastguard Worker            "command_prefix": "python3 ../../build/android/gyp/write_build_config.py",
29*6777b538SAndroid Build Coastguard Worker            "handler": "android_write_build_config",
30*6777b538SAndroid Build Coastguard Worker            "remote": remote_run,
31*6777b538SAndroid Build Coastguard Worker            "canonicalize_dir": True,
32*6777b538SAndroid Build Coastguard Worker            "timeout": "2m",
33*6777b538SAndroid Build Coastguard Worker        },
34*6777b538SAndroid Build Coastguard Worker        {
35*6777b538SAndroid Build Coastguard Worker            "name": "android/ijar",
36*6777b538SAndroid Build Coastguard Worker            "command_prefix": "python3 ../../build/android/gyp/ijar.py",
37*6777b538SAndroid Build Coastguard Worker            "remote": remote_run,
38*6777b538SAndroid Build Coastguard Worker            "canonicalize_dir": True,
39*6777b538SAndroid Build Coastguard Worker            "timeout": "2m",
40*6777b538SAndroid Build Coastguard Worker        },
41*6777b538SAndroid Build Coastguard Worker        {
42*6777b538SAndroid Build Coastguard Worker            "name": "android/turbine",
43*6777b538SAndroid Build Coastguard Worker            "command_prefix": "python3 ../../build/android/gyp/turbine.py",
44*6777b538SAndroid Build Coastguard Worker            "handler": "android_turbine",
45*6777b538SAndroid Build Coastguard Worker            "remote": remote_run,
46*6777b538SAndroid Build Coastguard Worker            "platform_ref": "large",
47*6777b538SAndroid Build Coastguard Worker            "canonicalize_dir": True,
48*6777b538SAndroid Build Coastguard Worker            "timeout": "2m",
49*6777b538SAndroid Build Coastguard Worker        },
50*6777b538SAndroid Build Coastguard Worker        {
51*6777b538SAndroid Build Coastguard Worker            "name": "android/compile_resources",
52*6777b538SAndroid Build Coastguard Worker            "command_prefix": "python3 ../../build/android/gyp/compile_resources.py",
53*6777b538SAndroid Build Coastguard Worker            "handler": "android_compile_resources",
54*6777b538SAndroid Build Coastguard Worker            "exclude_input_patterns": [
55*6777b538SAndroid Build Coastguard Worker                "*.h",
56*6777b538SAndroid Build Coastguard Worker                "*.o",
57*6777b538SAndroid Build Coastguard Worker                "*.cc",
58*6777b538SAndroid Build Coastguard Worker                "*.a",
59*6777b538SAndroid Build Coastguard Worker                "*.info",
60*6777b538SAndroid Build Coastguard Worker                "*.pak",
61*6777b538SAndroid Build Coastguard Worker                "*.inc",
62*6777b538SAndroid Build Coastguard Worker            ],
63*6777b538SAndroid Build Coastguard Worker            "remote": remote_run,
64*6777b538SAndroid Build Coastguard Worker            "canonicalize_dir": True,
65*6777b538SAndroid Build Coastguard Worker            "timeout": "5m",
66*6777b538SAndroid Build Coastguard Worker        },
67*6777b538SAndroid Build Coastguard Worker        {
68*6777b538SAndroid Build Coastguard Worker            "name": "android/compile_java",
69*6777b538SAndroid Build Coastguard Worker            "command_prefix": "python3 ../../build/android/gyp/compile_java.py",
70*6777b538SAndroid Build Coastguard Worker            "handler": "android_compile_java",
71*6777b538SAndroid Build Coastguard Worker            # Don't include files under --generated-dir.
72*6777b538SAndroid Build Coastguard Worker            # This is probably optimization for local incrmental builds.
73*6777b538SAndroid Build Coastguard Worker            # However, this is harmful for remote build cache hits.
74*6777b538SAndroid Build Coastguard Worker            "ignore_extra_input_pattern": ".*srcjars.*\\.java",
75*6777b538SAndroid Build Coastguard Worker            "ignore_extra_output_pattern": ".*srcjars.*\\.java",
76*6777b538SAndroid Build Coastguard Worker            "remote": remote_run,
77*6777b538SAndroid Build Coastguard Worker            "platform_ref": "large",
78*6777b538SAndroid Build Coastguard Worker            "canonicalize_dir": True,
79*6777b538SAndroid Build Coastguard Worker            "timeout": "2m",
80*6777b538SAndroid Build Coastguard Worker        },
81*6777b538SAndroid Build Coastguard Worker        {
82*6777b538SAndroid Build Coastguard Worker            "name": "android/dex",
83*6777b538SAndroid Build Coastguard Worker            "command_prefix": "python3 ../../build/android/gyp/dex.py",
84*6777b538SAndroid Build Coastguard Worker            "handler": "android_dex",
85*6777b538SAndroid Build Coastguard Worker            # TODO(crbug.com/1452038): include only required jar, dex files in GN config.
86*6777b538SAndroid Build Coastguard Worker            "indirect_inputs": {
87*6777b538SAndroid Build Coastguard Worker                "includes": ["*.dex", "*.ijar.jar", "*.turbine.jar"],
88*6777b538SAndroid Build Coastguard Worker            },
89*6777b538SAndroid Build Coastguard Worker            # *.dex files are intermediate files used in incremental builds.
90*6777b538SAndroid Build Coastguard Worker            # Fo remote actions, let's ignore them, assuming remote cache hits compensate.
91*6777b538SAndroid Build Coastguard Worker            "ignore_extra_input_pattern": ".*\\.dex",
92*6777b538SAndroid Build Coastguard Worker            "ignore_extra_output_pattern": ".*\\.dex",
93*6777b538SAndroid Build Coastguard Worker            "remote": remote_run,
94*6777b538SAndroid Build Coastguard Worker            "platform_ref": "large",
95*6777b538SAndroid Build Coastguard Worker            "canonicalize_dir": True,
96*6777b538SAndroid Build Coastguard Worker            "timeout": "2m",
97*6777b538SAndroid Build Coastguard Worker        },
98*6777b538SAndroid Build Coastguard Worker        {
99*6777b538SAndroid Build Coastguard Worker            "name": "android/filter_zip",
100*6777b538SAndroid Build Coastguard Worker            "command_prefix": "python3 ../../build/android/gyp/filter_zip.py",
101*6777b538SAndroid Build Coastguard Worker            "remote": remote_run,
102*6777b538SAndroid Build Coastguard Worker            "canonicalize_dir": True,
103*6777b538SAndroid Build Coastguard Worker            "timeout": "2m",
104*6777b538SAndroid Build Coastguard Worker        },
105*6777b538SAndroid Build Coastguard Worker    ])
106*6777b538SAndroid Build Coastguard Worker    return step_config
107*6777b538SAndroid Build Coastguard Worker
108*6777b538SAndroid Build Coastguard Workerdef __filearg(ctx, arg):
109*6777b538SAndroid Build Coastguard Worker    fn = ""
110*6777b538SAndroid Build Coastguard Worker    if arg.startswith("@FileArg("):
111*6777b538SAndroid Build Coastguard Worker        f = arg.removeprefix("@FileArg(").removesuffix(")").split(":")
112*6777b538SAndroid Build Coastguard Worker        fn = f[0].removesuffix("[]")  # [] suffix controls expand list?
113*6777b538SAndroid Build Coastguard Worker        v = json.decode(str(ctx.fs.read(ctx.fs.canonpath(fn))))
114*6777b538SAndroid Build Coastguard Worker        for k in f[1:]:
115*6777b538SAndroid Build Coastguard Worker            v = v[k]
116*6777b538SAndroid Build Coastguard Worker        arg = v
117*6777b538SAndroid Build Coastguard Worker    if type(arg) == "string":
118*6777b538SAndroid Build Coastguard Worker        if arg.startswith("["):
119*6777b538SAndroid Build Coastguard Worker            return fn, json.decode(arg)
120*6777b538SAndroid Build Coastguard Worker        return fn, [arg]
121*6777b538SAndroid Build Coastguard Worker    return fn, arg
122*6777b538SAndroid Build Coastguard Worker
123*6777b538SAndroid Build Coastguard Workerdef __android_compile_resources_handler(ctx, cmd):
124*6777b538SAndroid Build Coastguard Worker    # Script:
125*6777b538SAndroid Build Coastguard Worker    #   https://crsrc.org/c/build/android/gyp/compile_resources.py
126*6777b538SAndroid Build Coastguard Worker    # GN Config:
127*6777b538SAndroid Build Coastguard Worker    #   https://crsrc.org/c/build/config/android/internal_rules.gni;l=2163;drc=1b15af251f8a255e44f2e3e3e7990e67e87dcc3b
128*6777b538SAndroid Build Coastguard Worker    #   https://crsrc.org/c/build/config/android/system_image.gni;l=58;drc=39debde76e509774287a655285d8556a9b8dc634
129*6777b538SAndroid Build Coastguard Worker    # Sample args:
130*6777b538SAndroid Build Coastguard Worker    #   --aapt2-path ../../third_party/android_build_tools/aapt2/aapt2
131*6777b538SAndroid Build Coastguard Worker    #   --android-manifest gen/chrome/android/trichrome_library_system_stub_apk__manifest.xml
132*6777b538SAndroid Build Coastguard Worker    #   --arsc-package-name=org.chromium.trichromelibrary
133*6777b538SAndroid Build Coastguard Worker    #   --arsc-path obj/chrome/android/trichrome_library_system_stub_apk.ap_
134*6777b538SAndroid Build Coastguard Worker    #   --debuggable
135*6777b538SAndroid Build Coastguard Worker    #   --dependencies-res-zip-overlays=@FileArg\(gen/chrome/android/webapk/shell_apk/maps_go_webapk.build_config.json:deps_info:dependency_zip_overlays\)
136*6777b538SAndroid Build Coastguard Worker    #   --dependencies-res-zips=@FileArg\(gen/chrome/android/webapk/shell_apk/maps_go_webapk.build_config.json:deps_info:dependency_zips\)
137*6777b538SAndroid Build Coastguard Worker    #   --depfile gen/chrome/android/webapk/shell_apk/maps_go_webapk__compile_resources.d
138*6777b538SAndroid Build Coastguard Worker    #   --emit-ids-out=gen/chrome/android/webapk/shell_apk/maps_go_webapk__compile_resources.resource_ids
139*6777b538SAndroid Build Coastguard Worker    #   --extra-res-packages=@FileArg\(gen/chrome/android/webapk/shell_apk/maps_go_webapk.build_config.json:deps_info:extra_package_names\)
140*6777b538SAndroid Build Coastguard Worker    #   --include-resources(=)../../third_party/android_sdk/public/platforms/android-34/android.jar
141*6777b538SAndroid Build Coastguard Worker    #   --info-path obj/chrome/android/webapk/shell_apk/maps_go_webapk.ap_.info
142*6777b538SAndroid Build Coastguard Worker    #   --min-sdk-version=24
143*6777b538SAndroid Build Coastguard Worker    #   --proguard-file obj/chrome/android/webapk/shell_apk/maps_go_webapk/maps_go_webapk.resources.proguard.txt
144*6777b538SAndroid Build Coastguard Worker    #   --r-text-out gen/chrome/android/webapk/shell_apk/maps_go_webapk__compile_resources_R.txt
145*6777b538SAndroid Build Coastguard Worker    #   --rename-manifest-package=org.chromium.trichromelibrary
146*6777b538SAndroid Build Coastguard Worker    #   --srcjar-out gen/chrome/android/webapk/shell_apk/maps_go_webapk__compile_resources.srcjar
147*6777b538SAndroid Build Coastguard Worker    #   --target-sdk-version=33
148*6777b538SAndroid Build Coastguard Worker    #   --version-code 1
149*6777b538SAndroid Build Coastguard Worker    #   --version-name Developer\ Build
150*6777b538SAndroid Build Coastguard Worker    #   --webp-cache-dir=obj/android-webp-cache
151*6777b538SAndroid Build Coastguard Worker    inputs = []
152*6777b538SAndroid Build Coastguard Worker    for i, arg in enumerate(cmd.args):
153*6777b538SAndroid Build Coastguard Worker        for k in ["--dependencies-res-zips=", "--dependencies-res-zip-overlays=", "--extra-res-packages="]:
154*6777b538SAndroid Build Coastguard Worker            if arg.startswith(k):
155*6777b538SAndroid Build Coastguard Worker                arg = arg.removeprefix(k)
156*6777b538SAndroid Build Coastguard Worker                fn, v = __filearg(ctx, arg)
157*6777b538SAndroid Build Coastguard Worker                if fn:
158*6777b538SAndroid Build Coastguard Worker                    inputs.append(ctx.fs.canonpath(fn))
159*6777b538SAndroid Build Coastguard Worker                for f in v:
160*6777b538SAndroid Build Coastguard Worker                    f = ctx.fs.canonpath(f)
161*6777b538SAndroid Build Coastguard Worker                    inputs.append(f)
162*6777b538SAndroid Build Coastguard Worker                    if k == "--dependencies-res-zips=" and ctx.fs.exists(f + ".info"):
163*6777b538SAndroid Build Coastguard Worker                        inputs.append(f + ".info")
164*6777b538SAndroid Build Coastguard Worker
165*6777b538SAndroid Build Coastguard Worker    ctx.actions.fix(
166*6777b538SAndroid Build Coastguard Worker        inputs = cmd.inputs + inputs,
167*6777b538SAndroid Build Coastguard Worker    )
168*6777b538SAndroid Build Coastguard Worker
169*6777b538SAndroid Build Coastguard Workerdef __android_compile_java_handler(ctx, cmd):
170*6777b538SAndroid Build Coastguard Worker    # Script:
171*6777b538SAndroid Build Coastguard Worker    #   https://crsrc.org/c/build/android/gyp/compile_java.py
172*6777b538SAndroid Build Coastguard Worker    # GN Config:
173*6777b538SAndroid Build Coastguard Worker    #   https://crsrc.org/c/build/config/android/internal_rules.gni;l=2995;drc=775b3a9ebccd468c79592dad43ef46632d3a411f
174*6777b538SAndroid Build Coastguard Worker    # Sample args:
175*6777b538SAndroid Build Coastguard Worker    #   --depfile=gen/chrome/android/chrome_test_java__compile_java.d
176*6777b538SAndroid Build Coastguard Worker    #   --generated-dir=gen/chrome/android/chrome_test_java/generated_java
177*6777b538SAndroid Build Coastguard Worker    #   --jar-path=obj/chrome/android/chrome_test_java.javac.jar
178*6777b538SAndroid Build Coastguard Worker    #   --java-srcjars=\[\"gen/chrome/browser/tos_dialog_behavior_generated_enum.srcjar\",\ \"gen/chrome/android/chrome_test_java__assetres.srcjar\",\ \"gen/chrome/android/chrome_test_java.generated.srcjar\"\]
179*6777b538SAndroid Build Coastguard Worker    #   --target-name //chrome/android:chrome_test_java__compile_java
180*6777b538SAndroid Build Coastguard Worker    #   --classpath=@FileArg\(gen/chrome/android/chrome_test_java.build_config.json:android:sdk_interface_jars\)
181*6777b538SAndroid Build Coastguard Worker    #   --header-jar obj/chrome/android/chrome_test_java.turbine.jar
182*6777b538SAndroid Build Coastguard Worker    #   --classpath=\[\"obj/chrome/android/chrome_test_java.turbine.jar\"\]
183*6777b538SAndroid Build Coastguard Worker    #   --classpath=@FileArg\(gen/chrome/android/chrome_test_java.build_config.json:deps_info:javac_full_interface_classpath\)
184*6777b538SAndroid Build Coastguard Worker    #   --kotlin-jar-path=obj/chrome/browser/tabmodel/internal/java.kotlinc.jar
185*6777b538SAndroid Build Coastguard Worker    #   --chromium-code=1
186*6777b538SAndroid Build Coastguard Worker    #   --warnings-as-errors
187*6777b538SAndroid Build Coastguard Worker    #   --jar-info-exclude-globs=\[\"\*/R.class\",\ \"\*/R\\\$\*.class\",\ \"\*/Manifest.class\",\ \"\*/Manifest\\\$\*.class\",\ \"\*/\*GEN_JNI.class\"\]
188*6777b538SAndroid Build Coastguard Worker    #   --enable-errorprone
189*6777b538SAndroid Build Coastguard Worker    #   @gen/chrome/android/chrome_test_java.sources
190*6777b538SAndroid Build Coastguard Worker
191*6777b538SAndroid Build Coastguard Worker    out = cmd.outputs[0]
192*6777b538SAndroid Build Coastguard Worker    outputs = [
193*6777b538SAndroid Build Coastguard Worker        out + ".md5.stamp",
194*6777b538SAndroid Build Coastguard Worker    ]
195*6777b538SAndroid Build Coastguard Worker
196*6777b538SAndroid Build Coastguard Worker    inputs = []
197*6777b538SAndroid Build Coastguard Worker    for i, arg in enumerate(cmd.args):
198*6777b538SAndroid Build Coastguard Worker        # read .sources file.
199*6777b538SAndroid Build Coastguard Worker        if arg.startswith("@"):
200*6777b538SAndroid Build Coastguard Worker            sources = str(ctx.fs.read(ctx.fs.canonpath(arg.removeprefix("@")))).splitlines()
201*6777b538SAndroid Build Coastguard Worker            for source in sources:
202*6777b538SAndroid Build Coastguard Worker                inputs.append(ctx.fs.canonpath(source))
203*6777b538SAndroid Build Coastguard Worker        for k in ["--classpath=", "--bootclasspath=", "--processorpath="]:
204*6777b538SAndroid Build Coastguard Worker            if arg.startswith(k):
205*6777b538SAndroid Build Coastguard Worker                arg = arg.removeprefix(k)
206*6777b538SAndroid Build Coastguard Worker                fn, v = __filearg(ctx, arg)
207*6777b538SAndroid Build Coastguard Worker                if fn:
208*6777b538SAndroid Build Coastguard Worker                    inputs.append(ctx.fs.canonpath(fn))
209*6777b538SAndroid Build Coastguard Worker                for f in v:
210*6777b538SAndroid Build Coastguard Worker                    f, _, _ = f.partition(":")
211*6777b538SAndroid Build Coastguard Worker                    inputs.append(ctx.fs.canonpath(f))
212*6777b538SAndroid Build Coastguard Worker
213*6777b538SAndroid Build Coastguard Worker    ctx.actions.fix(
214*6777b538SAndroid Build Coastguard Worker        inputs = cmd.inputs + inputs,
215*6777b538SAndroid Build Coastguard Worker        outputs = cmd.outputs + outputs,
216*6777b538SAndroid Build Coastguard Worker    )
217*6777b538SAndroid Build Coastguard Worker
218*6777b538SAndroid Build Coastguard Workerdef __android_dex_handler(ctx, cmd):
219*6777b538SAndroid Build Coastguard Worker    out = cmd.outputs[0]
220*6777b538SAndroid Build Coastguard Worker    inputs = [
221*6777b538SAndroid Build Coastguard Worker        out.replace("obj/", "gen/").replace(".dex.jar", ".build_config.json"),
222*6777b538SAndroid Build Coastguard Worker    ]
223*6777b538SAndroid Build Coastguard Worker
224*6777b538SAndroid Build Coastguard Worker    # Add __dex.desugardeps to the outputs.
225*6777b538SAndroid Build Coastguard Worker    outputs = [
226*6777b538SAndroid Build Coastguard Worker        out + ".md5.stamp",
227*6777b538SAndroid Build Coastguard Worker    ]
228*6777b538SAndroid Build Coastguard Worker    for i, arg in enumerate(cmd.args):
229*6777b538SAndroid Build Coastguard Worker        if arg == "--desugar-dependencies":
230*6777b538SAndroid Build Coastguard Worker            outputs.append(ctx.fs.canonpath(cmd.args[i + 1]))
231*6777b538SAndroid Build Coastguard Worker        for k in ["--class-inputs=", "--bootclasspath=", "--classpath=", "--class-inputs-filearg=", "--dex-inputs-filearg="]:
232*6777b538SAndroid Build Coastguard Worker            if arg.startswith(k):
233*6777b538SAndroid Build Coastguard Worker                arg = arg.removeprefix(k)
234*6777b538SAndroid Build Coastguard Worker                fn, v = __filearg(ctx, arg)
235*6777b538SAndroid Build Coastguard Worker                if fn:
236*6777b538SAndroid Build Coastguard Worker                    inputs.append(ctx.fs.canonpath(fn))
237*6777b538SAndroid Build Coastguard Worker                for f in v:
238*6777b538SAndroid Build Coastguard Worker                    f, _, _ = f.partition(":")
239*6777b538SAndroid Build Coastguard Worker                    f = ctx.fs.canonpath(f)
240*6777b538SAndroid Build Coastguard Worker                    inputs.append(f)
241*6777b538SAndroid Build Coastguard Worker
242*6777b538SAndroid Build Coastguard Worker    # TODO: dex.py takes --incremental-dir to reuse the .dex produced in a previous build.
243*6777b538SAndroid Build Coastguard Worker    # Should remote dex action also take this?
244*6777b538SAndroid Build Coastguard Worker    ctx.actions.fix(
245*6777b538SAndroid Build Coastguard Worker        inputs = cmd.inputs + inputs,
246*6777b538SAndroid Build Coastguard Worker        outputs = cmd.outputs + outputs,
247*6777b538SAndroid Build Coastguard Worker    )
248*6777b538SAndroid Build Coastguard Worker
249*6777b538SAndroid Build Coastguard Workerdef __android_turbine_handler(ctx, cmd):
250*6777b538SAndroid Build Coastguard Worker    inputs = []
251*6777b538SAndroid Build Coastguard Worker    for i, arg in enumerate(cmd.args):
252*6777b538SAndroid Build Coastguard Worker        for k in ["--classpath=", "--processorpath="]:
253*6777b538SAndroid Build Coastguard Worker            if arg.startswith(k):
254*6777b538SAndroid Build Coastguard Worker                arg = arg.removeprefix(k)
255*6777b538SAndroid Build Coastguard Worker                fn, v = __filearg(ctx, arg)
256*6777b538SAndroid Build Coastguard Worker                if fn:
257*6777b538SAndroid Build Coastguard Worker                    inputs.append(ctx.fs.canonpath(fn))
258*6777b538SAndroid Build Coastguard Worker                for f in v:
259*6777b538SAndroid Build Coastguard Worker                    f, _, _ = f.partition(":")
260*6777b538SAndroid Build Coastguard Worker                    inputs.append(ctx.fs.canonpath(f))
261*6777b538SAndroid Build Coastguard Worker
262*6777b538SAndroid Build Coastguard Worker    ctx.actions.fix(
263*6777b538SAndroid Build Coastguard Worker        inputs = cmd.inputs + inputs,
264*6777b538SAndroid Build Coastguard Worker    )
265*6777b538SAndroid Build Coastguard Worker
266*6777b538SAndroid Build Coastguard Workerdef __deps_configs(ctx, f, seen, inputs):
267*6777b538SAndroid Build Coastguard Worker    if f in seen:
268*6777b538SAndroid Build Coastguard Worker        return
269*6777b538SAndroid Build Coastguard Worker    seen[f] = True
270*6777b538SAndroid Build Coastguard Worker    inputs.append(f)
271*6777b538SAndroid Build Coastguard Worker    v = json.decode(str(ctx.fs.read(f)))
272*6777b538SAndroid Build Coastguard Worker    for f in v["deps_info"]["deps_configs"]:
273*6777b538SAndroid Build Coastguard Worker        f = ctx.fs.canonpath(f)
274*6777b538SAndroid Build Coastguard Worker        __deps_configs(ctx, f, seen, inputs)
275*6777b538SAndroid Build Coastguard Worker    if "public_deps_configs" in v["deps_info"]:
276*6777b538SAndroid Build Coastguard Worker        for f in v["deps_info"]["public_deps_configs"]:
277*6777b538SAndroid Build Coastguard Worker            f = ctx.fs.canonpath(f)
278*6777b538SAndroid Build Coastguard Worker            __deps_configs(ctx, f, seen, inputs)
279*6777b538SAndroid Build Coastguard Worker
280*6777b538SAndroid Build Coastguard Workerdef __android_write_build_config_handler(ctx, cmd):
281*6777b538SAndroid Build Coastguard Worker    # Script:
282*6777b538SAndroid Build Coastguard Worker    #   https://crsrc.org/c/build/android/gyp/write_build_config.py
283*6777b538SAndroid Build Coastguard Worker    # GN Config:
284*6777b538SAndroid Build Coastguard Worker    #   https://crsrc.org/c/build/config/android/internal_rules.gni;l=122;drc=99e4f79301e108ea3d27ec84320f430490382587
285*6777b538SAndroid Build Coastguard Worker    # Sample args:
286*6777b538SAndroid Build Coastguard Worker    #   --type=java_library
287*6777b538SAndroid Build Coastguard Worker    #   --depfile gen/third_party/android_deps/org_jetbrains_kotlinx_kotlinx_metadata_jvm_java__build_config_crbug_908819.d
288*6777b538SAndroid Build Coastguard Worker    #   --deps-configs=\[\"gen/third_party/kotlin_stdlib/kotlin_stdlib_java.build_config.json\"\]
289*6777b538SAndroid Build Coastguard Worker    #   --public-deps-configs=\[\]
290*6777b538SAndroid Build Coastguard Worker    #   --build-config gen/third_party/android_deps/org_jetbrains_kotlinx_kotlinx_metadata_jvm_java.build_config.json
291*6777b538SAndroid Build Coastguard Worker    #   --gn-target //third_party/android_deps:org_jetbrains_kotlinx_kotlinx_metadata_jvm_java
292*6777b538SAndroid Build Coastguard Worker    #   --non-chromium-code
293*6777b538SAndroid Build Coastguard Worker    #   --host-jar-path lib.java/third_party/android_deps/org_jetbrains_kotlinx_kotlinx_metadata_jvm.jar
294*6777b538SAndroid Build Coastguard Worker    #   --unprocessed-jar-path ../../third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_metadata_jvm/kotlinx-metadata-jvm-0.1.0.jar
295*6777b538SAndroid Build Coastguard Worker    #   --interface-jar-path obj/third_party/android_deps/org_jetbrains_kotlinx_kotlinx_metadata_jvm.ijar.jar
296*6777b538SAndroid Build Coastguard Worker    #   --is-prebuilt
297*6777b538SAndroid Build Coastguard Worker    #   --bundled-srcjars=\[\]
298*6777b538SAndroid Build Coastguard Worker    inputs = []
299*6777b538SAndroid Build Coastguard Worker    seen = {}
300*6777b538SAndroid Build Coastguard Worker    for i, arg in enumerate(cmd.args):
301*6777b538SAndroid Build Coastguard Worker        if arg in ["--shared-libraries-runtime-deps", "--secondary-abi-shared-libraries-runtime-deps"]:
302*6777b538SAndroid Build Coastguard Worker            inputs.append(ctx.fs.canonpath(cmd.args[i + 1]))
303*6777b538SAndroid Build Coastguard Worker            continue
304*6777b538SAndroid Build Coastguard Worker        if arg == "--tested-apk-config":
305*6777b538SAndroid Build Coastguard Worker            f = ctx.fs.canonpath(cmd.args[i + 1])
306*6777b538SAndroid Build Coastguard Worker            __deps_configs(ctx, f, seen, inputs)
307*6777b538SAndroid Build Coastguard Worker            continue
308*6777b538SAndroid Build Coastguard Worker        for k in ["--deps-configs=", "--public-deps-configs=", "--annotation-processor-configs="]:
309*6777b538SAndroid Build Coastguard Worker            if arg.startswith(k):
310*6777b538SAndroid Build Coastguard Worker                arg = arg.removeprefix(k)
311*6777b538SAndroid Build Coastguard Worker                v = json.decode(arg)
312*6777b538SAndroid Build Coastguard Worker                for f in v:
313*6777b538SAndroid Build Coastguard Worker                    f = ctx.fs.canonpath(f)
314*6777b538SAndroid Build Coastguard Worker                    __deps_configs(ctx, f, seen, inputs)
315*6777b538SAndroid Build Coastguard Worker
316*6777b538SAndroid Build Coastguard Worker    ctx.actions.fix(inputs = cmd.inputs + inputs)
317*6777b538SAndroid Build Coastguard Worker
318*6777b538SAndroid Build Coastguard Worker__handlers = {
319*6777b538SAndroid Build Coastguard Worker    "android_compile_resources": __android_compile_resources_handler,
320*6777b538SAndroid Build Coastguard Worker    "android_compile_java": __android_compile_java_handler,
321*6777b538SAndroid Build Coastguard Worker    "android_dex": __android_dex_handler,
322*6777b538SAndroid Build Coastguard Worker    "android_turbine": __android_turbine_handler,
323*6777b538SAndroid Build Coastguard Worker    "android_write_build_config": __android_write_build_config_handler,
324*6777b538SAndroid Build Coastguard Worker}
325*6777b538SAndroid Build Coastguard Worker
326*6777b538SAndroid Build Coastguard Workerandroid = module(
327*6777b538SAndroid Build Coastguard Worker    "android",
328*6777b538SAndroid Build Coastguard Worker    enabled = __enabled,
329*6777b538SAndroid Build Coastguard Worker    step_config = __step_config,
330*6777b538SAndroid Build Coastguard Worker    filegroups = __filegroups,
331*6777b538SAndroid Build Coastguard Worker    handlers = __handlers,
332*6777b538SAndroid Build Coastguard Worker)
333