| # Copyright 2017 The Fuchsia Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| declare_args() { |
| # This is the directory where host tools intended for manual use by |
| # developers get installed. It's something a developer might put |
| # into their shell's $PATH. Host tools that are just needed as part |
| # of the build do not get copied here. This directory is only for |
| # things that are generally useful for testing or debugging or |
| # whatnot outside of the GN build itself. These are only installed |
| # by an explicit install_host_tools() rule (see //build/host.gni). |
| host_tools_dir = "$root_build_dir/host-tools" |
| } |
| |
| # This declares that a host tool (a target built in host_toolchain) |
| # should be installed in host_tools_dir. This target can be used in |
| # any toolchain, and it will forward to host_toolchain. |
| # |
| # Parameters |
| # |
| # outputs (required) |
| # [files list] Simple file name of each tool, should be the |
| # same as the output_name in the executable() or similar rule |
| # (which is usually just that target's name). |
| # |
| # deps (recommended) |
| # [label list] Should list each target that actually builds each output. |
| # It does not need to use explicit toolchain suffixes; the only target |
| # using the deps will be instantiated only in host_toolchain. |
| # |
| # testonly (optional) |
| # visibility (optional) |
| # Standard GN meaning. |
| # |
| # Example of usage: |
| # |
| # executable("frob") { ... } |
| # install_host_tools("fiddlers") { |
| # deps = [ ":frob", "//some/other/dir:twiddle" ] |
| # outputs = [ "frob", "twiddle" ] |
| # } |
| template("install_host_tools") { |
| assert(defined(invoker.outputs), "install_host_tools() must define outputs") |
| |
| # There is more than one host_toolchain when variants are involved, |
| # but all those copy their executables to the base host_toolchain |
| # (which toolchain_variant.base points to in every host_toolchain). |
| if (current_toolchain == host_toolchain && |
| current_toolchain == toolchain_variant.base) { |
| copy(target_name) { |
| forward_variables_from(invoker, |
| [ |
| "deps", |
| "testonly", |
| "visibility", |
| ]) |
| if (defined(visibility)) { |
| visibility += [ ":$target_name" ] |
| } |
| outputs = [ |
| "$host_tools_dir/{{source_file_part}}", |
| ] |
| sources = [] |
| foreach(output_name, invoker.outputs) { |
| sources += [ "$root_out_dir/$output_name" ] |
| } |
| } |
| } else { |
| # Redirect to the base host_toolchain, where the copy rule above is. |
| # In a variant host_toolchain context, toolchain_variant.base points |
| # there, while host_toolchain always matches current_toolchain. |
| group(target_name) { |
| if (current_toolchain == host_toolchain) { |
| toolchain = toolchain_variant.base |
| } else { |
| toolchain = host_toolchain |
| } |
| deps = [ |
| ":$target_name($toolchain)", |
| ] |
| forward_variables_from(invoker, |
| [ |
| "testonly", |
| "visibility", |
| ]) |
| not_needed(invoker, |
| [ |
| "deps", |
| "outputs", |
| ]) |
| } |
| } |
| } |