# 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/component/config.gni")
import("//build/package.gni")
import("//build/rust/rustc_binary.gni")
import("//build/rust/rustc_library.gni")
import("//build/test/test_package.gni")
import("//build/testing/environments.gni")
import("//src/sys/build/components.gni")

template("component_manager") {
  deps = [
    "//garnet/lib/rust/files_async",
    "//garnet/lib/rust/io_util",
    "//sdk/fidl/fuchsia.boot:fuchsia.boot-rustc",
    "//sdk/fidl/fuchsia.component:fuchsia.component-rustc",
    "//sdk/fidl/fuchsia.component.internal:fuchsia.component.internal-rustc",
    "//sdk/fidl/fuchsia.component.runner:fuchsia.component.runner-rustc",
    "//sdk/fidl/fuchsia.data:fuchsia.data-rustc",
    "//sdk/fidl/fuchsia.io:fuchsia.io-rustc",
    "//sdk/fidl/fuchsia.io2:fuchsia.io2-rustc",
    "//sdk/fidl/fuchsia.kernel:fuchsia.kernel-rustc",
    "//sdk/fidl/fuchsia.logger:fuchsia.logger-rustc",
    "//sdk/fidl/fuchsia.process:fuchsia.process-rustc",
    "//sdk/fidl/fuchsia.process.lifecycle:fuchsia.process.lifecycle-rustc",
    "//sdk/fidl/fuchsia.sys:fuchsia.sys-rustc",
    "//sdk/fidl/fuchsia.sys2:fuchsia.sys2-rustc",
    "//sdk/fidl/fuchsia.sys2:fuchsia.sys2-rustc",
    "//sdk/fidl/fuchsia.time:fuchsia.time-rustc",
    "//src/lib/by_addr:by_addr",
    "//src/lib/error/clonable_error",
    "//src/lib/fdio/rust:fdio",
    "//src/lib/fidl/rust/fidl",
    "//src/lib/fuchsia-async",
    "//src/lib/fuchsia-component",
    "//src/lib/fuchsia-runtime",
    "//src/lib/fuchsia-url",
    "//src/lib/process_builder",
    "//src/lib/scoped_task",
    "//src/lib/storage/vfs/rust:vfs",
    "//src/lib/syslog",
    "//src/lib/trace/rust:trace",
    "//src/lib/zircon/rust:fuchsia-zircon",
    "//src/lib/zircon/rust:fuchsia-zircon-status",
    "//src/lib/zircon/rust:fuchsia-zircon-sys",
    "//src/sys/lib/cm_fidl_validator",
    "//src/sys/lib/cm_rust",
    "//src/sys/lib/cm_types",
    "//src/sys/lib/directory_broker",
    "//src/sys/lib/moniker",
    "//src/sys/lib/runner",
    "//third_party/rust_crates:anyhow",
    "//third_party/rust_crates:async-trait",
    "//third_party/rust_crates:byteorder",
    "//third_party/rust_crates:futures",
    "//third_party/rust_crates:lazy_static",
    "//third_party/rust_crates:log",
    "//third_party/rust_crates:maplit",
    "//third_party/rust_crates:matches",
    "//third_party/rust_crates:parking_lot",
    "//third_party/rust_crates:rand",
    "//third_party/rust_crates:tempfile",
    "//third_party/rust_crates:thiserror",
    "//third_party/rust_crates:url",
    "//third_party/rust_crates:void",

    # This is a 'logical' test-only dep, in that it's only used in the
    # model::testing helpers, but that module is currently included in the main
    # library (rather than being guarded with '#[cfg(test)]') to allow use in
    # separate integration test targets.
    "//garnet/examples/fidl/services:echo-rustc",
  ]
  non_rust_deps = [
    "//zircon/system/ulib/trace",
    "//zircon/system/ulib/trace-provider:trace-provider-with-fdio",
  ]
  sources = [
    "src/builtin/arguments.rs",
    "src/builtin/capability.rs",
    "src/builtin/debug_resource.rs",
    "src/builtin/hypervisor_resource.rs",
    "src/builtin/info_resource.rs",
    "src/builtin/ioport_resource.rs",
    "src/builtin/irq_resource.rs",
    "src/builtin/kernel_stats.rs",
    "src/builtin/log.rs",
    "src/builtin/mmio_resource.rs",
    "src/builtin/mod.rs",
    "src/builtin/process_launcher.rs",
    "src/builtin/root_job.rs",
    "src/builtin/root_resource.rs",
    "src/builtin/runner.rs",
    "src/builtin/smc_resource.rs",
    "src/builtin/system_controller.rs",
    "src/builtin/time.rs",
    "src/builtin/vmex_resource.rs",
    "src/builtin_environment.rs",
    "src/capability.rs",
    "src/capability_ready_notifier.rs",
    "src/channel.rs",
    "src/config.rs",
    "src/constants.rs",
    "src/elf_runner/mod.rs",
    "src/framework.rs",
    "src/fuchsia_boot_resolver.rs",
    "src/fuchsia_pkg_resolver.rs",
    "src/klog.rs",
    "src/lib.rs",
    "src/model/actions/mod.rs",
    "src/model/actions/resolve.rs",
    "src/model/actions/shutdown.rs",
    "src/model/actions/start.rs",
    "src/model/actions/stop.rs",
    "src/model/addable_directory.rs",
    "src/model/binding.rs",
    "src/model/context.rs",
    "src/model/dir_tree.rs",
    "src/model/environment.rs",
    "src/model/error.rs",
    "src/model/event_logger.rs",
    "src/model/events/dispatcher.rs",
    "src/model/events/error.rs",
    "src/model/events/event.rs",
    "src/model/events/filter.rs",
    "src/model/events/mod.rs",
    "src/model/events/registry.rs",
    "src/model/events/running_provider.rs",
    "src/model/events/serve.rs",
    "src/model/events/source.rs",
    "src/model/events/source_factory.rs",
    "src/model/events/stream.rs",
    "src/model/events/stream_provider.rs",
    "src/model/events/synthesizer.rs",
    "src/model/exposed_dir.rs",
    "src/model/hooks.rs",
    "src/model/hub.rs",
    "src/model/logging.rs",
    "src/model/mod.rs",
    "src/model/model.rs",
    "src/model/namespace.rs",
    "src/model/policy.rs",
    "src/model/realm.rs",
    "src/model/resolver.rs",
    "src/model/rights.rs",
    "src/model/routing/error.rs",
    "src/model/routing/mod.rs",
    "src/model/routing_fns.rs",
    "src/model/runner.rs",
    "src/model/storage/admin_protocol.rs",
    "src/model/storage/mod.rs",
    "src/model/testing/echo_service.rs",
    "src/model/testing/mocks.rs",
    "src/model/testing/mod.rs",
    "src/model/testing/out_dir.rs",
    "src/model/testing/routing_test_helpers.rs",
    "src/model/testing/test_helpers.rs",
    "src/model/testing/test_hook.rs",
    "src/model/walk_state.rs",
    "src/path.rs",
    "src/root_realm_stop_notifier.rs",
    "src/startup.rs",
    "src/work_scheduler/delegate.rs",
    "src/work_scheduler/dispatcher.rs",
    "src/work_scheduler/hook.rs",
    "src/work_scheduler/mod.rs",
    "src/work_scheduler/timer.rs",
    "src/work_scheduler/work_item.rs",
    "src/work_scheduler/work_scheduler.rs",
  ]

  is_test = false
  if (defined(invoker.is_test)) {
    is_test = invoker.is_test
  }

  if (is_test) {
    sources += [
      "src/model/tests/mod.rs",
      "src/model/tests/rights.rs",
      "src/model/tests/routing.rs",
      "src/model/tests/storage.rs",
      "src/model/tests/storage_admin.rs",
      "src/work_scheduler/routing_tests.rs",
    ]

    rustc_test(target_name) {
      forward_variables_from(invoker,
                             [
                               "deps",
                               "non_rust_deps",
                             ])

      edition = "2018"

      # Test-only deps. Prefer adding deps used only in tests here instead of
      # above, which has the benefit of keeping unneeded deps out of the production
      # binary and allows depending on 'testonly' targets.
      deps += [
        "//src/lib/process_builder:test-util-fidl-rustc",
        "//src/sys/lib/directory_broker",
        "//src/sys/lib/library_loader",
      ]
    }
  } else {
    rustc_library(target_name) {
      forward_variables_from(invoker,
                             [
                               "deps",
                               "non_rust_deps",
                             ])
      name = "component_manager_lib"
      edition = "2018"

      # Only for internal use.
      visibility = [
        "//src/session/*",
        "//src/sys/component_manager/*",
        "//src/sys/component_manager_for_test/*",
      ]
    }
  }
}

