| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "tools/gn/functions.h" | 5 #include "tools/gn/functions.h" |
| 6 | 6 |
| 7 #include "tools/gn/config_values_generator.h" | 7 #include "tools/gn/config_values_generator.h" |
| 8 #include "tools/gn/err.h" | 8 #include "tools/gn/err.h" |
| 9 #include "tools/gn/parse_tree.h" | 9 #include "tools/gn/parse_tree.h" |
| 10 #include "tools/gn/scope.h" | 10 #include "tools/gn/scope.h" |
| 11 #include "tools/gn/target_generator.h" | 11 #include "tools/gn/target_generator.h" |
| 12 #include "tools/gn/value.h" | 12 #include "tools/gn/value.h" |
| 13 #include "tools/gn/variables.h" | 13 #include "tools/gn/variables.h" |
| 14 | 14 |
| 15 #define DEPENDENT_CONFIG_VARS \ | 15 #define DEPENDENT_CONFIG_VARS \ |
| 16 " Dependent configs: all_dependent_configs, direct_dependent_configs\n" | 16 " Dependent configs: all_dependent_configs, direct_dependent_configs\n" |
| 17 #define DEPS_VARS \ | 17 #define DEPS_VARS \ |
| 18 " Deps: data, datadeps, deps, forward_dependent_configs_from, hard_dep\n" | 18 " Deps: data, datadeps, deps, forward_dependent_configs_from, hard_dep\n" |
| 19 #define GENERAL_TARGET_VARS \ | 19 #define GENERAL_TARGET_VARS \ |
| 20 " General: configs, source_prereqs, sources\n" | 20 " General: configs, inputs, sources\n" |
| 21 | 21 |
| 22 namespace functions { | 22 namespace functions { |
| 23 | 23 |
| 24 namespace { | 24 namespace { |
| 25 | 25 |
| 26 Value ExecuteGenericTarget(const char* target_type, | 26 Value ExecuteGenericTarget(const char* target_type, |
| 27 Scope* scope, | 27 Scope* scope, |
| 28 const FunctionCallNode* function, | 28 const FunctionCallNode* function, |
| 29 const std::vector<Value>& args, | 29 const std::vector<Value>& args, |
| 30 BlockNode* block, | 30 BlockNode* block, |
| (...skipping 22 matching lines...) Expand all Loading... |
| 53 } // namespace | 53 } // namespace |
| 54 | 54 |
| 55 // action ---------------------------------------------------------------------- | 55 // action ---------------------------------------------------------------------- |
| 56 | 56 |
| 57 // Common help paragraph on script runtime execution directories. | 57 // Common help paragraph on script runtime execution directories. |
| 58 #define SCRIPT_EXECUTION_CONTEXT \ | 58 #define SCRIPT_EXECUTION_CONTEXT \ |
| 59 " The script will be executed with the given arguments with the current\n"\ | 59 " The script will be executed with the given arguments with the current\n"\ |
| 60 " directory being that of the root build directory. If you pass files\n"\ | 60 " directory being that of the root build directory. If you pass files\n"\ |
| 61 " to your script, see \"gn help rebase_path\" for how to convert\n" \ | 61 " to your script, see \"gn help rebase_path\" for how to convert\n" \ |
| 62 " file names to be relative to the build directory (file names in the\n" \ | 62 " file names to be relative to the build directory (file names in the\n" \ |
| 63 " sources, outputs, and source_prereqs will be all treated as relative\n" \ | 63 " sources, outputs, and inputs will be all treated as relative to the\n" \ |
| 64 " to the current build file and converted as needed automatically).\n" | 64 " current build file and converted as needed automatically).\n" |
| 65 | 65 |
| 66 // Common help paragraph on script output directories. | 66 // Common help paragraph on script output directories. |
| 67 #define SCRIPT_EXECUTION_OUTPUTS \ | 67 #define SCRIPT_EXECUTION_OUTPUTS \ |
| 68 " All output files must be inside the output directory of the build.\n" \ | 68 " All output files must be inside the output directory of the build.\n" \ |
| 69 " You would generally use |$target_out_dir| or |$target_gen_dir| to\n" \ | 69 " You would generally use |$target_out_dir| or |$target_gen_dir| to\n" \ |
| 70 " reference the output or generated intermediate file directories,\n" \ | 70 " reference the output or generated intermediate file directories,\n" \ |
| 71 " respectively.\n" | 71 " respectively.\n" |
| 72 | 72 |
| 73 #define ACTION_DEPS \ | 73 #define ACTION_DEPS \ |
| 74 " The \"deps\" for an action will always be completed before any part\n" \ | 74 " The \"deps\" for an action will always be completed before any part\n" \ |
| 75 " of the action is run so it can depend on the output of previous\n" \ | 75 " of the action is run so it can depend on the output of previous\n" \ |
| 76 " steps. The \"datadeps\" will be built if the action is built, but\n" \ | 76 " steps. The \"datadeps\" will be built if the action is built, but\n" \ |
| 77 " may not have completed before all steps of the action are started.\n" \ | 77 " may not have completed before all steps of the action are started.\n" \ |
| 78 " This can give additional parallelism in the build for runtime-only\n" \ | 78 " This can give additional parallelism in the build for runtime-only\n" \ |
| 79 " dependencies.\n" | 79 " dependencies.\n" |
| 80 | 80 |
| 81 const char kAction[] = "action"; | 81 const char kAction[] = "action"; |
| 82 const char kAction_HelpShort[] = | 82 const char kAction_HelpShort[] = |
| 83 "action: Declare a target that runs a script a single time."; | 83 "action: Declare a target that runs a script a single time."; |
| 84 const char kAction_Help[] = | 84 const char kAction_Help[] = |
| 85 "action: Declare a target that runs a script a single time.\n" | 85 "action: Declare a target that runs a script a single time.\n" |
| 86 "\n" | 86 "\n" |
| 87 " This target type allows you to run a script a single time to produce\n" | 87 " This target type allows you to run a script a single time to produce\n" |
| 88 " or more output files. If you want to run a script once for each of a\n" | 88 " or more output files. If you want to run a script once for each of a\n" |
| 89 " set of input files, see \"gn help action_foreach\".\n" | 89 " set of input files, see \"gn help action_foreach\".\n" |
| 90 "\n" | 90 "\n" |
| 91 "Inputs\n" | 91 "Inputs\n" |
| 92 "\n" | 92 "\n" |
| 93 " In an action the \"sources\" and \"source_prereqs\" are treated the\n" | 93 " In an action the \"sources\" and \"inputs\" are treated the same:\n" |
| 94 " same: they're both input dependencies on script execution with no\n" | 94 " they're both input dependencies on script execution with no special\n" |
| 95 " special handling. If you want to pass the sources to your script, you\n" | 95 " handling. If you want to pass the sources to your script, you must do\n" |
| 96 " must do so explicitly by including them in the \"args\". Note also\n" | 96 " so explicitly by including them in the \"args\". Note also that this\n" |
| 97 " that this means there is no special handling of paths since GN\n" | 97 " means there is no special handling of paths since GN doesn't know\n" |
| 98 " doesn't know which of the args are paths and not. You will want to use\n" | 98 " which of the args are paths and not. You will want to use\n" |
| 99 " rebase_path() to convert paths to be relative to the root_build_dir.\n" | 99 " rebase_path() to convert paths to be relative to the root_build_dir.\n" |
| 100 "\n" | 100 "\n" |
| 101 " You can dynamically write input dependencies (for incremental rebuilds\n" |
| 102 " if an input file changes) by writing a depfile when the script is run\n" |
| 103 " (see \"gn help depfile\"). This is more flexible than \"inputs\".\n" |
| 104 "\n" |
| 101 " It is recommended you put inputs to your script in the \"sources\"\n" | 105 " It is recommended you put inputs to your script in the \"sources\"\n" |
| 102 " variable, and stuff like other Python files required to run your\n" | 106 " variable, and stuff like other Python files required to run your\n" |
| 103 " script in the \"source_prereqs\" variable.\n" | 107 " script in the \"inputs\" variable.\n" |
| 104 "\n" | 108 "\n" |
| 105 ACTION_DEPS | 109 ACTION_DEPS |
| 106 "\n" | 110 "\n" |
| 107 "Outputs\n" | 111 "Outputs\n" |
| 108 "\n" | 112 "\n" |
| 109 " You should specify files created by your script by specifying them in\n" | 113 " You should specify files created by your script by specifying them in\n" |
| 110 " the \"outputs\".\n" | 114 " the \"outputs\".\n" |
| 111 "\n" | 115 "\n" |
| 112 SCRIPT_EXECUTION_CONTEXT | 116 SCRIPT_EXECUTION_CONTEXT |
| 113 "\n" | 117 "\n" |
| 114 "File name handling\n" | 118 "File name handling\n" |
| 115 "\n" | 119 "\n" |
| 116 SCRIPT_EXECUTION_OUTPUTS | 120 SCRIPT_EXECUTION_OUTPUTS |
| 117 "\n" | 121 "\n" |
| 118 "Variables\n" | 122 "Variables\n" |
| 119 "\n" | 123 "\n" |
| 120 " args, data, datadeps, depfile, deps, outputs*, script*,\n" | 124 " args, data, datadeps, depfile, deps, outputs*, script*,\n" |
| 121 " source_prereqs, sources\n" | 125 " inputs, sources\n" |
| 122 " * = required\n" | 126 " * = required\n" |
| 123 "\n" | 127 "\n" |
| 124 "Example\n" | 128 "Example\n" |
| 125 "\n" | 129 "\n" |
| 126 " action(\"run_this_guy_once\") {\n" | 130 " action(\"run_this_guy_once\") {\n" |
| 127 " script = \"doprocessing.py\"\n" | 131 " script = \"doprocessing.py\"\n" |
| 128 " sources = [ \"my_configuration.txt\" ]\n" | 132 " sources = [ \"my_configuration.txt\" ]\n" |
| 129 " outputs = [ \"$target_gen_dir/insightful_output.txt\" ]\n" | 133 " outputs = [ \"$target_gen_dir/insightful_output.txt\" ]\n" |
| 130 "\n" | 134 "\n" |
| 131 " # Our script imports this Python file so we want to rebuild if it\n" | 135 " # Our script imports this Python file so we want to rebuild if it\n" |
| 132 " # changes.\n" | 136 " # changes.\n" |
| 133 " source_prereqs = [ \"helper_library.py\" ]\n" | 137 " inputs = [ \"helper_library.py\" ]\n" |
| 134 "\n" | 138 "\n" |
| 135 " # Note that we have to manually pass the sources to our script if\n" | 139 " # Note that we have to manually pass the sources to our script if\n" |
| 136 " # the script needs them as inputs.\n" | 140 " # the script needs them as inputs.\n" |
| 137 " args = [ \"--out\", rebase_path(target_gen_dir, root_build_dir) ] +\n" | 141 " args = [ \"--out\", rebase_path(target_gen_dir, root_build_dir) ] +\n" |
| 138 " rebase_path(sources, root_build_dir)\n" | 142 " rebase_path(sources, root_build_dir)\n" |
| 139 " }\n"; | 143 " }\n"; |
| 140 | 144 |
| 141 Value RunAction(Scope* scope, | 145 Value RunAction(Scope* scope, |
| 142 const FunctionCallNode* function, | 146 const FunctionCallNode* function, |
| 143 const std::vector<Value>& args, | 147 const std::vector<Value>& args, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 162 "Inputs\n" | 166 "Inputs\n" |
| 163 "\n" | 167 "\n" |
| 164 " The script will be run once per file in the \"sources\" variable. The\n" | 168 " The script will be run once per file in the \"sources\" variable. The\n" |
| 165 " \"outputs\" variable should specify one or more files with a source\n" | 169 " \"outputs\" variable should specify one or more files with a source\n" |
| 166 " expansion pattern in it (see \"gn help source_expansion\"). The output\n" | 170 " expansion pattern in it (see \"gn help source_expansion\"). The output\n" |
| 167 " file(s) for each script invocation should be unique. Normally you\n" | 171 " file(s) for each script invocation should be unique. Normally you\n" |
| 168 " use \"{{source_name_part}}\" in each output file.\n" | 172 " use \"{{source_name_part}}\" in each output file.\n" |
| 169 "\n" | 173 "\n" |
| 170 " If your script takes additional data as input, such as a shared\n" | 174 " If your script takes additional data as input, such as a shared\n" |
| 171 " configuration file or a Python module it uses, those files should be\n" | 175 " configuration file or a Python module it uses, those files should be\n" |
| 172 " listed in the \"source_prereqs\" variable. These files are treated as\n" | 176 " listed in the \"inputs\" variable. These files are treated as\n" |
| 173 " dependencies of each script invocation.\n" | 177 " dependencies of each script invocation.\n" |
| 174 "\n" | 178 "\n" |
| 179 " You can dynamically write input dependencies (for incremental rebuilds\n" |
| 180 " if an input file changes) by writing a depfile when the script is run\n" |
| 181 " (see \"gn help depfile\"). This is more flexible than \"inputs\".\n" |
| 182 "\n" |
| 175 ACTION_DEPS | 183 ACTION_DEPS |
| 176 "\n" | 184 "\n" |
| 177 "Outputs\n" | 185 "Outputs\n" |
| 178 "\n" | 186 "\n" |
| 179 SCRIPT_EXECUTION_CONTEXT | 187 SCRIPT_EXECUTION_CONTEXT |
| 180 "\n" | 188 "\n" |
| 181 "File name handling\n" | 189 "File name handling\n" |
| 182 "\n" | 190 "\n" |
| 183 SCRIPT_EXECUTION_OUTPUTS | 191 SCRIPT_EXECUTION_OUTPUTS |
| 184 "\n" | 192 "\n" |
| 185 "Variables\n" | 193 "Variables\n" |
| 186 "\n" | 194 "\n" |
| 187 " args, data, datadeps, depfile, deps, outputs*, script*,\n" | 195 " args, data, datadeps, depfile, deps, outputs*, script*,\n" |
| 188 " source_prereqs, sources*\n" | 196 " inputs, sources*\n" |
| 189 " * = required\n" | 197 " * = required\n" |
| 190 "\n" | 198 "\n" |
| 191 "Example\n" | 199 "Example\n" |
| 192 "\n" | 200 "\n" |
| 193 " # Runs the script over each IDL file. The IDL script will generate\n" | 201 " # Runs the script over each IDL file. The IDL script will generate\n" |
| 194 " # both a .cc and a .h file for each input.\n" | 202 " # both a .cc and a .h file for each input.\n" |
| 195 " action_foreach(\"my_idl\") {\n" | 203 " action_foreach(\"my_idl\") {\n" |
| 196 " script = \"idl_processor.py\"\n" | 204 " script = \"idl_processor.py\"\n" |
| 197 " sources = [ \"foo.idl\", \"bar.idl\" ]\n" | 205 " sources = [ \"foo.idl\", \"bar.idl\" ]\n" |
| 198 "\n" | 206 "\n" |
| 199 " # Our script reads this file each time, so we need to list is as a\n" | 207 " # Our script reads this file each time, so we need to list is as a\n" |
| 200 " # dependency so we can rebuild if it changes.\n" | 208 " # dependency so we can rebuild if it changes.\n" |
| 201 " source_prereqs = [ \"my_configuration.txt\" ]\n" | 209 " inputs = [ \"my_configuration.txt\" ]\n" |
| 202 "\n" | 210 "\n" |
| 203 " # Transformation from source file name to output file names.\n" | 211 " # Transformation from source file name to output file names.\n" |
| 204 " outputs = [ \"$target_gen_dir/{{source_name_part}}.h\",\n" | 212 " outputs = [ \"$target_gen_dir/{{source_name_part}}.h\",\n" |
| 205 " \"$target_gen_dir/{{source_name_part}}.cc\" ]\n" | 213 " \"$target_gen_dir/{{source_name_part}}.cc\" ]\n" |
| 206 "\n" | 214 "\n" |
| 207 " # Note that since \"args\" is opaque to GN, if you specify paths\n" | 215 " # Note that since \"args\" is opaque to GN, if you specify paths\n" |
| 208 " # here, you will need to convert it to be relative to the build\n" | 216 " # here, you will need to convert it to be relative to the build\n" |
| 209 " # directory using \"rebase_path()\".\n" | 217 " # directory using \"rebase_path()\".\n" |
| 210 " args = [\n" | 218 " args = [\n" |
| 211 " \"{{source}}\",\n" | 219 " \"{{source}}\",\n" |
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 530 Value RunTest(Scope* scope, | 538 Value RunTest(Scope* scope, |
| 531 const FunctionCallNode* function, | 539 const FunctionCallNode* function, |
| 532 const std::vector<Value>& args, | 540 const std::vector<Value>& args, |
| 533 BlockNode* block, | 541 BlockNode* block, |
| 534 Err* err) { | 542 Err* err) { |
| 535 return ExecuteGenericTarget(functions::kExecutable, scope, function, args, | 543 return ExecuteGenericTarget(functions::kExecutable, scope, function, args, |
| 536 block, err); | 544 block, err); |
| 537 } | 545 } |
| 538 | 546 |
| 539 } // namespace functions | 547 } // namespace functions |
| OLD | NEW |