1# Defines compiled_action(). 2# 3# compiled_action() is like action(), except that it runs a built binary 4# instead of a script. 5# 6# Parameters: 7# 8# tool (required) 9# [label] Label of the tool to run. This should be an executable, and 10# this label should not include a toolchain (anything in parens). This 11# tool will be built for the host. 12# 13# outputs (required) 14# [list of files] Same meaning as for action(). 15# 16# args (required) 17# [list of strings] Flags to pass to the built binary. Almost identical 18# to action()'s `args`, except that `tool` is implicitly added as first 19# element. 20# 21# depfile 22# inputs 23# public_configs 24# visibility (all optional) 25# Same meaning as for action(). 26# 27# Example use: 28# 29# compiled_action("run_my_tool") { 30# tool = "//tools/something:mytool" 31# inputs = [ "my_input_file.txt" ] 32# outputs = [ "$target_gen_dir/mysource.inc" ] 33# args = [ 34# rebase_path(inputs[0], root_build_dir), 35# rebase_path(outputs[0], root_build_dir), 36# ] 37# } 38# 39# You would typically declare your tool like this: 40# if (host_toolchain == current_toolchain) { 41# executable("mytool") { 42# ... 43# } 44# } 45# The if statement around the executable is optional. It means "I only care 46# about this target in the host toolchain". Usually this is what you want, and 47# saves unnecessarily compiling your tool for the target platform. If you 48# need a target build of your tool as well, omit the if statement. 49 50template("compiled_action") { 51 assert(defined(invoker.args), "must set 'args' in $target_name") 52 assert(defined(invoker.outputs), "must set 'outputs' in $target_name") 53 assert(defined(invoker.tool), "must set 'tool' in $target_name") 54 assert(!defined(invoker.sources), 55 "use 'inputs' instead of 'sources' in $target_name") 56 57 action(target_name) { 58 forward_variables_from(invoker, 59 [ 60 "depfile", 61 "inputs", 62 "outputs", 63 "public_configs", 64 "visibility", 65 ]) 66 host_tool = invoker.tool + "($host_toolchain)" 67 host_executable = get_label_info(host_tool, "root_out_dir") + "/bin/" + 68 get_label_info(host_tool, "name") 69 deps = [ host_tool ] 70 script = "//llvm/utils/gn/build/run_built_binary.py" 71 args = [ rebase_path(host_executable, root_build_dir) ] + invoker.args 72 } 73} 74