component_manager("lib") {
}
component_manager("component_manager_test") {
  is_test = true
}
component_manager("component_manager_boot_env_test") {
  is_test = true
}

rustc_binary("bin") {
  name = "component_manager"
  with_unit_tests = true
  edition = "2018"
  force_opt = "z"

  # Component manager must always be small (even in debug builds) since it
  # is part of the Zircon boot image.
  #
  # We use a Thin LTO, which provides a ~65% decrease in binary size, albeit at
  # the cost of a ~5x increase in compile wall time (or roughly 10 seconds on
  # a 2018-era workstation). Fat LTO provides an even smaller binary (~70%
  # decrease from no-LTO), but is single threaded, requiring ~6x more wall time
  # to build (or roughly 60 seconds on a 2018-era workstation).
  configs += [ "//build/config/lto:thinlto" ]
  configs -= [ "//build/config/lto:thinlto" ]
  configs += [ "//build/config/lto:thinlto" ]
  configs -= [ "//build/config/fuchsia:dynamic_rust_standard_library" ]

  deps = [
    ":lib",
    "//sdk/fidl/fuchsia.io:fuchsia.io-rustc",
    "//sdk/fidl/fuchsia.io2:fuchsia.io2-rustc",
    "//sdk/fidl/fuchsia.sys2:fuchsia.sys2-rustc",
    "//src/lib/fidl/rust/fidl",
    "//src/lib/fuchsia-async",
    "//src/lib/fuchsia-runtime",
    "//src/lib/storage/pseudo-fs",
    "//src/lib/trace/rust:trace-provider",
    "//src/lib/zircon/rust:fuchsia-zircon",
    "//third_party/rust_crates:anyhow",
    "//third_party/rust_crates:futures",
    "//third_party/rust_crates:log",
    "//third_party/rust_crates:thiserror",
  ]

  sources = [ "src/main.rs" ]
}

