| 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/err.h" | 5 #include "tools/gn/err.h" |
| 6 #include "tools/gn/functions.h" | 6 #include "tools/gn/functions.h" |
| 7 #include "tools/gn/parse_tree.h" | 7 #include "tools/gn/parse_tree.h" |
| 8 #include "tools/gn/scheduler.h" | 8 #include "tools/gn/scheduler.h" |
| 9 #include "tools/gn/scope.h" | 9 #include "tools/gn/scope.h" |
| 10 #include "tools/gn/settings.h" | 10 #include "tools/gn/settings.h" |
| 11 #include "tools/gn/toolchain.h" | 11 #include "tools/gn/toolchain.h" |
| 12 #include "tools/gn/value_extractors.h" |
| 12 #include "tools/gn/variables.h" | 13 #include "tools/gn/variables.h" |
| 13 | 14 |
| 14 namespace functions { | 15 namespace functions { |
| 15 | 16 |
| 16 namespace { | 17 namespace { |
| 17 | 18 |
| 18 // This is jsut a unique value to take the address of to use as the key for | 19 // This is jsut a unique value to take the address of to use as the key for |
| 19 // the toolchain property on a scope. | 20 // the toolchain property on a scope. |
| 20 const int kToolchainPropertyKey = 0; | 21 const int kToolchainPropertyKey = 0; |
| 21 | 22 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 44 "\n" | 45 "\n" |
| 45 " A toolchain is a set of commands and build flags used to compile the\n" | 46 " A toolchain is a set of commands and build flags used to compile the\n" |
| 46 " source code. You can have more than one toolchain in use at once in\n" | 47 " source code. You can have more than one toolchain in use at once in\n" |
| 47 " a build.\n" | 48 " a build.\n" |
| 48 "\n" | 49 "\n" |
| 49 " A toolchain specifies the commands to run for various input file\n" | 50 " A toolchain specifies the commands to run for various input file\n" |
| 50 " types via the \"tool\" call (see \"gn help tool\") and specifies\n" | 51 " types via the \"tool\" call (see \"gn help tool\") and specifies\n" |
| 51 " arguments to be passed to the toolchain build via the\n" | 52 " arguments to be passed to the toolchain build via the\n" |
| 52 " \"toolchain_args\" call (see \"gn help toolchain_args\").\n" | 53 " \"toolchain_args\" call (see \"gn help toolchain_args\").\n" |
| 53 "\n" | 54 "\n" |
| 55 " In addition, a toolchain can specify dependencies via the \"deps\"\n" |
| 56 " variable like a target. These dependencies will be resolved before any\n" |
| 57 " target in the toolchain is compiled. To avoid circular dependencies\n" |
| 58 " these must be targets defined in another toolchain.\n" |
| 59 "\n" |
| 54 "Invoking targets in toolchains:\n" | 60 "Invoking targets in toolchains:\n" |
| 55 "\n" | 61 "\n" |
| 56 " By default, when a target depends on another, there is an implicit\n" | 62 " By default, when a target depends on another, there is an implicit\n" |
| 57 " toolchain label that is inherited, so the dependee has the same one\n" | 63 " toolchain label that is inherited, so the dependee has the same one\n" |
| 58 " as the dependent.\n" | 64 " as the dependent.\n" |
| 59 "\n" | 65 "\n" |
| 60 " You can override this and refer to any other toolchain by explicitly\n" | 66 " You can override this and refer to any other toolchain by explicitly\n" |
| 61 " labeling the toolchain to use. For example:\n" | 67 " labeling the toolchain to use. For example:\n" |
| 62 " datadeps = [ \"//plugins:mine(//toolchains:plugin_toolchain)\" ]\n" | 68 " datadeps = [ \"//plugins:mine(//toolchains:plugin_toolchain)\" ]\n" |
| 63 " The string \"//build/toolchains:plugin_toolchain\" is a label that\n" | 69 " The string \"//build/toolchains:plugin_toolchain\" is a label that\n" |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 toolchain->set_defined_from(function); | 115 toolchain->set_defined_from(function); |
| 110 toolchain->visibility().SetPublic(); | 116 toolchain->visibility().SetPublic(); |
| 111 | 117 |
| 112 Scope block_scope(scope); | 118 Scope block_scope(scope); |
| 113 block_scope.SetProperty(&kToolchainPropertyKey, toolchain.get()); | 119 block_scope.SetProperty(&kToolchainPropertyKey, toolchain.get()); |
| 114 block->ExecuteBlockInScope(&block_scope, err); | 120 block->ExecuteBlockInScope(&block_scope, err); |
| 115 block_scope.SetProperty(&kToolchainPropertyKey, NULL); | 121 block_scope.SetProperty(&kToolchainPropertyKey, NULL); |
| 116 if (err->has_error()) | 122 if (err->has_error()) |
| 117 return Value(); | 123 return Value(); |
| 118 | 124 |
| 125 // Read deps (if any). |
| 126 const Value* deps_value = block_scope.GetValue(variables::kDeps, true); |
| 127 if (deps_value) { |
| 128 ExtractListOfLabels( |
| 129 *deps_value, block_scope.GetSourceDir(), |
| 130 ToolchainLabelForScope(&block_scope), &toolchain->deps(), err); |
| 131 if (err->has_error()) |
| 132 return Value(); |
| 133 } |
| 134 |
| 135 |
| 119 if (!block_scope.CheckForUnusedVars(err)) | 136 if (!block_scope.CheckForUnusedVars(err)) |
| 120 return Value(); | 137 return Value(); |
| 121 | 138 |
| 122 // Save this target for the file. | 139 // Save this toolchain. |
| 123 Scope::ItemVector* collector = scope->GetItemCollector(); | 140 Scope::ItemVector* collector = scope->GetItemCollector(); |
| 124 if (!collector) { | 141 if (!collector) { |
| 125 *err = Err(function, "Can't define a toolchain in this context."); | 142 *err = Err(function, "Can't define a toolchain in this context."); |
| 126 return Value(); | 143 return Value(); |
| 127 } | 144 } |
| 128 collector->push_back(new scoped_ptr<Item>(toolchain.PassAs<Item>())); | 145 collector->push_back(new scoped_ptr<Item>(toolchain.PassAs<Item>())); |
| 129 return Value(); | 146 return Value(); |
| 130 } | 147 } |
| 131 | 148 |
| 132 // tool ------------------------------------------------------------------------ | 149 // tool ------------------------------------------------------------------------ |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 307 return Value(); | 324 return Value(); |
| 308 | 325 |
| 309 Scope::KeyValueMap values; | 326 Scope::KeyValueMap values; |
| 310 block_scope.GetCurrentScopeValues(&values); | 327 block_scope.GetCurrentScopeValues(&values); |
| 311 toolchain->args() = values; | 328 toolchain->args() = values; |
| 312 | 329 |
| 313 return Value(); | 330 return Value(); |
| 314 } | 331 } |
| 315 | 332 |
| 316 } // namespace functions | 333 } // namespace functions |
| OLD | NEW |