# Copyright 2021 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

import("//build_overrides/pigweed.gni")

import("$dir_pigweed/third_party/freertos/freertos.gni")
import("$dir_pigweed/third_party/nanopb/nanopb.gni")
import("$dir_pigweed/third_party/smartfusion_mss/mss.gni")
import("$dir_pigweed/third_party/stm32cube/stm32cube.gni")
import("$dir_pw_build/error.gni")
import("$dir_pw_build/facade.gni")
import("$dir_pw_build/module_config.gni")
import("$dir_pw_build/target_types.gni")
import("$dir_pw_docgen/docs.gni")
import("backend.gni")

declare_args() {
  # The build target that overrides the default configuration options for this
  # module. This should point to a source set that provides defines through a
  # public config (which may -include a file or add defines directly).
  pw_system_CONFIG = pw_build_DEFAULT_MODULE_CONFIG
}

config("public_include_path") {
  include_dirs = [ "public" ]
}

pw_source_set("config") {
  sources = [ "public/pw_system/config.h" ]
  public_configs = [ ":public_include_path" ]
  public_deps = [ pw_system_CONFIG ]
  visibility = [ "./*" ]
  friend = [ "./*" ]
}

group("pw_system") {
  public_deps = [
    ":init",
    ":io",
    ":log",
    ":rpc_server",
    ":work_queue",
  ]
  deps = [ ":target_hooks" ]
}

pw_source_set("log") {
  public_configs = [ ":public_include_path" ]
  sources = [
    "log.cc",
    "pw_system_private/log.h",
  ]
  public_deps = [
    "$dir_pw_log_rpc:log_service",
    "$dir_pw_log_rpc:rpc_log_drain_thread",
    "$dir_pw_multisink",
  ]
  deps = [
    ":config",
    ":rpc_server",
    "$dir_pw_log_rpc:rpc_log_drain",
    "$dir_pw_sync:lock_annotations",
    "$dir_pw_sync:mutex",
  ]
}

# There is no public part to this backend which does not cause circular
# dependencies, there is only the pw_build_LINK_DEPS "log_backend.impl".
pw_source_set("log_backend") {
}

pw_source_set("log_backend.impl") {
  sources = [ "log_backend.cc" ]
  deps = [
    ":config",
    ":log",
    "$dir_pw_bytes",
    "$dir_pw_chrono:system_clock",
    "$dir_pw_log:proto_utils",
    "$dir_pw_log:pw_log.facade",
    "$dir_pw_log_string:handler.facade",
    "$dir_pw_log_tokenized:metadata",
    "$dir_pw_multisink",
    "$dir_pw_result",
    "$dir_pw_string",
    "$dir_pw_sync:interrupt_spin_lock",
    "$dir_pw_sync:lock_annotations",
    "$dir_pw_tokenizer",
    "$dir_pw_tokenizer:global_handler_with_payload.facade",
  ]
}

pw_facade("rpc_server") {
  backend = pw_system_RPC_SERVER_BACKEND
  public = [ "public/pw_system/rpc_server.h" ]
  public_configs = [ ":public_include_path" ]
  public_deps = [
    ":config",
    "$dir_pw_rpc:server",
    "$dir_pw_thread:thread_core",
  ]
}

pw_facade("io") {
  backend = pw_system_IO_BACKEND
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_system/io.h" ]
  public_deps = [ "$dir_pw_stream" ]
}

pw_source_set("init") {
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_system/init.h" ]
  sources = [ "init.cc" ]
  deps = [
    ":log",
    ":rpc_server",
    ":target_hooks.facade",
    ":work_queue",
    "$dir_pw_rpc/nanopb:echo_service",
    "$dir_pw_thread:thread",
  ]
}

pw_source_set("hdlc_rpc_server") {
  sources = [ "hdlc_rpc_server.cc" ]
  deps = [
    ":config",
    ":io",
    ":rpc_server.facade",
    "$dir_pw_assert",
    "$dir_pw_hdlc:pw_rpc",
    "$dir_pw_hdlc:rpc_channel_output",
    "$dir_pw_log",
    "$dir_pw_sync:mutex",
  ]
}