# Note that this package and the component it contains wrap component_manager
# as a v1 Component for interactive testing purposes through the shell. This
# will eventually go away.
fuchsia_component("component-manager-cmp") {
  deps = [
    ":bin",
    ":component_manager_appmgr_config",
    ":component_manager_debug_config",
  ]
  component_name = "component_manager"
  manifest = "meta/component_manager.cmx"
}

# This component is identical to `component-manager-cmp`, except the manifest
# includes the arguments to point component_manager at the bundled config file
fuchsia_component("component-manager-for-examples-cmp") {
  deps = [
    ":bin",
    ":component_manager_for_examples_config",
  ]
  component_name = "component_manager_for_examples"
  manifest = "meta/component_manager_for_examples.cmx"
}

fuchsia_package("component-manager") {
  deps = [ ":component-manager-cmp" ]
}

fuchsia_component("component-manager-tests-cmp") {
  testonly = true
  deps = [
    ":component_manager_debug_config",
    ":component_manager_test",
    "//src/lib/process_builder:test_util",
  ]
  component_name = "component_manager_tests"
  manifest = "meta/component_manager_tests.cmx"
}

resource("component_manager_tests_invalid_manifest") {
  sources = [ "meta/component_manager_tests_invalid.cm" ]
  outputs = [ "meta/{{source_file_part}}" ]
}

fuchsia_component("component-manager-boot-env-tests-cmp") {
  testonly = true
  deps = [
    ":component_manager_boot_env_test",
    ":component_manager_debug_config",
    "//src/lib/process_builder:root_job_test_runner",
    "//src/lib/process_builder:test_util",
  ]
  component_name = "component_manager_boot_env_tests"
  manifest = "meta/component_manager_boot_env_tests.cmx"
}

fuchsia_test_package("component-manager-tests") {
  test_components = [
    ":component-manager-tests-cmp",
    ":component-manager-boot-env-tests-cmp",
  ]
  deps = [
    ":component_manager_tests_invalid_manifest",
    "src/elf_runner/tests:run-indefinitely",
    "//examples/components/basic:hello-world",
    "//examples/components/basic:lifecycle-full",
    "//garnet/examples/fidl/echo_server_rust:echo-server-rust-cmp",
  ]
}

group("tests") {
  testonly = true

  deps = [
    ":component-manager",
    ":component-manager-tests",
    "src/elf_runner/tests",
    "stress_tests",
    "testing:test-utils-unittests",
    "tests",
  ]
}

group("bootfs") {
  deps = [
    ":bin",
    "//src/sys/startup:bootfs",
  ]
}

component_config("component_manager_appmgr_config") {
  sources = [ "configs/appmgr_config.json" ]
}

component_config("component_manager_debug_config") {
  sources = [ "configs/debug_config.json" ]
}

component_config("component_manager_bootfs_config") {
  sources = [
    "//src/security/policy/component_manager_policy.json",
    "configs/bootfs_config.json",
  ]
  dest = "config/component_manager"
}

component_config("component_manager_for_examples_config") {
  sources = [ "configs/for_examples_config.json" ]
  dest = "data/component_manager_config"
}
