# Copyright 2021 The Cobalt Authors. All Rights Reserved.
#
# 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("//starboard/raspi/shared/toolchain/raspi_shared_toolchain.gni")
template("install_target") {
  installable_target_name = invoker.installable_target_name

  # TODO(b/218889313): raspi relies on install_content being adjacent to the
  # executable. In order to make tests pass we need to overload the install
  # subdir and install content subdir.
  if (invoker.type == "executable") {
    # install_subdir = "bin"
    install_subdir = installable_target_name
    source_name = installable_target_name
  } else if (invoker.type == "shared_library") {
    install_subdir = "lib"
    source_name = "lib${installable_target_name}.so"
  } else {
    assert(false, "You can only install an executable or shared library.")
  }
  output = "$sb_install_output_dir/$install_subdir/$source_name"
  input = "$root_out_dir/$source_name"

  if (is_gold || cobalt_fastbuild) {
    action(target_name) {
      forward_variables_from(invoker, [ "testonly" ])

      script = "//starboard/build/run_bash.py"

      strip_executable = gcc_toolchain_strip
      inputs = [ input ]

      deps = invoker.deps
      deps += [ invoker.installable_target_dep ]

      outputs = [ output ]

      args = [
        rebase_path(strip_executable, root_build_dir),
        "-o",
        rebase_path(outputs[0], root_build_dir),
        rebase_path(inputs[0], root_build_dir),
      ]
    }
  } else {
    copy(target_name) {
      forward_variables_from(invoker, [ "testonly" ])
      sources = [ input ]
      outputs = [ output ]
      deps = invoker.deps
      deps += [ invoker.installable_target_dep ]
    }
  }
}
