# Copyright 2020 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/config/fuchsia/rules.gni")
import("//build/driver_package.gni")

# Defines a controller driver
#
# This template creates a driver_module and driver_package customized for a
# specific target. Each instantiation must provide a dependency on a
# source_set that provides an implementation of camera::ProductConfig::Create.
# See //src/camera/drivers/controller/configs/product_config.h for more
# details.
#
# Example:
# ```
# camera_controller_driver(my_product_controller) {
#   deps = [
#     "//src/camera/drivers/controller/configs/my_product",
#   ]
# }
# ```
#
# Parameters
#   deps (required)
#     List of additional dependencies to link. This must provide an implementation
#     of camera::ProductConfig::Create.
#     Type: list(path)
#
#   package_name (optional)
#     The name of the driver package.
#     Type: string
#     Default: $target_name
#
#   gdc_config_files (optional)
#     List of paths, relative to //prebuilt/camera/arm/gdc/configs, to include
#     in the driver package.
#     Type: list(path)
#
#   watermark_files (optional)
#     List of paths, relative to //prebuilt/camera/watermark, to include in the
#     driver package.
#     Type: list(path)
#
template("camera_controller_driver") {
  package_name = target_name
  if (defined(invoker.package_name)) {
    package_name = invoker.package_name
  }
  driver_target = "${package_name}_driver"

  driver_module(driver_target) {
    output_name = package_name
    deps = [
      "//sdk/lib/syslog/cpp:backend_legacy",
      "//src/camera/drivers/controller:source",
    ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }

    configs -= [ "//build/config/fuchsia:no_cpp_standard_library" ]
    configs += [
      "//build/config/fuchsia:static_cpp_standard_library",
      "//build/config/fuchsia:enable_zircon_asserts",
    ]
  }

  driver_package(package_name) {
    deps = [ ":${driver_target}" ]

    drivers = [
      {
        name = "${target_name}.so"
      },
    ]

    libraries = []
    if (defined(invoker.gdc_config_files)) {
      foreach(config_file, invoker.gdc_config_files) {
        libraries += [
          {
            source =
                rebase_path("//prebuilt/camera/arm/gdc/configs/" + config_file)
            name = "firmware/" + config_file
          },
        ]
      }
    }
    if (defined(invoker.watermark_files)) {
      foreach(watermark_file, invoker.watermark_files) {
        libraries += [
          {
            source =
                rebase_path("//prebuilt/camera/watermark/" + watermark_file)
            name = "firmware/" + watermark_file
          },
        ]
      }
    }
  }
}
