xref: /aosp_15_r20/build/bazel/rules/prebuilt_file.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
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