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 |