# 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("silabs_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",
    ]
  }
}
