1*6777b538SAndroid Build Coastguard Worker# Copyright 2014 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker# This file introduces two related templates that act like action and 6*6777b538SAndroid Build Coastguard Worker# action_foreach but instead of running a Python script, it will compile a 7*6777b538SAndroid Build Coastguard Worker# given tool in the host toolchain and run that (either once or over the list 8*6777b538SAndroid Build Coastguard Worker# of inputs, depending on the variant). 9*6777b538SAndroid Build Coastguard Worker# 10*6777b538SAndroid Build Coastguard Worker# Parameters 11*6777b538SAndroid Build Coastguard Worker# 12*6777b538SAndroid Build Coastguard Worker# tool (required) 13*6777b538SAndroid Build Coastguard Worker# [label] Label of the tool to run. This should be an executable, and 14*6777b538SAndroid Build Coastguard Worker# this label should not include a toolchain (anything in parens). The 15*6777b538SAndroid Build Coastguard Worker# host compile of this tool will be used. 16*6777b538SAndroid Build Coastguard Worker# 17*6777b538SAndroid Build Coastguard Worker# outputs (required) 18*6777b538SAndroid Build Coastguard Worker# [list of files] Like the outputs of action (if using "compiled_action", 19*6777b538SAndroid Build Coastguard Worker# this would be just the list of outputs), or action_foreach (if using 20*6777b538SAndroid Build Coastguard Worker# "compiled_action_foreach", this would contain source expansions mapping 21*6777b538SAndroid Build Coastguard Worker# input to output files). 22*6777b538SAndroid Build Coastguard Worker# 23*6777b538SAndroid Build Coastguard Worker# args (required) 24*6777b538SAndroid Build Coastguard Worker# [list of strings] Same meaning as action/action_foreach. 25*6777b538SAndroid Build Coastguard Worker# 26*6777b538SAndroid Build Coastguard Worker# inputs (optional) 27*6777b538SAndroid Build Coastguard Worker# Files the binary takes as input. The step will be re-run whenever any 28*6777b538SAndroid Build Coastguard Worker# of these change. If inputs is empty, the step will run only when the 29*6777b538SAndroid Build Coastguard Worker# binary itself changes. 30*6777b538SAndroid Build Coastguard Worker# 31*6777b538SAndroid Build Coastguard Worker# depfile 32*6777b538SAndroid Build Coastguard Worker# deps 33*6777b538SAndroid Build Coastguard Worker# visibility (all optional) 34*6777b538SAndroid Build Coastguard Worker# Same meaning as action/action_foreach. 35*6777b538SAndroid Build Coastguard Worker# 36*6777b538SAndroid Build Coastguard Worker# 37*6777b538SAndroid Build Coastguard Worker# Example of usage: 38*6777b538SAndroid Build Coastguard Worker# 39*6777b538SAndroid Build Coastguard Worker# compiled_action("run_my_tool") { 40*6777b538SAndroid Build Coastguard Worker# tool = "//tools/something:mytool" 41*6777b538SAndroid Build Coastguard Worker# outputs = [ 42*6777b538SAndroid Build Coastguard Worker# "$target_gen_dir/mysource.cc", 43*6777b538SAndroid Build Coastguard Worker# "$target_gen_dir/mysource.h", 44*6777b538SAndroid Build Coastguard Worker# ] 45*6777b538SAndroid Build Coastguard Worker# 46*6777b538SAndroid Build Coastguard Worker# # The tool takes this input. 47*6777b538SAndroid Build Coastguard Worker# inputs = [ "my_input_file.idl" ] 48*6777b538SAndroid Build Coastguard Worker# 49*6777b538SAndroid Build Coastguard Worker# # In this case, the tool takes as arguments the input file and the output 50*6777b538SAndroid Build Coastguard Worker# # build dir (both relative to the "cd" that the script will be run in) 51*6777b538SAndroid Build Coastguard Worker# # and will produce the output files listed above. 52*6777b538SAndroid Build Coastguard Worker# args = [ 53*6777b538SAndroid Build Coastguard Worker# rebase_path("my_input_file.idl", root_build_dir), 54*6777b538SAndroid Build Coastguard Worker# "--output-dir", rebase_path(target_gen_dir, root_build_dir), 55*6777b538SAndroid Build Coastguard Worker# ] 56*6777b538SAndroid Build Coastguard Worker# } 57*6777b538SAndroid Build Coastguard Worker# 58*6777b538SAndroid Build Coastguard Worker# You would typically declare your tool like this: 59*6777b538SAndroid Build Coastguard Worker# if (host_toolchain == current_toolchain) { 60*6777b538SAndroid Build Coastguard Worker# executable("mytool") { 61*6777b538SAndroid Build Coastguard Worker# ... 62*6777b538SAndroid Build Coastguard Worker# } 63*6777b538SAndroid Build Coastguard Worker# } 64*6777b538SAndroid Build Coastguard Worker# The if statement around the executable is optional. That says "I only care 65*6777b538SAndroid Build Coastguard Worker# about this target in the host toolchain". Usually this is what you want, and 66*6777b538SAndroid Build Coastguard Worker# saves unnecessarily compiling your tool for the target platform. But if you 67*6777b538SAndroid Build Coastguard Worker# need a target build of your tool as well, just leave off the if statement. 68*6777b538SAndroid Build Coastguard Worker 69*6777b538SAndroid Build Coastguard Workerif (host_os == "win") { 70*6777b538SAndroid Build Coastguard Worker _host_executable_suffix = ".exe" 71*6777b538SAndroid Build Coastguard Worker} else { 72*6777b538SAndroid Build Coastguard Worker _host_executable_suffix = "" 73*6777b538SAndroid Build Coastguard Worker} 74*6777b538SAndroid Build Coastguard Worker 75*6777b538SAndroid Build Coastguard Workertemplate("compiled_action") { 76*6777b538SAndroid Build Coastguard Worker assert(defined(invoker.tool), "tool must be defined for $target_name") 77*6777b538SAndroid Build Coastguard Worker assert(defined(invoker.outputs), "outputs must be defined for $target_name") 78*6777b538SAndroid Build Coastguard Worker assert(defined(invoker.args), "args must be defined for $target_name") 79*6777b538SAndroid Build Coastguard Worker 80*6777b538SAndroid Build Coastguard Worker assert(!defined(invoker.sources), 81*6777b538SAndroid Build Coastguard Worker "compiled_action doesn't take a sources arg. Use inputs instead.") 82*6777b538SAndroid Build Coastguard Worker 83*6777b538SAndroid Build Coastguard Worker action(target_name) { 84*6777b538SAndroid Build Coastguard Worker forward_variables_from(invoker, 85*6777b538SAndroid Build Coastguard Worker [ 86*6777b538SAndroid Build Coastguard Worker "data_deps", 87*6777b538SAndroid Build Coastguard Worker "deps", 88*6777b538SAndroid Build Coastguard Worker "depfile", 89*6777b538SAndroid Build Coastguard Worker "inputs", 90*6777b538SAndroid Build Coastguard Worker "outputs", 91*6777b538SAndroid Build Coastguard Worker "testonly", 92*6777b538SAndroid Build Coastguard Worker "visibility", 93*6777b538SAndroid Build Coastguard Worker ]) 94*6777b538SAndroid Build Coastguard Worker if (!defined(deps)) { 95*6777b538SAndroid Build Coastguard Worker deps = [] 96*6777b538SAndroid Build Coastguard Worker } 97*6777b538SAndroid Build Coastguard Worker if (!defined(inputs)) { 98*6777b538SAndroid Build Coastguard Worker inputs = [] 99*6777b538SAndroid Build Coastguard Worker } 100*6777b538SAndroid Build Coastguard Worker 101*6777b538SAndroid Build Coastguard Worker script = "//build/gn_run_binary.py" 102*6777b538SAndroid Build Coastguard Worker 103*6777b538SAndroid Build Coastguard Worker # Constuct the host toolchain version of the tool. 104*6777b538SAndroid Build Coastguard Worker host_tool = invoker.tool + "($host_toolchain)" 105*6777b538SAndroid Build Coastguard Worker 106*6777b538SAndroid Build Coastguard Worker # Get the path to the executable. Currently, this assumes that the tool 107*6777b538SAndroid Build Coastguard Worker # does not specify output_name so that the target name is the name to use. 108*6777b538SAndroid Build Coastguard Worker # If that's not the case, we'll need another argument to the script to 109*6777b538SAndroid Build Coastguard Worker # specify this, since we can't know what the output name is (it might be in 110*6777b538SAndroid Build Coastguard Worker # another file not processed yet). 111*6777b538SAndroid Build Coastguard Worker host_executable = 112*6777b538SAndroid Build Coastguard Worker get_label_info(host_tool, "root_out_dir") + "/" + 113*6777b538SAndroid Build Coastguard Worker get_label_info(host_tool, "name") + _host_executable_suffix 114*6777b538SAndroid Build Coastguard Worker 115*6777b538SAndroid Build Coastguard Worker deps += [ host_tool ] 116*6777b538SAndroid Build Coastguard Worker 117*6777b538SAndroid Build Coastguard Worker # The script takes as arguments the binary to run, and then the arguments 118*6777b538SAndroid Build Coastguard Worker # to pass it. 119*6777b538SAndroid Build Coastguard Worker args = [ rebase_path(host_executable, root_build_dir) ] + invoker.args 120*6777b538SAndroid Build Coastguard Worker } 121*6777b538SAndroid Build Coastguard Worker} 122*6777b538SAndroid Build Coastguard Worker 123*6777b538SAndroid Build Coastguard Workertemplate("compiled_action_foreach") { 124*6777b538SAndroid Build Coastguard Worker assert(defined(invoker.sources), "sources must be defined for $target_name") 125*6777b538SAndroid Build Coastguard Worker assert(defined(invoker.tool), "tool must be defined for $target_name") 126*6777b538SAndroid Build Coastguard Worker assert(defined(invoker.outputs), "outputs must be defined for $target_name") 127*6777b538SAndroid Build Coastguard Worker assert(defined(invoker.args), "args must be defined for $target_name") 128*6777b538SAndroid Build Coastguard Worker 129*6777b538SAndroid Build Coastguard Worker action_foreach(target_name) { 130*6777b538SAndroid Build Coastguard Worker forward_variables_from(invoker, 131*6777b538SAndroid Build Coastguard Worker [ 132*6777b538SAndroid Build Coastguard Worker "deps", 133*6777b538SAndroid Build Coastguard Worker "depfile", 134*6777b538SAndroid Build Coastguard Worker "inputs", 135*6777b538SAndroid Build Coastguard Worker "outputs", 136*6777b538SAndroid Build Coastguard Worker "sources", 137*6777b538SAndroid Build Coastguard Worker "testonly", 138*6777b538SAndroid Build Coastguard Worker "visibility", 139*6777b538SAndroid Build Coastguard Worker ]) 140*6777b538SAndroid Build Coastguard Worker if (!defined(deps)) { 141*6777b538SAndroid Build Coastguard Worker deps = [] 142*6777b538SAndroid Build Coastguard Worker } 143*6777b538SAndroid Build Coastguard Worker if (!defined(inputs)) { 144*6777b538SAndroid Build Coastguard Worker inputs = [] 145*6777b538SAndroid Build Coastguard Worker } 146*6777b538SAndroid Build Coastguard Worker 147*6777b538SAndroid Build Coastguard Worker script = "//build/gn_run_binary.py" 148*6777b538SAndroid Build Coastguard Worker 149*6777b538SAndroid Build Coastguard Worker # Constuct the host toolchain version of the tool. 150*6777b538SAndroid Build Coastguard Worker host_tool = invoker.tool + "($host_toolchain)" 151*6777b538SAndroid Build Coastguard Worker 152*6777b538SAndroid Build Coastguard Worker # Get the path to the executable. Currently, this assumes that the tool 153*6777b538SAndroid Build Coastguard Worker # does not specify output_name so that the target name is the name to use. 154*6777b538SAndroid Build Coastguard Worker # If that's not the case, we'll need another argument to the script to 155*6777b538SAndroid Build Coastguard Worker # specify this, since we can't know what the output name is (it might be in 156*6777b538SAndroid Build Coastguard Worker # another file not processed yet). 157*6777b538SAndroid Build Coastguard Worker host_executable = 158*6777b538SAndroid Build Coastguard Worker get_label_info(host_tool, "root_out_dir") + "/" + 159*6777b538SAndroid Build Coastguard Worker get_label_info(host_tool, "name") + _host_executable_suffix 160*6777b538SAndroid Build Coastguard Worker 161*6777b538SAndroid Build Coastguard Worker deps += [ host_tool ] 162*6777b538SAndroid Build Coastguard Worker 163*6777b538SAndroid Build Coastguard Worker # The script takes as arguments the binary to run, and then the arguments 164*6777b538SAndroid Build Coastguard Worker # to pass it. 165*6777b538SAndroid Build Coastguard Worker args = [ rebase_path(host_executable, root_build_dir) ] + invoker.args 166*6777b538SAndroid Build Coastguard Worker } 167*6777b538SAndroid Build Coastguard Worker} 168