From 3dc924bdb4655ea20c9a950e925d72c5a1f5cc7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20M=C3=A1rquez=20P=C3=A9rez=20Mu=C3=B1=C3=ADz=20D?= =?UTF-8?q?=C3=ADaz=20P=C3=BAras=20Thaureaux?= Date: Thu, 10 Feb 2022 17:29:57 -0500 Subject: Subsume prebuilt_etc through prebuilt_file usage This allows us to leverage `prebuilt_file` for any `prebuilt_etc`-sibling-module usage, starting with `prebuilt_usr_share`. Bug: 215723302 Test: bp2build.sh Test: mixed_{libc,droid}.sh Change-Id: I8f13d2015773e0912b4e0b8c9d2a321d7c6f8113 --- rules/apex.bzl | 17 +++++------------ rules/prebuilt_file.bzl | 42 +++++++++++++++++++++++++++++++++--------- 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/rules/apex.bzl b/rules/apex.bzl index 70e14a72..e5fc11ef 100644 --- a/rules/apex.bzl +++ b/rules/apex.bzl @@ -52,19 +52,12 @@ def _prepare_apexer_wrapper_inputs(ctx): # Handle prebuilts for dep in ctx.attr.prebuilts: - # TODO: Support more prebuilts than just PrebuiltEtc - prebuilt_etc_info = dep[PrebuiltFileInfo] - - directory = "etc" - if prebuilt_etc_info.sub_dir != None and prebuilt_etc_info.sub_dir != "": - directory = "/".join([directory, prebuilt_etc_info.sub_dir]) - - if prebuilt_etc_info.filename != None and prebuilt_etc_info.filename != "": - filename = prebuilt_etc_info.filename + prebuilt_file_info = dep[PrebuiltFileInfo] + if prebuilt_file_info.filename: + filename = prebuilt_file_info.filename else: filename = dep.label.name - - apex_manifest[(directory, filename)] = prebuilt_etc_info.src + apex_manifest[(prebuilt_file_info.dir, filename)] = prebuilt_file_info.src # Handle binaries for dep in ctx.attr.binaries: @@ -350,7 +343,7 @@ _apex = rule( ], cfg = apex_transition, ), - "prebuilts": attr.label_list(providers = [PrebuiltEtcInfo], cfg = apex_transition), + "prebuilts": attr.label_list(providers = [PrebuiltFileInfo], cfg = apex_transition), "apex_output": attr.output(doc = "signed .apex output"), "capex_output": attr.output(doc = "signed .capex output"), diff --git a/rules/prebuilt_file.bzl b/rules/prebuilt_file.bzl index 210a42fa..12e69824 100644 --- a/rules/prebuilt_file.bzl +++ b/rules/prebuilt_file.bzl @@ -18,27 +18,50 @@ PrebuiltFileInfo = provider( "Info needed for prebuilt_file modules", fields = { "src": "Source file of this prebuilt", - "sub_dir": "Optional subdirectory into which to install", + "dir": "Directory into which to install", "filename": "Optional name for the installed file", "installable": "Whether this is directly installable into one of the partitions", }, ) +_handled_dirs = ["etc", "usr/share"] def _prebuilt_file_rule_impl(ctx): + srcs = ctx.files.src + if len(srcs) != 1: + fail("src for", ctx.label.name, "is expected to be singular, but is of len", len(srcs), ":\n", srcs) + + # Is this an acceptable directory, or a subdir under one? + dir = ctx.attr.dir + acceptable = False + for d in _handled_dirs: + if dir == d or dir.startswith(d + "/"): + acceptable = True + break + if not acceptable: + fail("dir for", ctx.label.name, "is `", dir, "`, but we only handle these:\n", _handled_dirs) + return [ PrebuiltFileInfo( - src = ctx.file.src, - sub_dir = ctx.attr.sub_dir, + src = srcs[0], + dir = dir, filename = ctx.attr.filename, installable = ctx.attr.installable, ), + DefaultInfo( + files = depset(srcs), + ), ] _prebuilt_file = rule( implementation = _prebuilt_file_rule_impl, attrs = { - "src": attr.label(mandatory = True, allow_single_file = True), - "sub_dir": attr.string(), + "src": attr.label( + mandatory = True, + allow_files = True, + # TODO(b/217908237): reenable allow_single_file + # allow_single_file = True, + ), + "dir": attr.string(mandatory = True), "filename": attr.string(), "installable": attr.bool(default = True), }, @@ -47,18 +70,19 @@ _prebuilt_file = rule( def prebuilt_file( name, src, - sub_dir = None, + dir, filename = None, installable = True, - # TODO(b/207489266): Fully support; data is currently simply dropped to prevent breakages. + # TODO(b/207489266): Fully support; + # data is currently dropped to prevent breakages from e.g. prebuilt_etc data = [], **kwargs): - "Bazel macro to correspond with the prebuilt_etc Soong module." + "Bazel macro to correspond with the e.g. prebuilt_etc and prebuilt_usr_share Soong modules." _prebuilt_file( name = name, src = src, - sub_dir = sub_dir, + dir = dir, filename = filename, installable = installable, **kwargs -- cgit v1.2.3