File: compiled_action.gni

package info (click to toggle)
llvm-toolchain-15 1%3A15.0.6-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,554,644 kB
  • sloc: cpp: 5,922,452; ansic: 1,012,136; asm: 674,362; python: 191,568; objc: 73,855; f90: 42,327; lisp: 31,913; pascal: 11,973; javascript: 10,144; sh: 9,421; perl: 7,447; ml: 5,527; awk: 3,523; makefile: 2,520; xml: 885; cs: 573; fortran: 567
file content (74 lines) | stat: -rw-r--r-- 2,522 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# Defines compiled_action().
#
# compiled_action() is like action(), except that it runs a built binary
# instead of a script.
#
# Parameters:
#
#   tool (required)
#       [label] Label of the tool to run. This should be an executable, and
#       this label should not include a toolchain (anything in parens). This
#       tool will be built for the host.
#
#   outputs (required)
#       [list of files] Same meaning as for action().
#
#   args (required)
#       [list of strings] Flags to pass to the built binary. Almost identical
#       to action()'s `args`, except that `tool` is implicitly added as first
#       element.
#
#   depfile
#   inputs
#   public_configs
#   visibility   (all optional)
#       Same meaning as for action().
#
# Example use:
#
#   compiled_action("run_my_tool") {
#     tool = "//tools/something:mytool"
#     inputs = [ "my_input_file.txt" ]
#     outputs = [ "$target_gen_dir/mysource.inc" ]
#     args = [
#       rebase_path(inputs[0], root_build_dir),
#       rebase_path(outputs[0], root_build_dir),
#     ]
#   }
#
# You would typically declare your tool like this:
#   if (host_toolchain == current_toolchain) {
#     executable("mytool") {
#       ...
#     }
#   }
# The if statement around the executable is optional. It means "I only care
# about this target in the host toolchain". Usually this is what you want, and
# saves unnecessarily compiling your tool for the target platform. If you
# need a target build of your tool as well, omit the if statement.

template("compiled_action") {
  assert(defined(invoker.args), "must set 'args' in $target_name")
  assert(defined(invoker.outputs), "must set 'outputs' in $target_name")
  assert(defined(invoker.tool), "must set 'tool' in $target_name")
  assert(!defined(invoker.sources),
         "use 'inputs' instead of 'sources' in $target_name")

  action(target_name) {
    forward_variables_from(invoker,
                           [
                             "depfile",
                             "inputs",
                             "outputs",
                             "public_configs",
                             "visibility",
                           ])
    host_tool = invoker.tool + "($host_toolchain)"
    host_executable = get_label_info(host_tool, "root_out_dir") +
                      "/bin/" + get_label_info(host_tool, "name")
    deps = [ host_tool ]
    script = "//llvm/utils/gn/build/run_built_binary.py"
    args = [ rebase_path(host_executable, root_build_dir) ] + invoker.args
  }
}