# Copyright 2022 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.

import("//build/components.gni")
import("//src/storage/fshost/generated_fshost_config.gni")
import("//tools/cmc/build/cmc.gni")

# Generates an fshost cml file.
#
# Parameters
#
#   options - a scope that can contain any fshost config option (see meta/config.cml).
#             data_filesystem_format is mandatory.  The following options are also supported:
#
#     bootfs_only - if set, the blob and data partitions will not get mounted.
#
#   testonly - the component will only be used for testing
template("fshost_cml") {
  cmc_merge(target_name) {
    forward_variables_from(invoker,
                           [
                             "output_name",
                             "visibility",
                             "testonly",
                           ])
    sources = [
      "//src/storage/fshost/meta/base_fshost.cml",
      "//src/storage/fshost/meta/config.cml",
      "//src/storage/lib/fs_management/client.shard.cml",
    ]
    options = invoker.options
    if (!defined(options.bootfs_only) || !options.bootfs_only) {
      if (defined(options.use_disk_migration) && options.use_disk_migration) {
        sources += [
          "//src/storage/fshost/meta/blobfs_fshost_test.cml",
          "//src/storage/fshost/meta/f2fs_fshost_test.cml",
          "//src/storage/fshost/meta/fxfs_fshost_test.cml",
          "//src/storage/fshost/meta/minfs_fshost_test.cml",
        ]
      } else if (options.data_filesystem_format == "minfs") {
        sources += [
          "//src/storage/fshost/meta/blobfs_fshost_test.cml",
          "//src/storage/fshost/meta/minfs_fshost_test.cml",
          "//src/storage/fshost/meta/non_fxfs_fshost.cml",
        ]
      } else if (options.data_filesystem_format == "fxfs") {
        if (defined(options.fxfs_blob) && !options.fxfs_blob) {
          sources += [
            "//src/storage/fshost/meta/blobfs_fshost_test.cml",
            "//src/storage/fshost/meta/fxfs_fshost_test.cml",
          ]
        } else {
          sources += [ "//src/storage/fshost/meta/fxfs_blob_fshost_test.cml" ]
        }
      } else if (options.data_filesystem_format == "f2fs") {
        sources += [
          "//src/storage/fshost/meta/blobfs_fshost_test.cml",
          "//src/storage/fshost/meta/f2fs_fshost_test.cml",
          "//src/storage/fshost/meta/non_fxfs_fshost.cml",
        ]
      }
      sources += [ "//src/storage/fshost/meta/core_fshost.cml" ]
      if (defined(options.use_disk_migration) && options.use_disk_migration) {
        sources += [ "//src/storage/fshost/meta/minfs_fshost_test.cml" ]
      }

      # These are components that must be included in the package depending on the data filesystem
      # format.
      # TODO(https://fxbug.dev/42064086):  Remove these dep when adding fshost to the common platform AIB,
      # and add these component to the AIB at the same time.
      deps = [
        "//src/storage/blobfs/bin:component",
        "//src/storage/memfs:memfs_component",

        # For now, we always need minfs to support migration
        "//src/storage/minfs/bin:minfs-component",
      ]

      if (options.data_filesystem_format == "fxfs") {
        deps += [
          "//src/storage/fxfs:fxfs_component",
          "//src/storage/fxfs-crypt",
        ]
      } else if (options.data_filesystem_format == "f2fs") {
        deps += [ "//src/storage/f2fs/bin:f2fs-component" ]
      }
    }
  }
}

# Generates an fshost component and matching config.
#
# Parameters:
#
#   options - same as for `fshost_cml` above, see that template's documentation
#             for details. The following options are also supported:
#
#   component_name (optional; default: target_name)
#     [string] The name to use for the fshost component (changes the name of the
#     component manifest that's created).
#
#   output_name (optional; used to enable transition to other template changes)
#
#  This will produces the following targets:
#
#     <target-name>.cml      : the cml file
#     <target-name>.manifest : the manifest (compiled cml file)
#     <target-name>.config   : the config
#     <target-name>.comp     : the component
#     <target-name>          : a group encompassing the component and the config
#
template("fshost_component_and_config") {
  _cml_target = "$target_name.cml"
  _manifest_target = "$target_name.manifest"
  _config_target = "$target_name.config"
  _component_target = "$target_name.comp"

  # This is used by any of the templates below that use `invoker.component_name`
  # or `forward_variables_from(invoker, [ "component_name" ...`.
  component_name = target_name
  if (defined(invoker.component_name)) {
    component_name = invoker.component_name
  }

  # The CML file
  fshost_cml(_cml_target) {
    forward_variables_from(invoker,
                           [
                             "options",
                             "output_name",
                             "testonly",
                           ])
    visibility = [ ":*" ]
  }

  # The manifest (compiled CML)
  fuchsia_component_manifest(_manifest_target) {
    forward_variables_from(invoker, [ "testonly" ])
    _target_outputs = get_target_outputs(":$_cml_target")
    manifest = _target_outputs[0]
    deps = [ ":$_cml_target" ]
    visibility = [ ":*" ]
  }

  # The config
  generated_fshost_config(_config_target) {
    options = {
      forward_variables_from(invoker.options, "*", [ "bootfs_only" ])
    }
  }

  # The component
  fuchsia_component(_component_target) {
    forward_variables_from(invoker, [ "testonly" ])
    deps = [ "//src/storage/fshost" ]
    cm_label = ":$_manifest_target"
  }

  group(target_name) {
    forward_variables_from(invoker, [ "testonly" ])
    deps = [
      ":$_component_target",
      ":$_config_target",
    ]

    # If testonly, use a null key source.  This will affect all components
    # in the same package.
    if (invoker.testonly) {
      deps += [ "//src/storage/fshost/testing:test_zxcrypt_config" ]
    }
  }
}
