# Copyright 2022 The Pigweed 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
#
#     https://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/pigweed.gni")

import("$dir_pw_build/exec.gni")

# Executable wrapper that allows the 2nd stage bootloader to strip link deps.
template("pico_executable") {
  if (defined(invoker.is_boot_stage2) && invoker.is_boot_stage2) {
    executable(target_name) {
      forward_variables_from(invoker, "*")

      # Link deps pulls in Pigweed things that don't fit in the 2nd stage
      # bootloader.
      deps -= [ "$dir_pw_build:link_deps" ]
    }
  } else {
    _uf2_name = "${target_name}.uf2"
    _elf_name = "${target_name}.elf"
    executable(_elf_name) {
      forward_variables_from(invoker, "*")
    }

    pw_exec(_uf2_name) {
      _elf2uf2_target = "$dir_pw_third_party/pico_sdk/src:elf2uf2($dir_pigweed/targets/host:host_clang_debug)"
      _uf2_out_path = "${target_out_dir}/${_uf2_name}"
      deps = [
        ":${_elf_name}",
        _elf2uf2_target,
      ]
      program = "<TARGET_FILE(${_elf2uf2_target})>"
      args = [
        "<TARGET_FILE(:${_elf_name})>",
        rebase_path(_uf2_out_path, root_build_dir),
      ]
      outputs = [ _uf2_out_path ]
    }
    group(target_name) {
      deps = [ ":${_uf2_name}" ]
    }
  }
}
