1*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2021 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""" 16*7594170eSAndroid Build Coastguard WorkerContains prebuilt_file rule that handles prebuilt artifacts installation. 17*7594170eSAndroid Build Coastguard Worker""" 18*7594170eSAndroid Build Coastguard Worker 19*7594170eSAndroid Build Coastguard WorkerPrebuiltFileInfo = provider( 20*7594170eSAndroid Build Coastguard Worker "Info needed for prebuilt_file modules", 21*7594170eSAndroid Build Coastguard Worker fields = { 22*7594170eSAndroid Build Coastguard Worker "src": "Source file of this prebuilt", 23*7594170eSAndroid Build Coastguard Worker "dir": "Directory into which to install", 24*7594170eSAndroid Build Coastguard Worker "filename": "Optional name for the installed file", 25*7594170eSAndroid Build Coastguard Worker "installable": "Whether this is directly installable into one of the partitions", 26*7594170eSAndroid Build Coastguard Worker }, 27*7594170eSAndroid Build Coastguard Worker) 28*7594170eSAndroid Build Coastguard Worker_handled_dirs = ["etc", "usr/share", "."] 29*7594170eSAndroid Build Coastguard Worker 30*7594170eSAndroid Build Coastguard Workerdef _prebuilt_file_rule_impl(ctx): 31*7594170eSAndroid Build Coastguard Worker src = ctx.file.src 32*7594170eSAndroid Build Coastguard Worker 33*7594170eSAndroid Build Coastguard Worker # Is this an acceptable directory, or a subdir under one? 34*7594170eSAndroid Build Coastguard Worker dir = ctx.attr.dir 35*7594170eSAndroid Build Coastguard Worker acceptable = False 36*7594170eSAndroid Build Coastguard Worker for d in _handled_dirs: 37*7594170eSAndroid Build Coastguard Worker if dir == d or dir.startswith(d + "/"): 38*7594170eSAndroid Build Coastguard Worker acceptable = True 39*7594170eSAndroid Build Coastguard Worker break 40*7594170eSAndroid Build Coastguard Worker if not acceptable: 41*7594170eSAndroid Build Coastguard Worker fail("dir for", ctx.label.name, "is `", dir, "`, but we only handle these:\n", _handled_dirs) 42*7594170eSAndroid Build Coastguard Worker 43*7594170eSAndroid Build Coastguard Worker if ctx.attr.filename_from_src and ctx.attr.filename != "": 44*7594170eSAndroid Build Coastguard Worker fail("filename is set. filename_from_src cannot be true") 45*7594170eSAndroid Build Coastguard Worker elif ctx.attr.filename != "": 46*7594170eSAndroid Build Coastguard Worker filename = ctx.attr.filename 47*7594170eSAndroid Build Coastguard Worker elif ctx.attr.filename_from_src: 48*7594170eSAndroid Build Coastguard Worker filename = src.basename 49*7594170eSAndroid Build Coastguard Worker else: 50*7594170eSAndroid Build Coastguard Worker filename = ctx.attr.name 51*7594170eSAndroid Build Coastguard Worker 52*7594170eSAndroid Build Coastguard Worker if "/" in filename: 53*7594170eSAndroid Build Coastguard Worker fail("filename cannot contain separator '/'") 54*7594170eSAndroid Build Coastguard Worker 55*7594170eSAndroid Build Coastguard Worker return [ 56*7594170eSAndroid Build Coastguard Worker PrebuiltFileInfo( 57*7594170eSAndroid Build Coastguard Worker src = src, 58*7594170eSAndroid Build Coastguard Worker dir = dir, 59*7594170eSAndroid Build Coastguard Worker filename = filename, 60*7594170eSAndroid Build Coastguard Worker installable = ctx.attr.installable, 61*7594170eSAndroid Build Coastguard Worker ), 62*7594170eSAndroid Build Coastguard Worker DefaultInfo( 63*7594170eSAndroid Build Coastguard Worker files = depset([src]), 64*7594170eSAndroid Build Coastguard Worker ), 65*7594170eSAndroid Build Coastguard Worker ] 66*7594170eSAndroid Build Coastguard Worker 67*7594170eSAndroid Build Coastguard Worker_prebuilt_file = rule( 68*7594170eSAndroid Build Coastguard Worker implementation = _prebuilt_file_rule_impl, 69*7594170eSAndroid Build Coastguard Worker attrs = { 70*7594170eSAndroid Build Coastguard Worker "src": attr.label( 71*7594170eSAndroid Build Coastguard Worker mandatory = True, 72*7594170eSAndroid Build Coastguard Worker allow_single_file = True, 73*7594170eSAndroid Build Coastguard Worker ), 74*7594170eSAndroid Build Coastguard Worker "dir": attr.string(mandatory = True), 75*7594170eSAndroid Build Coastguard Worker "filename": attr.string(), 76*7594170eSAndroid Build Coastguard Worker "filename_from_src": attr.bool(default = True), 77*7594170eSAndroid Build Coastguard Worker "installable": attr.bool(default = True), 78*7594170eSAndroid Build Coastguard Worker }, 79*7594170eSAndroid Build Coastguard Worker) 80*7594170eSAndroid Build Coastguard Worker 81*7594170eSAndroid Build Coastguard Workerdef prebuilt_file( 82*7594170eSAndroid Build Coastguard Worker name, 83*7594170eSAndroid Build Coastguard Worker src, 84*7594170eSAndroid Build Coastguard Worker dir, 85*7594170eSAndroid Build Coastguard Worker filename = None, 86*7594170eSAndroid Build Coastguard Worker installable = True, 87*7594170eSAndroid Build Coastguard Worker filename_from_src = False, 88*7594170eSAndroid Build Coastguard Worker # TODO(b/207489266): Fully support; 89*7594170eSAndroid Build Coastguard Worker # data is currently dropped to prevent breakages from e.g. prebuilt_etc 90*7594170eSAndroid Build Coastguard Worker data = [], # @unused 91*7594170eSAndroid Build Coastguard Worker **kwargs): 92*7594170eSAndroid Build Coastguard Worker "Bazel macro to correspond with the e.g. prebuilt_etc and prebuilt_usr_share Soong modules." 93*7594170eSAndroid Build Coastguard Worker 94*7594170eSAndroid Build Coastguard Worker _prebuilt_file( 95*7594170eSAndroid Build Coastguard Worker name = name, 96*7594170eSAndroid Build Coastguard Worker src = src, 97*7594170eSAndroid Build Coastguard Worker dir = dir, 98*7594170eSAndroid Build Coastguard Worker filename = filename, 99*7594170eSAndroid Build Coastguard Worker installable = installable, 100*7594170eSAndroid Build Coastguard Worker filename_from_src = filename_from_src, 101*7594170eSAndroid Build Coastguard Worker **kwargs 102*7594170eSAndroid Build Coastguard Worker ) 103