xref: /aosp_15_r20/build/bazel/rules/partitions/partition.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
1*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2022 The Android Open Source Project
2*7594170eSAndroid Build Coastguard Worker#
3*7594170eSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*7594170eSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*7594170eSAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*7594170eSAndroid Build Coastguard Worker#
7*7594170eSAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
8*7594170eSAndroid Build Coastguard Worker#
9*7594170eSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*7594170eSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*7594170eSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*7594170eSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*7594170eSAndroid Build Coastguard Worker# limitations under the License.
14*7594170eSAndroid Build Coastguard Worker
15*7594170eSAndroid Build Coastguard Worker"""This file defines the rule that builds android partitions."""
16*7594170eSAndroid Build Coastguard Worker
17*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
18*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules:build_fingerprint.bzl", "BuildFingerprintInfo")
19*7594170eSAndroid Build Coastguard Worker
20*7594170eSAndroid Build Coastguard Worker_IMAGE_TYPES = [
21*7594170eSAndroid Build Coastguard Worker    "system",
22*7594170eSAndroid Build Coastguard Worker    "system_other",
23*7594170eSAndroid Build Coastguard Worker    "userdata",
24*7594170eSAndroid Build Coastguard Worker    "cache",
25*7594170eSAndroid Build Coastguard Worker    "vendor",
26*7594170eSAndroid Build Coastguard Worker    "product",
27*7594170eSAndroid Build Coastguard Worker    "system_ext",
28*7594170eSAndroid Build Coastguard Worker    "odm",
29*7594170eSAndroid Build Coastguard Worker    "vendor_dlkm",
30*7594170eSAndroid Build Coastguard Worker    "system_dlkm",
31*7594170eSAndroid Build Coastguard Worker    "oem",
32*7594170eSAndroid Build Coastguard Worker]
33*7594170eSAndroid Build Coastguard Worker
34*7594170eSAndroid Build Coastguard Workerdef _get_python3(ctx):
35*7594170eSAndroid Build Coastguard Worker    python_interpreter = ctx.toolchains["@bazel_tools//tools/python:toolchain_type"].py3_runtime.interpreter
36*7594170eSAndroid Build Coastguard Worker    if python_interpreter.basename == "python3":
37*7594170eSAndroid Build Coastguard Worker        return python_interpreter
38*7594170eSAndroid Build Coastguard Worker
39*7594170eSAndroid Build Coastguard Worker    renamed = ctx.actions.declare_file(ctx.attr.name + "/python3")
40*7594170eSAndroid Build Coastguard Worker    ctx.actions.symlink(
41*7594170eSAndroid Build Coastguard Worker        output = renamed,
42*7594170eSAndroid Build Coastguard Worker        target_file = python_interpreter,
43*7594170eSAndroid Build Coastguard Worker        is_executable = True,
44*7594170eSAndroid Build Coastguard Worker    )
45*7594170eSAndroid Build Coastguard Worker    return renamed
46*7594170eSAndroid Build Coastguard Worker
47*7594170eSAndroid Build Coastguard Workerdef _partition_impl(ctx):
48*7594170eSAndroid Build Coastguard Worker    if ctx.attr.type != "system":
49*7594170eSAndroid Build Coastguard Worker        fail("currently only system images are supported")
50*7594170eSAndroid Build Coastguard Worker
51*7594170eSAndroid Build Coastguard Worker    toolchain = ctx.toolchains[":partition_toolchain_type"].toolchain_info
52*7594170eSAndroid Build Coastguard Worker    python_interpreter = _get_python3(ctx)
53*7594170eSAndroid Build Coastguard Worker
54*7594170eSAndroid Build Coastguard Worker    du = ctx.actions.declare_file(ctx.attr.name + "/du")
55*7594170eSAndroid Build Coastguard Worker    ctx.actions.symlink(
56*7594170eSAndroid Build Coastguard Worker        output = du,
57*7594170eSAndroid Build Coastguard Worker        target_file = toolchain.toybox[DefaultInfo].files_to_run.executable,
58*7594170eSAndroid Build Coastguard Worker        is_executable = True,
59*7594170eSAndroid Build Coastguard Worker    )
60*7594170eSAndroid Build Coastguard Worker    find = ctx.actions.declare_file(ctx.attr.name + "/find")
61*7594170eSAndroid Build Coastguard Worker    ctx.actions.symlink(
62*7594170eSAndroid Build Coastguard Worker        output = find,
63*7594170eSAndroid Build Coastguard Worker        target_file = toolchain.toybox[DefaultInfo].files_to_run.executable,
64*7594170eSAndroid Build Coastguard Worker        is_executable = True,
65*7594170eSAndroid Build Coastguard Worker    )
66*7594170eSAndroid Build Coastguard Worker
67*7594170eSAndroid Build Coastguard Worker    # build_image requires that the output file be named specifically <type>.img, so
68*7594170eSAndroid Build Coastguard Worker    # put all the outputs under a name-qualified folder.
69*7594170eSAndroid Build Coastguard Worker    output_image = ctx.actions.declare_file(ctx.attr.name + "/" + ctx.attr.type + ".img")
70*7594170eSAndroid Build Coastguard Worker
71*7594170eSAndroid Build Coastguard Worker    # TODO(b/297269187) Fill this out with the contents of ctx.attr.deps
72*7594170eSAndroid Build Coastguard Worker    files = {}
73*7594170eSAndroid Build Coastguard Worker
74*7594170eSAndroid Build Coastguard Worker    staging_dir_builder_options = {
75*7594170eSAndroid Build Coastguard Worker        "file_mapping": {k: v.path for k, v in files.items()},
76*7594170eSAndroid Build Coastguard Worker    }
77*7594170eSAndroid Build Coastguard Worker
78*7594170eSAndroid Build Coastguard Worker    extra_inputs = []
79*7594170eSAndroid Build Coastguard Worker    if ctx.attr.base_staging_dir:
80*7594170eSAndroid Build Coastguard Worker        staging_dir_builder_options["base_staging_dir"] = ctx.file.base_staging_dir.path
81*7594170eSAndroid Build Coastguard Worker        extra_inputs.append(ctx.file.base_staging_dir)
82*7594170eSAndroid Build Coastguard Worker        bbipi = ctx.attr._build_broken_incorrect_partition_images[BuildSettingInfo].value
83*7594170eSAndroid Build Coastguard Worker        if ctx.attr.base_staging_dir_file_list and not bbipi:
84*7594170eSAndroid Build Coastguard Worker            staging_dir_builder_options["base_staging_dir_file_list"] = ctx.file.base_staging_dir_file_list.path
85*7594170eSAndroid Build Coastguard Worker            extra_inputs.append(ctx.file.base_staging_dir_file_list)
86*7594170eSAndroid Build Coastguard Worker
87*7594170eSAndroid Build Coastguard Worker    if "{BUILD_NUMBER}" in ctx.attr.image_properties:
88*7594170eSAndroid Build Coastguard Worker        fail("Can't have {BUILD_NUMBER} in image_properties")
89*7594170eSAndroid Build Coastguard Worker    for line in ctx.attr.image_properties.splitlines():
90*7594170eSAndroid Build Coastguard Worker        if line.startswith("avb_"):
91*7594170eSAndroid Build Coastguard Worker            fail("avb properties should be managed by their bespoke attributes: " + line)
92*7594170eSAndroid Build Coastguard Worker
93*7594170eSAndroid Build Coastguard Worker    image_info_contents = ctx.attr.image_properties + "\n\n"
94*7594170eSAndroid Build Coastguard Worker    image_info_contents += "ext_mkuserimg=mkuserimg_mke2fs\n"
95*7594170eSAndroid Build Coastguard Worker    if ctx.attr.root_dir:
96*7594170eSAndroid Build Coastguard Worker        extra_inputs.append(ctx.file.root_dir)
97*7594170eSAndroid Build Coastguard Worker        image_info_contents += "root_dir=" + ctx.file.root_dir.path + "\n"
98*7594170eSAndroid Build Coastguard Worker    if ctx.attr.selinux_file_contexts:
99*7594170eSAndroid Build Coastguard Worker        extra_inputs.append(ctx.file.selinux_file_contexts)
100*7594170eSAndroid Build Coastguard Worker        image_info_contents += ctx.attr.type + "_selinux_fc=" + ctx.file.selinux_file_contexts.path + "\n"
101*7594170eSAndroid Build Coastguard Worker
102*7594170eSAndroid Build Coastguard Worker    if not ctx.attr.avb_enable:
103*7594170eSAndroid Build Coastguard Worker        if ctx.attr.avb_add_hashtree_footer_args:
104*7594170eSAndroid Build Coastguard Worker            fail("Must specify avb_enable = True to use avb_add_hashtree_footer_args")
105*7594170eSAndroid Build Coastguard Worker        if ctx.attr.avb_key:
106*7594170eSAndroid Build Coastguard Worker            fail("Must specify avb_enable = True to use avb_key")
107*7594170eSAndroid Build Coastguard Worker        if ctx.attr.avb_algorithm:
108*7594170eSAndroid Build Coastguard Worker            fail("Must specify avb_enable = True to use avb_key")
109*7594170eSAndroid Build Coastguard Worker        if ctx.attr.avb_rollback_index >= 0:
110*7594170eSAndroid Build Coastguard Worker            fail("Must specify avb_enable = True to use avb_rollback_index")
111*7594170eSAndroid Build Coastguard Worker        if ctx.attr.avb_rollback_index_location >= 0:
112*7594170eSAndroid Build Coastguard Worker            fail("Must specify avb_enable = True to use avb_rollback_index_location")
113*7594170eSAndroid Build Coastguard Worker    else:
114*7594170eSAndroid Build Coastguard Worker        image_info_contents += "avb_avbtool=avbtool\n"
115*7594170eSAndroid Build Coastguard Worker        image_info_contents += "avb_" + ctx.attr.type + "_hashtree_enable=true" + "\n"
116*7594170eSAndroid Build Coastguard Worker        footer_args = ctx.attr.avb_add_hashtree_footer_args
117*7594170eSAndroid Build Coastguard Worker        if footer_args:
118*7594170eSAndroid Build Coastguard Worker            footer_args += " "
119*7594170eSAndroid Build Coastguard Worker        footer_args += "--prop com.android.build.system.os_version:" + ctx.attr._platform_version_last_stable[BuildSettingInfo].value
120*7594170eSAndroid Build Coastguard Worker        footer_args += " --prop com.android.build.system.fingerprint:" + ctx.attr._build_fingerprint[BuildFingerprintInfo].fingerprint_placeholder_build_number
121*7594170eSAndroid Build Coastguard Worker        footer_args += " --prop com.android.build.system.security_patch:" + ctx.attr._platform_security_patch[BuildSettingInfo].value
122*7594170eSAndroid Build Coastguard Worker        if not ctx.attr.type.startswith("vbmeta_") and ctx.attr.avb_rollback_index >= 0:
123*7594170eSAndroid Build Coastguard Worker            footer_args += " --rollback_index " + str(ctx.attr.avb_rollback_index)
124*7594170eSAndroid Build Coastguard Worker        image_info_contents += "avb_" + ctx.attr.type + "_add_hashtree_footer_args=" + footer_args + "\n"
125*7594170eSAndroid Build Coastguard Worker        if ctx.attr.avb_key:
126*7594170eSAndroid Build Coastguard Worker            image_info_contents += "avb_" + ctx.attr.type + "_key_path=" + ctx.file.avb_key.path + "\n"
127*7594170eSAndroid Build Coastguard Worker            extra_inputs.append(ctx.file.avb_key)
128*7594170eSAndroid Build Coastguard Worker            image_info_contents += "avb_" + ctx.attr.type + "_algorithm=" + ctx.attr.avb_algorithm + "\n"
129*7594170eSAndroid Build Coastguard Worker            if ctx.attr.avb_rollback_index_location >= 0:
130*7594170eSAndroid Build Coastguard Worker                image_info_contents += "avb_" + ctx.attr.type + "_rollback_index_location=" + str(ctx.attr.avb_rollback_index_location) + "\n"
131*7594170eSAndroid Build Coastguard Worker
132*7594170eSAndroid Build Coastguard Worker    image_info_without_build_number = ctx.actions.declare_file(ctx.attr.name + "/image_info_without_build_number.txt")
133*7594170eSAndroid Build Coastguard Worker    ctx.actions.write(image_info_without_build_number, image_info_contents)
134*7594170eSAndroid Build Coastguard Worker    image_info = ctx.actions.declare_file(ctx.attr.name + "/image_info.txt")
135*7594170eSAndroid Build Coastguard Worker    ctx.actions.run(
136*7594170eSAndroid Build Coastguard Worker        inputs = [
137*7594170eSAndroid Build Coastguard Worker            ctx.version_file,
138*7594170eSAndroid Build Coastguard Worker            image_info_without_build_number,
139*7594170eSAndroid Build Coastguard Worker        ],
140*7594170eSAndroid Build Coastguard Worker        outputs = [image_info],
141*7594170eSAndroid Build Coastguard Worker        executable = ctx.executable._status_file_reader,
142*7594170eSAndroid Build Coastguard Worker        arguments = [
143*7594170eSAndroid Build Coastguard Worker            "replace",
144*7594170eSAndroid Build Coastguard Worker            ctx.version_file.path,
145*7594170eSAndroid Build Coastguard Worker            image_info_without_build_number.path,
146*7594170eSAndroid Build Coastguard Worker            image_info.path,
147*7594170eSAndroid Build Coastguard Worker            "--var",
148*7594170eSAndroid Build Coastguard Worker            "BUILD_NUMBER",
149*7594170eSAndroid Build Coastguard Worker        ],
150*7594170eSAndroid Build Coastguard Worker    )
151*7594170eSAndroid Build Coastguard Worker
152*7594170eSAndroid Build Coastguard Worker    staging_dir_builder_options_file = ctx.actions.declare_file(ctx.attr.name + "/staging_dir_builder_options.json")
153*7594170eSAndroid Build Coastguard Worker    ctx.actions.write(staging_dir_builder_options_file, json.encode(staging_dir_builder_options))
154*7594170eSAndroid Build Coastguard Worker
155*7594170eSAndroid Build Coastguard Worker    build_image_files = toolchain.build_image[DefaultInfo].files_to_run
156*7594170eSAndroid Build Coastguard Worker
157*7594170eSAndroid Build Coastguard Worker    # These are tools that are run from build_image or another tool that build_image runs.
158*7594170eSAndroid Build Coastguard Worker    # They are all expected to be available in the PATH.
159*7594170eSAndroid Build Coastguard Worker    extra_tools = [
160*7594170eSAndroid Build Coastguard Worker        toolchain.avbtool[DefaultInfo].files_to_run,
161*7594170eSAndroid Build Coastguard Worker        toolchain.e2fsdroid[DefaultInfo].files_to_run,
162*7594170eSAndroid Build Coastguard Worker        toolchain.fec[DefaultInfo].files_to_run,
163*7594170eSAndroid Build Coastguard Worker        toolchain.mke2fs[DefaultInfo].files_to_run,
164*7594170eSAndroid Build Coastguard Worker        toolchain.mkfs_erofs[DefaultInfo].files_to_run,
165*7594170eSAndroid Build Coastguard Worker        toolchain.mkuserimg_mke2fs[DefaultInfo].files_to_run,
166*7594170eSAndroid Build Coastguard Worker        toolchain.simg2img[DefaultInfo].files_to_run,
167*7594170eSAndroid Build Coastguard Worker        toolchain.tune2fs[DefaultInfo].files_to_run,
168*7594170eSAndroid Build Coastguard Worker    ]
169*7594170eSAndroid Build Coastguard Worker
170*7594170eSAndroid Build Coastguard Worker    ctx.actions.run(
171*7594170eSAndroid Build Coastguard Worker        inputs = [
172*7594170eSAndroid Build Coastguard Worker            image_info,
173*7594170eSAndroid Build Coastguard Worker            staging_dir_builder_options_file,
174*7594170eSAndroid Build Coastguard Worker            toolchain.openssl,
175*7594170eSAndroid Build Coastguard Worker        ] + files.values() + extra_inputs,
176*7594170eSAndroid Build Coastguard Worker        tools = extra_tools + [
177*7594170eSAndroid Build Coastguard Worker            build_image_files,
178*7594170eSAndroid Build Coastguard Worker            du,
179*7594170eSAndroid Build Coastguard Worker            find,
180*7594170eSAndroid Build Coastguard Worker            python_interpreter,
181*7594170eSAndroid Build Coastguard Worker            toolchain.toybox[DefaultInfo].files_to_run,
182*7594170eSAndroid Build Coastguard Worker        ],
183*7594170eSAndroid Build Coastguard Worker        outputs = [output_image],
184*7594170eSAndroid Build Coastguard Worker        executable = ctx.executable._staging_dir_builder,
185*7594170eSAndroid Build Coastguard Worker        arguments = [
186*7594170eSAndroid Build Coastguard Worker            staging_dir_builder_options_file.path,
187*7594170eSAndroid Build Coastguard Worker            build_image_files.executable.path,
188*7594170eSAndroid Build Coastguard Worker            "STAGING_DIR_PLACEHOLDER",
189*7594170eSAndroid Build Coastguard Worker            image_info.path,
190*7594170eSAndroid Build Coastguard Worker            output_image.path,
191*7594170eSAndroid Build Coastguard Worker            "STAGING_DIR_PLACEHOLDER",
192*7594170eSAndroid Build Coastguard Worker        ],
193*7594170eSAndroid Build Coastguard Worker        mnemonic = "BuildPartition",
194*7594170eSAndroid Build Coastguard Worker        env = {
195*7594170eSAndroid Build Coastguard Worker            # The dict + .keys() is to dedup the path elements, as some tools are in the same folder
196*7594170eSAndroid Build Coastguard Worker            "PATH": ":".join(({t.executable.dirname: True for t in extra_tools} | {
197*7594170eSAndroid Build Coastguard Worker                python_interpreter.dirname: True,
198*7594170eSAndroid Build Coastguard Worker            } | {
199*7594170eSAndroid Build Coastguard Worker                du.dirname: True,
200*7594170eSAndroid Build Coastguard Worker            } | {
201*7594170eSAndroid Build Coastguard Worker                find.dirname: True,
202*7594170eSAndroid Build Coastguard Worker            } | {
203*7594170eSAndroid Build Coastguard Worker                toolchain.openssl.dirname: True,
204*7594170eSAndroid Build Coastguard Worker            }).keys()),
205*7594170eSAndroid Build Coastguard Worker        },
206*7594170eSAndroid Build Coastguard Worker    )
207*7594170eSAndroid Build Coastguard Worker
208*7594170eSAndroid Build Coastguard Worker    return DefaultInfo(files = depset([output_image]))
209*7594170eSAndroid Build Coastguard Worker
210*7594170eSAndroid Build Coastguard Worker_partition = rule(
211*7594170eSAndroid Build Coastguard Worker    implementation = _partition_impl,
212*7594170eSAndroid Build Coastguard Worker    attrs = {
213*7594170eSAndroid Build Coastguard Worker        "type": attr.string(
214*7594170eSAndroid Build Coastguard Worker            mandatory = True,
215*7594170eSAndroid Build Coastguard Worker            values = _IMAGE_TYPES,
216*7594170eSAndroid Build Coastguard Worker        ),
217*7594170eSAndroid Build Coastguard Worker        "image_properties": attr.string(
218*7594170eSAndroid Build Coastguard Worker            doc = "The image property dictionary in key=value format. TODO: consider replacing this with explicit bazel properties for each property in this file.",
219*7594170eSAndroid Build Coastguard Worker        ),
220*7594170eSAndroid Build Coastguard Worker        "avb_enable": attr.bool(),
221*7594170eSAndroid Build Coastguard Worker        "avb_add_hashtree_footer_args": attr.string(),
222*7594170eSAndroid Build Coastguard Worker        "avb_key": attr.label(allow_single_file = True),
223*7594170eSAndroid Build Coastguard Worker        "avb_algorithm": attr.string(),
224*7594170eSAndroid Build Coastguard Worker        "avb_rollback_index": attr.int(default = -1),
225*7594170eSAndroid Build Coastguard Worker        "avb_rollback_index_location": attr.int(default = -1),
226*7594170eSAndroid Build Coastguard Worker        "base_staging_dir": attr.label(
227*7594170eSAndroid Build Coastguard Worker            allow_single_file = True,
228*7594170eSAndroid Build Coastguard Worker            doc = "A staging dir that the deps will be added to. This is intended to be used to import a make-built staging directory when building the partition with bazel.",
229*7594170eSAndroid Build Coastguard Worker        ),
230*7594170eSAndroid Build Coastguard Worker        "base_staging_dir_file_list": attr.label(
231*7594170eSAndroid Build Coastguard Worker            allow_single_file = True,
232*7594170eSAndroid Build Coastguard Worker            doc = "A file list that will be used to filter the base_staging_dir.",
233*7594170eSAndroid Build Coastguard Worker        ),
234*7594170eSAndroid Build Coastguard Worker        "deps": attr.label_list(),
235*7594170eSAndroid Build Coastguard Worker        "root_dir": attr.label(
236*7594170eSAndroid Build Coastguard Worker            allow_single_file = True,
237*7594170eSAndroid Build Coastguard Worker            doc = "A folder to add as the root_dir property in the property file",
238*7594170eSAndroid Build Coastguard Worker        ),
239*7594170eSAndroid Build Coastguard Worker        "selinux_file_contexts": attr.label(
240*7594170eSAndroid Build Coastguard Worker            allow_single_file = True,
241*7594170eSAndroid Build Coastguard Worker            doc = "The file specifying the selinux rules for all the files in this partition.",
242*7594170eSAndroid Build Coastguard Worker        ),
243*7594170eSAndroid Build Coastguard Worker        "_build_broken_incorrect_partition_images": attr.label(
244*7594170eSAndroid Build Coastguard Worker            default = "//build/bazel/product_config:build_broken_incorrect_partition_images",
245*7594170eSAndroid Build Coastguard Worker        ),
246*7594170eSAndroid Build Coastguard Worker        "_build_fingerprint": attr.label(
247*7594170eSAndroid Build Coastguard Worker            default = "//build/bazel/rules:build_fingerprint",
248*7594170eSAndroid Build Coastguard Worker        ),
249*7594170eSAndroid Build Coastguard Worker        "_platform_version_last_stable": attr.label(
250*7594170eSAndroid Build Coastguard Worker            default = "//build/bazel/product_config:platform_version_last_stable",
251*7594170eSAndroid Build Coastguard Worker        ),
252*7594170eSAndroid Build Coastguard Worker        "_platform_security_patch": attr.label(
253*7594170eSAndroid Build Coastguard Worker            default = "//build/bazel/product_config:platform_security_patch",
254*7594170eSAndroid Build Coastguard Worker        ),
255*7594170eSAndroid Build Coastguard Worker        "_staging_dir_builder": attr.label(
256*7594170eSAndroid Build Coastguard Worker            cfg = "exec",
257*7594170eSAndroid Build Coastguard Worker            doc = "The tool used to build a staging directory, because if bazel were to build it it would be entirely symlinks.",
258*7594170eSAndroid Build Coastguard Worker            executable = True,
259*7594170eSAndroid Build Coastguard Worker            default = "//build/bazel/rules:staging_dir_builder",
260*7594170eSAndroid Build Coastguard Worker        ),
261*7594170eSAndroid Build Coastguard Worker        "_status_file_reader": attr.label(
262*7594170eSAndroid Build Coastguard Worker            cfg = "exec",
263*7594170eSAndroid Build Coastguard Worker            executable = True,
264*7594170eSAndroid Build Coastguard Worker            default = "//build/bazel/rules:status_file_reader",
265*7594170eSAndroid Build Coastguard Worker        ),
266*7594170eSAndroid Build Coastguard Worker    },
267*7594170eSAndroid Build Coastguard Worker    toolchains = [
268*7594170eSAndroid Build Coastguard Worker        ":partition_toolchain_type",
269*7594170eSAndroid Build Coastguard Worker        "@bazel_tools//tools/python:toolchain_type",
270*7594170eSAndroid Build Coastguard Worker    ],
271*7594170eSAndroid Build Coastguard Worker)
272*7594170eSAndroid Build Coastguard Worker
273*7594170eSAndroid Build Coastguard Workerdef partition(target_compatible_with = [], **kwargs):
274*7594170eSAndroid Build Coastguard Worker    target_compatible_with = select({
275*7594170eSAndroid Build Coastguard Worker        "//build/bazel_common_rules/platforms/os:android": [],
276*7594170eSAndroid Build Coastguard Worker        "//conditions:default": ["@platforms//:incompatible"],
277*7594170eSAndroid Build Coastguard Worker    }) + target_compatible_with
278*7594170eSAndroid Build Coastguard Worker    _partition(
279*7594170eSAndroid Build Coastguard Worker        target_compatible_with = target_compatible_with,
280*7594170eSAndroid Build Coastguard Worker        **kwargs
281*7594170eSAndroid Build Coastguard Worker    )
282