# Copyright 2019 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("//tools/cmc/build/cmc.gni")

template("_audio_core_package") {
  components = []
  foreach(invoker_manifest, invoker.manifests) {
    cmx_name = get_path_info(invoker_manifest, "name")
    if (defined(invoker.extra_cmx)) {
      manifest_merge_target = "${target_name}_${cmx_name}_merge"
      cmc_merge(manifest_merge_target) {
        sources = [ invoker_manifest ] + invoker.extra_cmx
        output_name = "$manifest_merge_target.cmx"
      }
      invoker_manifest = get_target_outputs(":$manifest_merge_target")
      invoker_manifest = invoker_manifest[0]
    }

    component_target = "${target_name}_${cmx_name}_component"
    fuchsia_component(component_target) {
      forward_variables_from(invoker, [ "testonly" ])
      component_name = cmx_name
      manifest = invoker_manifest
      visibility = [
        ":*",
        "/*",
      ]

      deps = [ "//src/media/audio/audio_core:audio_core_bin" ]
      if (defined(manifest_merge_target)) {
        deps += [ ":$manifest_merge_target" ]
      }
    }
    components += [ ":$component_target" ]
  }

  fuchsia_package(target_name) {
    forward_variables_from(invoker,
                           [
                             "effects",
                             "package_name",
                             "testonly",
                             "visibility",
                           ])
    deps = components

    if (defined(effects)) {
      deps += [ effects.target ]
    }
  }
}

# Creates a 'audio_core' test package, designed to be used in the hermetic testing envirionment.
#
# Example:
# ```
#   audio_core_test_package("foo-audio-for-test") {
#     package_name = "foo-audio-for-test"
#     effects = {
#       target = "//path/to/effects/module"
#       name = "module_name.so"
#     }
#     extra_cmx = [
#       "meta/manifest.cmx",
#     ]
#   }
# ```
#
# Parameters
#     package_name (optional)
#       The name of the audio_core package. Defaults to 'target_name'.
#       Type: string
#       Default: ${target_name}
#
#     effects (optional)
#       A scope defining a loadable module that implements audio effects.
#       Type: scope with the entries:
#
#         target (required)
#           The GN `loadable_module` target that builds the effects module.
#           Type: path
#
#         name (required)
#           The name of the loadable module.
#           Type: string
#
#     extra_cmx (optional)
#       Additinoal CMX manifests that will be merged with the base audio_core.cmx manifest.
#       This can be used to add additional services or features that may be needed by different
#       audio effects.
#       Type: list(path)
template("audio_core_test_package") {
  _audio_core_package(target_name) {
    testonly = true
    forward_variables_from(invoker,
                           [
                             "effects",
                             "extra_cmx",
                             "package_name",
                           ])

    manifests = [
      # The nodevfs cmx is used in some test environments where we would like to provide our own
      # devfs for the test. At this time we need to remove any dev sandbox metadata as appmgr does
      # not allow these namespaces to be overridden.
      "//src/media/audio/audio_core/meta/audio_core_nodevfs.cmx",

      # The noconfigdata cmx additionally doesn't request the config-data feature so that the test
      # fixture may provide a custom /config/data directory.
      "//src/media/audio/audio_core/meta/audio_core_nodevfs_noconfigdata.cmx",
    ]
  }
}

# Creates a 'audio_core' package. All packages created with this template will be identical, except
# for the addition of the effects module.
#
# Example:
# ```
#   audio_core_package("foo_audio") {
#     package_name = "audio_package"
#     test_package_name = "test_audio_package"
#     effects = {
#       target = "//path/to/effects/module"
#       name = "module_name.so"
#     }
#     extra_cmx = [
#       "meta/manifest.cmx",
#     ]
#   }
# ```
#
# Parameters
#     effects (optional)
#       A scope defining a loadable module that implements audio effects.
#       Type: scope with the entries:
#
#         target (required)
#           The GN `loadable_module` target that builds the effects module.
#           Type: path
#
#         name (required)
#           The name of the loadable module.
#           Type: string
#
#     package_name (optional)
#       The name of the audio_core package. Defaults to 'target_name'.
#       Type: string
#       Default: ${target_name}
#
#     extra_cmx (optional)
#       Additinoal CMX manifests that will be merged with the base audio_core.cmx manifest.
#       This can be used to add additional services or features that may be needed by different
#       audio effects.
#
#     test_package_name (optional)
#       The name of the audio_core test package. This package contains manifests that allow
#       for the component to run in a hermetic test environment. No package will be generated
#       if this is not provided.
#       Type: string
#
#     extra_cmx (optional)
#       Additinoal CMX manifests that will be merged with the base audio_core.cmx manifest.
#       This can be used to add additional services or features that may be needed by different
#       audio effects.
#       Type: list(path)
template("audio_core_package") {
  forward_variables_from(invoker,
                         [
                           "package_name",
                           "test_package_name",
                         ])

  _audio_core_package(target_name) {
    forward_variables_from(invoker,
                           [
                             "effects",
                             "extra_cmx",
                             "package_name",
                           ])
    manifests = [ "//src/media/audio/audio_core/meta/audio_core.cmx" ]
  }

  if (defined(test_package_name)) {
    audio_core_test_package(test_package_name) {
      forward_variables_from(invoker,
                             [
                               "effects",
                               "extra_cmx",
                             ])

      package_name = test_package_name
    }
  }
}
