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