# 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/pi_pico.gni")
import("//build_overrides/pigweed.gni")

import("$dir_pw_build/exec.gni")
import("$dir_pw_build/python_action.gni")
import("$dir_pw_build/target_types.gni")

# TODO(amontanez): This can go away if the GN build can be upstreamed to the
# Pi Pico repo.
_CWD = "${PICO_SRC_DIR}/src/rp2_common/boot_stage2"

config("public_include_dirs") {
  include_dirs = [
    "${_CWD}/include",
    "${_CWD}/asminclude",
  ]
}

pw_executable("boot_stage2_elf") {
  _linker_script_path = rebase_path("${_CWD}/boot_stage2.ld", root_build_dir)

  # Compile as position-independent.
  cflags = [ "-fPIC" ]
  asmflags = cflags

  ldflags = cflags
  ldflags += [
    "-T${_linker_script_path}",
    "-nostartfiles",

    # Unfortunately, this is not properly applied to compiler flags thanks to
    # `default_configs`.
    "-Wl,--no-gc-sections",
  ]

  public_configs = [ ":public_include_dirs" ]

  # The upstream boot_stage2.ld doesn't specify the binary entry point or
  # mark the required sections as KEEP(), so they're optimized out with
  # Pigweed's aggressive default optimizations.
  remove_configs = [
    "$dir_pw_build:reduced_size",
    "$dir_pw_build:strict_warnings",
  ]
  is_boot_stage2 = true

  public = [ "${_CWD}/include/boot_stage2/config.h" ]

  deps = [ "${PICO_ROOT}/src/common/pico_base" ]

  # The correct assembly file is pulled in by compile_time_choice.S.
  inputs = [
    "${_CWD}/boot_stage2.ld",
    "${_CWD}/boot2_at25sf128a.S",
    "${_CWD}/boot2_generic_03h.S",
    "${_CWD}/boot2_is25lp080.S",
    "${_CWD}/boot2_usb_blinky.S",
    "${_CWD}/boot2_w25q080.S",
    "${_CWD}/boot2_w25x10cl.S",
  ]
  sources = [ "${_CWD}/compile_time_choice.S" ]
}

pw_exec("boot_stage2_bin") {
  _out_bin = "${target_out_dir}/boot_stage2.bin"
  program = "arm-none-eabi-objcopy"
  args = [
    "-Obinary",
    "<TARGET_FILE(:boot_stage2_elf)>",
    rebase_path(_out_bin, root_build_dir),
  ]
  outputs = [ _out_bin ]
  deps = [ ":boot_stage2_elf" ]
}

pw_python_action("boot_stage2_padded") {
  _src_bin = get_target_outputs(":boot_stage2_bin")
  _out_asm = "${target_out_dir}/boot_stage2.S"
  script = "${_CWD}/pad_checksum"
  args = [
    "-s",
    "0xffffffff",
    rebase_path(_src_bin[0], root_build_dir),
    rebase_path(_out_asm, root_build_dir),
  ]
  outputs = [ _out_asm ]
  deps = [ ":boot_stage2_bin" ]
}

pw_source_set("boot_stage2_asm") {
  deps = [ ":boot_stage2_padded" ]
  sources = get_target_outputs(":boot_stage2_padded")
}

group("boot_stage2") {
  public_deps = [
    ":boot_stage2_asm",
    ":boot_stage2_elf",
  ]
}
