# 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"

  cyw30739_sdk_pre_build(pre_build_target) {
  }

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

  group(target_name) {
    deps = [
      ":${flashable_target}",
      ":${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) ]
  }
}
