# 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) {
      if (defined(invoker.configs)) {
        configs += invoker.configs
      }
      forward_variables_from(invoker, "*", [ "configs" ])
    }
  } 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}" ]
      }
    }
  }
}
