# 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_root}/toolchain/flashable_executable.gni")

template("efr32_executable") {
  output_base_name = get_path_info(invoker.output_name, "name")

  objcopy_image_name = output_base_name + ".s37"
  objcopy_image_format = "srec"
  objcopy = "arm-none-eabi-objcopy"

  # 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/efr32_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 = [ "efr32" ]

  flash_target_name = target_name + ".flash_executable"
  flashbundle_name = "${target_name}.flashbundle.txt"
  flashable_executable(flash_target_name) {
    forward_variables_from(invoker, "*")
    data_deps = [ ":${flashing_runtime_target}" ]
  }

  # Add a target which generates the hex file in addition to s37.
  executable_target = "$flash_target_name.executable"
  hex_image_name = output_base_name + ".hex"
  hex_target_name = target_name + ".hex"
  objcopy_convert(hex_target_name) {
    conversion_input = "${root_out_dir}/${invoker.output_name}"
    conversion_output = "${root_out_dir}/${hex_image_name}"
    conversion_target_format = "ihex"
    deps = [ ":$executable_target" ]
  }

  group(target_name) {
    deps = [
      ":$flash_target_name",
      ":$hex_target_name",
    ]
  }
}
