[assembly] Add support for board configs

Change-Id: Ib9cfcbf00c6f89db4d1b2b88885947e4c173dd46
Reviewed-on: https://fuchsia-review.googlesource.com/c/sdk-integration/+/788502
Commit-Queue: Aidan Wolter <awolter@google.com>
Reviewed-by: Jiaming Li <lijiaming@google.com>
Fuchsia-Auto-Submit: Aidan Wolter <awolter@google.com>
diff --git a/bazel_rules_fuchsia/fuchsia/assembly.bzl b/bazel_rules_fuchsia/fuchsia/assembly.bzl
index 2734ecc..fbf524b 100644
--- a/bazel_rules_fuchsia/fuchsia/assembly.bzl
+++ b/bazel_rules_fuchsia/fuchsia/assembly.bzl
@@ -48,6 +48,10 @@
     _fuchsia_product_configuration = "fuchsia_product_configuration",
 )
 load(
+    "//fuchsia/private/assembly:fuchsia_board_configuration.bzl",
+    _fuchsia_board_configuration = "fuchsia_board_configuration",
+)
+load(
     "//fuchsia/private/assembly:providers.bzl",
     _FuchsiaProductAssemblyBundleInfo = "FuchsiaProductAssemblyBundleInfo",
     _FuchsiaProductImageInfo = "FuchsiaProductImageInfo",
@@ -145,6 +149,7 @@
 fuchsia_platform_connectivity_wlan_configuration = _fuchsia_platform_connectivity_wlan_configuration
 fuchsia_platform_development_support_configuration = _fuchsia_platform_development_support_configuration
 fuchsia_product_configuration = _fuchsia_product_configuration
+fuchsia_board_configuration = _fuchsia_board_configuration
 fuchsia_product_image = _fuchsia_product_image
 fuchsia_partitions_configuration = _fuchsia_partitions_configuration
 fuchsia_product_bundle = _fuchsia_product_bundle
diff --git a/bazel_rules_fuchsia/fuchsia/private/assembly/fuchsia_board_configuration.bzl b/bazel_rules_fuchsia/fuchsia/private/assembly/fuchsia_board_configuration.bzl
new file mode 100644
index 0000000..9bd5edc
--- /dev/null
+++ b/bazel_rules_fuchsia/fuchsia/private/assembly/fuchsia_board_configuration.bzl
@@ -0,0 +1,42 @@
+# Copyright 2023 The Fuchsia Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+load(
+    ":providers.bzl",
+    "FuchsiaBoardConfigInfo",
+)
+
+def _fuchsia_board_configuration_impl(ctx):
+    board_config = {}
+    board_config["name"] = ctx.attr.board_name
+    board_config["provided_features"] = ctx.attr.provided_features
+
+    board_config_file = ctx.actions.declare_file(ctx.label.name + "_board_config.json")
+    content = json.encode_indent(board_config, indent = "  ")
+    ctx.actions.write(board_config_file, content)
+
+    return [
+        DefaultInfo(
+            files = depset(
+                direct = [board_config_file],
+            ),
+        ),
+        FuchsiaBoardConfigInfo(
+            board_config = board_config_file,
+        ),
+    ]
+
+fuchsia_board_configuration = rule(
+    doc = """Generates a board configuration file.""",
+    implementation = _fuchsia_board_configuration_impl,
+    attrs = {
+        "board_name": attr.string(
+            doc = "Name of this board.",
+            mandatory = True,
+        ),
+        "provided_features": attr.string_list(
+            doc = "The features that this board provides to the product.",
+        ),
+    },
+)
diff --git a/bazel_rules_fuchsia/fuchsia/private/assembly/fuchsia_product_image.bzl b/bazel_rules_fuchsia/fuchsia/private/assembly/fuchsia_product_image.bzl
index 56884f8..802d6b0 100644
--- a/bazel_rules_fuchsia/fuchsia/private/assembly/fuchsia_product_image.bzl
+++ b/bazel_rules_fuchsia/fuchsia/private/assembly/fuchsia_product_image.bzl
@@ -9,6 +9,7 @@
     "FuchsiaAssemblyConfigInfo",
     "FuchsiaProductAssemblyBundleInfo",
     "FuchsiaProductConfigInfo",
+    "FuchsiaBoardConfigInfo",
     "FuchsiaProductImageInfo",
 )
 
@@ -27,6 +28,7 @@
     assembly \
     product \
     --product $ORIG_DIR/$PRODUCT_CONFIG_PATH \
+    --board-info $ORIG_DIR/$BOARD_CONFIG_PATH \
     --legacy-bundle $ORIG_DIR/$LEGACY_AIB \
     --input-bundles-dir $ORIG_DIR/$PLATFORM_AIB_DIR \
     --outdir $ORIG_DIR/$OUTDIR
@@ -53,11 +55,13 @@
     images_config_info = ctx.attr.image[FuchsiaAssemblyConfigInfo]
     images_config_file = images_config_info.config
     product_config_file = ctx.attr.product_config[FuchsiaProductConfigInfo].product_config
+    board_config_file = ctx.attr.board_config[FuchsiaBoardConfigInfo].board_config
 
     ffx_inputs = [
         ctx.file._sdk_manifest,
         ffx_tool,
         product_config_file,
+        board_config_file,
     ]
     ffx_inputs += legacy_aib.files
     ffx_inputs += platform_aibs.files
@@ -81,6 +85,7 @@
             "FFX_ISOLATE_DIR": ffx_isolate_dir.path,
             "OUTDIR": out_dir.path,
             "PRODUCT_CONFIG_PATH": product_config_file.path,
+            "BOARD_CONFIG_PATH": board_config_file.path,
             "LEGACY_AIB": legacy_aib.dir.path,
             "PLATFORM_AIB_DIR": platform_aibs.dir.path,
             "IMAGES_CONFIG_PATH": images_config_file.path,
@@ -111,6 +116,11 @@
             providers = [FuchsiaProductConfigInfo],
             mandatory = True,
         ),
+        "board_config": attr.label(
+            doc = "A board configuration target.",
+            providers = [FuchsiaBoardConfigInfo],
+            mandatory = True,
+        ),
         "image": attr.label(
             doc = "A fuchsia_images_configuration target.",
             providers = [FuchsiaAssemblyConfigInfo],
diff --git a/bazel_rules_fuchsia/fuchsia/private/assembly/providers.bzl b/bazel_rules_fuchsia/fuchsia/private/assembly/providers.bzl
index 103da16..0a68c6f 100644
--- a/bazel_rules_fuchsia/fuchsia/private/assembly/providers.bzl
+++ b/bazel_rules_fuchsia/fuchsia/private/assembly/providers.bzl
@@ -66,6 +66,13 @@
     },
 )
 
+FuchsiaBoardConfigInfo = provider(
+    doc = "A board-info used to containing the board_config.json and deps.",
+    fields = {
+        "board_config": "The JSON board configuration file.",
+    },
+)
+
 FuchsiaAssemblyConfigInfo = provider(
     doc = "Private provider that includes a single JSON configuration file.",
     fields = {