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

# Convert a binary to a target format using objcopy.

template("objcopy_convert") {
  forward_variables_from(invoker,
                         [
                           "conversion_input",
                           "conversion_output",
                           "conversion_target_format",
                           "deps",
                           "objcopy",
                         ])

  action(target_name) {
    inputs = [ conversion_input ]
    outputs = [ conversion_output ]

    args = [
      objcopy,
      "-O",
      conversion_target_format,
      rebase_path(conversion_input, root_build_dir),
      rebase_path(conversion_output, root_build_dir),
    ]
    script = "${build_root}/gn_run_binary.py"
  }
}

# Build a script to perform a device flashing operation.
#
# This requires a Python script, given by flashing_script_generator,
# to construct the resulting flashing script, given by flashing_script_name.
#
# As used by flashable_executable(), the generator script requires two options,
#   --output SCRIPT       - The generated script
#   --application IMAGE   - The file to be flashed
# plus any platform- or target-specific options as passed in by
# flashable_executable()'s flashing_options.

template("gen_flashing_script") {
  forward_variables_from(invoker,
                         [
                           "flashing_script_generator",
                           "flashing_script_name",
                           "flashing_options",
                           "deps",
                           "data_deps",
                         ])

  action(target_name) {
    outputs = [ flashing_script_name ]

    args = flashing_options
    args += [
      "--output",
      rebase_path(flashing_script_name, root_build_dir),
    ]

    script = flashing_script_generator
  }
}

# Build target for an executable, optionally converted to the preferred form
# for flashing, plus a script that performs the flashing operation.
#
# The intent is that every flashable (or testable) build target in CHIP will
# ultimately be flashable/runnable in a consistent way.

template("flashable_executable") {
  executable_target = "$target_name.executable"

  if (defined(invoker.flashing_script_name)) {
    # Generating the flashing script is the final target.
    final_target = "$target_name.flashing"
  } else if (defined(invoker.objcopy_image_name)) {
    # Converted image is the final target.
    final_target = "$target_name.image"
  } else {
    # The executable is the final target.
    final_target = executable_target
  }
  group(target_name) {
    data_deps = [ ":$final_target" ]

    if (defined(invoker.data_deps)) {
      data_deps += invoker.data_deps
    }

    write_runtime_deps = "${root_out_dir}/${target_name}.flashbundle.txt"
  }

  if (defined(invoker.objcopy_image_name)) {
    # Executable target must be converted for flashing.
    assert(defined(invoker.objcopy_image_format))
    assert(defined(invoker.objcopy))

    image_target = "$target_name.image"
    image_name = invoker.objcopy_image_name
    image_format = invoker.objcopy_image_format
    objcopy = invoker.objcopy

    objcopy_convert(image_target) {
      conversion_input = "${root_out_dir}/${invoker.output_name}"
      conversion_output = "${root_out_dir}/${image_name}"
      conversion_target_format = image_format
      deps = [ ":$executable_target" ]
    }
  }

  if (defined(invoker.flashing_script_name)) {
    if (!defined(image_target)) {
      # The executable can be flashed directly.
      image_target = executable_target
      image_name = invoker.output_name
    }

    gen_flashing_script("$target_name.flashing") {
      flashing_script_generator = invoker.flashing_script_generator
      flashing_script_name = "$root_out_dir/${invoker.flashing_script_name}"
      if (defined(invoker.flashing_options)) {
        flashing_options = invoker.flashing_options
      } else {
        flashing_options = []
      }
      flashing_options += [
        "--application",
        rebase_path(image_name, root_out_dir, root_out_dir),
      ]
      data_deps = [ ":$image_target" ]
    }
  }

  executable(executable_target) {
    forward_variables_from(invoker, "*")
  }
}
