# 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/config.gni")
import("//build/package.gni")
import("//build/test.gni")
import("//build/test/test_package.gni")
import("//src/camera/tests.gni")

group("camera") {
  testonly = true
  deps = [
    ":tools",
    "bin",
    "drivers",
    "lib",
  ]
}

group("drivers") {
  deps = [
    "drivers/bus/aml_mipicsi:aml_mipicsi_driver",
    "drivers/hw_accel/gdc:driver",
    "drivers/hw_accel/ge2d:ge2d-driver",
    "drivers/sensors/imx227:driver",
    "drivers/usb_video:usb_video_driver",
  ]
}

group("service") {
  public_deps = [
    "//src/camera/bin/device",
    "//src/camera/bin/device_watcher",
  ]
}

# Add targets here that are useful for general development.
group("tools") {
  testonly = true
  public_deps = [ "//src/camera/bin/benchmark" ]
}

group("factory-tools") {
  deps = [
    "//src/camera/bin/factory:camera-factory",
    "//src/camera/bin/factory_cli:camera-factory-cli",
  ]
}

config_data("camera_factory_config") {
  for_pkg = "sysmgr"
  sources = [ "//src/camera/bin/factory/camera-factory.config" ]
}

group("tests") {
  testonly = true

  # Build dependencies should be captured in the "camera_tests.deps" list referenced below.
  # Cross-package dependencies must be included in this target due to transitively included
  # packages being ignored. See fxbug.dev/44251 for details.
  deps = [
    ":camera_tests",
    "bin",
    "drivers:bind_tests",
    "lib:tests",
  ]
}

test_package("camera_tests") {
  deps = camera_tests.deps
  tests = camera_tests.tests
}