pw_source_set("work_queue") {
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_system/work_queue.h" ]
  sources = [ "work_queue.cc" ]
  public_deps = [ "$dir_pw_work_queue" ]
  deps = [ ":config" ]
}

pw_source_set("sys_io_target_io") {
  sources = [ "target_io.cc" ]
  deps = [
    ":io.facade",
    "$dir_pw_stream",
    "$dir_pw_stream:sys_io_stream",
  ]
}

pw_source_set("socket_target_io") {
  sources = [ "socket_target_io.cc" ]
  deps = [
    ":config",
    ":io.facade",
    "$dir_pw_assert",
    "$dir_pw_stream",
    "$dir_pw_stream:socket_stream",
  ]
}

pw_facade("target_hooks") {
  backend = pw_system_TARGET_HOOKS_BACKEND
  public = [ "public/pw_system/target_hooks.h" ]
  public_deps = [ "$dir_pw_thread:thread" ]
  public_configs = [ ":public_include_path" ]
}

if (pw_system_TARGET_HOOKS_BACKEND == "") {
  # Do nothing, prevents errors from trying to parse pw_system_TARGET_HOOKS_BACKEND as a
  # build target when it's unset.
} else if (get_label_info(pw_system_TARGET_HOOKS_BACKEND,
                          "label_no_toolchain") ==
           get_label_info(":stl_target_hooks", "label_no_toolchain")) {
  pw_source_set("stl_target_hooks") {
    deps = [
      ":init",
      "$dir_pw_log",
      "$dir_pw_thread:sleep",
      "$dir_pw_thread:thread",
      "$dir_pw_thread_stl:thread",
    ]
    sources = [ "stl_target_hooks.cc" ]
  }
} else if (get_label_info(pw_system_TARGET_HOOKS_BACKEND,
                          "label_no_toolchain") ==
           get_label_info(":freertos_target_hooks", "label_no_toolchain")) {
  pw_source_set("freertos_target_hooks") {
    deps = [
      ":init",
      "$dir_pw_third_party/freertos",
      "$dir_pw_thread:thread",
      "$dir_pw_thread_freertos:thread",
    ]
    sources = [ "freertos_target_hooks.cc" ]
  }
}

pw_executable("system_example") {
  sources = [ "example_user_app_init.cc" ]
  deps = [
    ":pw_system",
    "$dir_pw_log",
    "$dir_pw_thread:sleep",
    "$dir_pw_unit_test:rpc_service",

    # Adds a test that the test server can run.
    "$dir_pw_status:status_test.lib",
    "$dir_pw_string:string_builder_test.lib",
  ]
}

if (dir_pw_third_party_nanopb != "") {
  group("system_examples") {
    deps = [ ":system_example($dir_pigweed/targets/host_device_simulator:host_device_simulator.speed_optimized)" ]
    if (dir_pw_third_party_stm32cube_f4 != "" &&
        dir_pw_third_party_freertos != "") {
      deps += [ ":system_example($dir_pigweed/targets/stm32f429i_disc1_stm32cube:stm32f429i_disc1_stm32cube.size_optimized)" ]
    }
    if (dir_pw_third_party_smartfusion_mss != "" &&
        dir_pw_third_party_freertos != "") {
      deps += [
        ":system_example($dir_pigweed/targets/emcraft_sf2_som:emcraft_sf2_som.size_optimized)",
        ":system_example($dir_pigweed/targets/emcraft_sf2_som:emcraft_sf2_som.speed_optimized)",
        ":system_example($dir_pigweed/targets/emcraft_sf2_som:emcraft_sf2_som_debug.debug)",
      ]
    }
  }
} else {
  pw_error("system_examples") {
    message_lines = [
      "Building the pw_system examples requires Nanopb.",
      "Nanopb can be installed by running the command below and then following the prompted setup steps:",
      "   pw package install nanopb",
    ]
  }
}

pw_doc_group("docs") {
  sources = [ "docs.rst" ]
}
