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
diff --git a/rules/apex.bzl b/rules/apex.bzl
index 70e14a7..e5fc11e 100644
--- a/rules/apex.bzl
+++ b/rules/apex.bzl
@@ -52,19 +52,12 @@
 
     # 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 @@
             ],
             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 210a42f..12e6982 100644
--- a/rules/prebuilt_file.bzl
+++ b/rules/prebuilt_file.bzl
@@ -18,27 +18,50 @@
     "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 @@
 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