# Copyright 2020 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("$dir_pw_build/exec.gni")

# Preprocess a linker script and turn it into a target.
#
# Note: to use this template, pw_cc_command must be specified in your target's
# config. It should match the name of the C compiler your target uses (e.g.
# arm-none-eabi-gcc).
#
# In lieu of direct GN support for linker scripts, this template makes it
# possible to run the C Preprocessor on a linker script file so defines can
# be properly evaluated before the linker script is passed to the dir_pw_build
#
# TODO(pwbug/53): This template serves as a stand-in until native GN support for
# linker scripts is added.
#
# Args:
#  linker_script: The linker script to send through the C preprocessor.
#
#  defines: Preprocessor defines to apply when running the C preprocessor.
#
#  cflags: Flags to pass to the C compiler.
#
#  inputs: Files that, when changed, should trigger a re-build of the linker
#    script. linker_script is implicitly added to this by the template.
#
# Example:
#
#   pw_linker_script("generic_linker_script") {
#     defines = [
#       "PW_HEAP_SIZE=1K",
#       "PW_NOINIT_SIZE=512"
#     ]
#     linker_script = "basic_script.ld"
#   }
#
template("pw_linker_script") {
  assert(
      defined(pw_cc_command) && pw_cc_command != "",
      "pw_cc_command has not been properly configured. This variable must be " +
          "defined to enable linker script preprocessing.")

  assert(
      defined(invoker.linker_script) && invoker.linker_script != "",
      "$target_name did not set `linker_script` to refer to a valid linker " +
          "script. This variable is required for linker script targets.")

  _final_linker_script = "${target_gen_dir}/${target_name}_final.ld"

  # This action invokes the C compiler provided by the target to preprocess the
  # linker script.
  pw_exec("${target_name}_preprocess") {
    program = pw_cc_command
    inputs = [
      invoker.linker_script,
    ]
    args = [
      # Run compiler in preprocessor-only mode.
      "-E",

      # Do not generate linemarkers in output.
      "-P",

      # Do not discard comments.
      "-C",

      # Treat the following file as a C file.
      "-x",
      "c",
      get_path_info(invoker.linker_script, "abspath"),
    ]

    # Include any explicitly listed c flags.
    if (defined(invoker.cflags)) {
      args += cflags
    }

    # Add defines.
    if (defined(invoker.defines)) {
      args += process_file_template(invoker.defines, "-D{{source_name_part}}")
    }

    # Set output file.
    args += [
      "-o",
      _final_linker_script,
    ]
    outputs = [
      _final_linker_script,
    ]
  }

  # This config adds a the linker script produced by the preprocess action to
  # the linker flags.
  config("${target_name}_config") {
    inputs = [
      invoker.linker_script,
    ]
    if (!defined(invoker.ldflags)) {
      ldflags = []
    }
    ldflags += [ "-T" + rebase_path(_final_linker_script) ]
  }

  # The target that adds the linker script config to this library and everything
  # that depends on it.
  source_set(target_name) {
    inputs = [
      _final_linker_script,
    ]
    if (defined(invoker.inputs)) {
      inputs += invoker.inputs
    }
    all_dependent_configs = [ ":${target_name}_config" ]
    deps = [
      ":${target_name}_preprocess",
    ]
  }
}
