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