# Copyright (C) 2019 The Android Open Source Project
#
# 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("perfetto.gni")

# A template to make host tools handier. The main problem it solves is that when
# building host toolchain tools on an Android build, the executables end up in
# out/xxx/gcc_like_host, which is an inconvenient location. Our developers
# (and also some of our scripts) expect them to live in out/xxx/.
# This template takes care takes care of building the target only on the host
# toolchain and copy it over in the root build directory.
template("perfetto_host_executable") {
  if (current_toolchain == host_toolchain) {
    executable(target_name) {
      forward_variables_from(invoker, "*")
    }
  } else {
    not_needed(invoker, "*", [ "testonly" ])
    _host_target = ":$target_name($host_toolchain)"
    _testonly = defined(invoker.testonly) && invoker.testonly
    if ((perfetto_build_with_embedder && !build_with_chromium) ||
        is_perfetto_build_generator) {
      # Don't copy anything in V8 and other GN embedder builds, just add a
      # dependency to the host target. This causes problems on some bots.
      # (See crbug.com/1002599).
      group(target_name) {
        testonly = _testonly
        deps = [
          _host_target,
        ]
      }
    } else {
      copy(target_name) {
        testonly = _testonly
        deps = [
          _host_target,
        ]
        _host_out_dir = get_label_info(_host_target, "root_out_dir")
        _extension = ""
        if (host_os == "win") {
          _extension = ".exe"
        }
        sources = [
          "$_host_out_dir/$target_name${_extension}",
        ]
        outputs = [
          "$root_out_dir/$target_name${_extension}",
        ]
      }
    }
  }
}
