# Copyright (c) 2020 Project CHIP 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
#
# http://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/build.gni")
import("//build_overrides/chip.gni")
import("//build_overrides/cyw30739_sdk.gni")

import("${build_root}/toolchain/flashable_executable.gni")
import("${cyw30739_sdk_build_root}/cyw30739_sdk.gni")

template("cyw30739_executable") {
  if (!defined(invoker.output_dir)) {
    invoker.output_dir = root_out_dir
  }

  output_base_name = get_path_info(invoker.output_name, "name")
  ldscript_file = "${root_build_dir}/${output_base_name}.ld"
  flashable_target = "${target_name}.flashable"
  pre_build_target = "${target_name}.pre_build"
  post_build_target = "${target_name}.post_build"
  ota_image_target = "${target_name}.ota_image"

  cyw30739_sdk_pre_build(pre_build_target) {
  }

  cyw30739_sdk_post_build(post_build_target) {
    executable_target = "${flashable_target}.executable"
  }

  cyw30739_sdk_ota_image(ota_image_target) {
    deps = [ ":${post_build_target}" ]
  }

  group(target_name) {
    deps = [ ":${flashable_target}" ]

    if (chip_enable_ota_requestor) {
      deps += [ ":${ota_image_target}" ]
    } else {
      deps += [ ":${post_build_target}" ]
    }
  }

  # Copy flashing dependencies to the output directory so that the output
  # is collectively self-contained; this allows flashing to work reliably
  # even if the build and flashing steps take place on different machines
  # or in different containers.

  flashing_runtime_target = target_name + ".flashing_runtime"
  flashing_script_inputs = [
    "${chip_root}/scripts/flashing/cyw30739_firmware_utils.py",
    "${chip_root}/scripts/flashing/firmware_utils.py",
  ]
  copy(flashing_runtime_target) {
    sources = flashing_script_inputs
    outputs = [ "${root_out_dir}/{{source_file_part}}" ]
  }

  flashing_script_generator =
      "${chip_root}/scripts/flashing/gen_flashing_script.py"
  flashing_script_name = output_base_name + ".flash.py"
  flashing_options = [
    "cyw30739",
    "--sdk-scripts-dir",
    rebase_path(invoker.cyw30739_sdk_scripts_dir),
    "--sdk-tools-dir",
    rebase_path(invoker.cyw30739_sdk_tools_dir),
  ]

  flashable_executable(flashable_target) {
    forward_variables_from(invoker, "*")
    data_deps = [ ":${flashing_runtime_target}" ]

    deps += [ ":${pre_build_target}" ]

    inputs = [ ldscript_file ]

    ldflags = [ "-T" + rebase_path(ldscript_file, root_build_dir) ]
  }
}
