Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1784)

Side by Side Diff: tools/gn/target_generator.cc

Issue 561273003: Add public deps to GN (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/target_generator.h" 5 #include "tools/gn/target_generator.h"
6 6
7 #include "tools/gn/action_target_generator.h" 7 #include "tools/gn/action_target_generator.h"
8 #include "tools/gn/binary_target_generator.h" 8 #include "tools/gn/binary_target_generator.h"
9 #include "tools/gn/build_settings.h" 9 #include "tools/gn/build_settings.h"
10 #include "tools/gn/config.h" 10 #include "tools/gn/config.h"
(...skipping 18 matching lines...) Expand all
29 scope_(scope), 29 scope_(scope),
30 function_call_(function_call), 30 function_call_(function_call),
31 err_(err) { 31 err_(err) {
32 } 32 }
33 33
34 TargetGenerator::~TargetGenerator() { 34 TargetGenerator::~TargetGenerator() {
35 } 35 }
36 36
37 void TargetGenerator::Run() { 37 void TargetGenerator::Run() {
38 // All target types use these. 38 // All target types use these.
39 FillDependentConfigs(); 39 if (!FillDependentConfigs())
40 if (err_->has_error())
41 return; 40 return;
42 41
43 FillData(); 42 if (!FillData())
44 if (err_->has_error())
45 return; 43 return;
46 44
47 FillDependencies(); 45 if (!FillDependencies())
48 if (err_->has_error())
49 return; 46 return;
50 47
51 FillTestonly(); 48 if (!FillTestonly())
52 if (err_->has_error())
53 return; 49 return;
54 50
55 if (!Visibility::FillItemVisibility(target_, scope_, err_)) 51 if (!Visibility::FillItemVisibility(target_, scope_, err_))
56 return; 52 return;
57 53
58 // Do type-specific generation. 54 // Do type-specific generation.
59 DoRun(); 55 DoRun();
60 } 56 }
61 57
62 // static 58 // static
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 *err = Err(function_call, "Can't define a target in this context."); 126 *err = Err(function_call, "Can't define a target in this context.");
131 return; 127 return;
132 } 128 }
133 collector->push_back(new scoped_ptr<Item>(target.PassAs<Item>())); 129 collector->push_back(new scoped_ptr<Item>(target.PassAs<Item>()));
134 } 130 }
135 131
136 const BuildSettings* TargetGenerator::GetBuildSettings() const { 132 const BuildSettings* TargetGenerator::GetBuildSettings() const {
137 return scope_->settings()->build_settings(); 133 return scope_->settings()->build_settings();
138 } 134 }
139 135
140 void TargetGenerator::FillSources() { 136 bool TargetGenerator::FillSources() {
141 const Value* value = scope_->GetValue(variables::kSources, true); 137 const Value* value = scope_->GetValue(variables::kSources, true);
142 if (!value) 138 if (!value)
143 return; 139 return true;
144 140
145 Target::FileList dest_sources; 141 Target::FileList dest_sources;
146 if (!ExtractListOfRelativeFiles(scope_->settings()->build_settings(), *value, 142 if (!ExtractListOfRelativeFiles(scope_->settings()->build_settings(), *value,
147 scope_->GetSourceDir(), &dest_sources, err_)) 143 scope_->GetSourceDir(), &dest_sources, err_))
148 return; 144 return false;
149 target_->sources().swap(dest_sources); 145 target_->sources().swap(dest_sources);
146 return true;
150 } 147 }
151 148
152 void TargetGenerator::FillPublic() { 149 bool TargetGenerator::FillPublic() {
153 const Value* value = scope_->GetValue(variables::kPublic, true); 150 const Value* value = scope_->GetValue(variables::kPublic, true);
154 if (!value) 151 if (!value)
155 return; 152 return true;
156 153
157 // If the public headers are defined, don't default to public. 154 // If the public headers are defined, don't default to public.
158 target_->set_all_headers_public(false); 155 target_->set_all_headers_public(false);
159 156
160 Target::FileList dest_public; 157 Target::FileList dest_public;
161 if (!ExtractListOfRelativeFiles(scope_->settings()->build_settings(), *value, 158 if (!ExtractListOfRelativeFiles(scope_->settings()->build_settings(), *value,
162 scope_->GetSourceDir(), &dest_public, err_)) 159 scope_->GetSourceDir(), &dest_public, err_))
163 return; 160 return false;
164 target_->public_headers().swap(dest_public); 161 target_->public_headers().swap(dest_public);
162 return true;
165 } 163 }
166 164
167 void TargetGenerator::FillInputs() { 165 bool TargetGenerator::FillInputs() {
168 const Value* value = scope_->GetValue(variables::kInputs, true); 166 const Value* value = scope_->GetValue(variables::kInputs, true);
169 if (!value) { 167 if (!value) {
170 // Older versions used "source_prereqs". Allow use of this variable until 168 // Older versions used "source_prereqs". Allow use of this variable until
171 // all callers are updated. 169 // all callers are updated.
172 // TODO(brettw) remove this eventually. 170 // TODO(brettw) remove this eventually.
173 value = scope_->GetValue("source_prereqs", true); 171 value = scope_->GetValue("source_prereqs", true);
174
175 if (!value) 172 if (!value)
176 return; 173 return true;
177 } 174 }
178 175
179 Target::FileList dest_inputs; 176 Target::FileList dest_inputs;
180 if (!ExtractListOfRelativeFiles(scope_->settings()->build_settings(), *value, 177 if (!ExtractListOfRelativeFiles(scope_->settings()->build_settings(), *value,
181 scope_->GetSourceDir(), &dest_inputs, err_)) 178 scope_->GetSourceDir(), &dest_inputs, err_))
182 return; 179 return false;
183 target_->inputs().swap(dest_inputs); 180 target_->inputs().swap(dest_inputs);
181 return true;
184 } 182 }
185 183
186 void TargetGenerator::FillConfigs() { 184 bool TargetGenerator::FillConfigs() {
187 FillGenericConfigs(variables::kConfigs, &target_->configs()); 185 return FillGenericConfigs(variables::kConfigs, &target_->configs());
188 } 186 }
189 187
190 void TargetGenerator::FillDependentConfigs() { 188 bool TargetGenerator::FillDependentConfigs() {
191 FillGenericConfigs(variables::kAllDependentConfigs, 189 if (!FillGenericConfigs(variables::kAllDependentConfigs,
192 &target_->all_dependent_configs()); 190 &target_->all_dependent_configs()))
193 FillGenericConfigs(variables::kDirectDependentConfigs, 191 return false;
194 &target_->direct_dependent_configs()); 192 if (!FillGenericConfigs(variables::kPublicConfigs,
193 &target_->public_configs()))
194 return false;
195
196 // "public_configs" was previously named "direct_dependent_configs", fall
197 // back to that if public_configs was undefined.
198 if (!scope_->GetValue(variables::kPublicConfigs, false)) {
199 if (!FillGenericConfigs("direct_dependent_configs",
200 &target_->public_configs()))
201 return false;
202 }
203 return true;
195 } 204 }
196 205
197 void TargetGenerator::FillData() { 206 bool TargetGenerator::FillData() {
198 const Value* value = scope_->GetValue(variables::kData, true); 207 const Value* value = scope_->GetValue(variables::kData, true);
199 if (!value) 208 if (!value)
200 return; 209 return true;
201 210
202 Target::FileList dest_data; 211 Target::FileList dest_data;
203 if (!ExtractListOfRelativeFiles(scope_->settings()->build_settings(), *value, 212 if (!ExtractListOfRelativeFiles(scope_->settings()->build_settings(), *value,
204 scope_->GetSourceDir(), &dest_data, err_)) 213 scope_->GetSourceDir(), &dest_data, err_))
205 return; 214 return false;
206 target_->data().swap(dest_data); 215 target_->data().swap(dest_data);
216 return true;
207 } 217 }
208 218
209 void TargetGenerator::FillDependencies() { 219 bool TargetGenerator::FillDependencies() {
210 FillGenericDeps(variables::kDeps, &target_->deps()); 220 if (!FillGenericDeps(variables::kDeps, &target_->private_deps()))
211 if (err_->has_error()) 221 return false;
212 return; 222 if (!FillGenericDeps(variables::kPublicDeps, &target_->public_deps()))
213 FillGenericDeps(variables::kDatadeps, &target_->datadeps()); 223 return false;
214 if (err_->has_error()) 224 if (!FillGenericDeps(variables::kDataDeps, &target_->data_deps()))
215 return; 225 return false;
226
227 // "data_deps" was previously named "datadeps". For backwards-compat, read
228 // the old one if no "data_deps" were specified.
229 if (!scope_->GetValue(variables::kDataDeps, false)) {
230 if (!FillGenericDeps("datadeps", &target_->data_deps()))
231 return false;
232 }
216 233
217 // This is a list of dependent targets to have their configs fowarded, so 234 // This is a list of dependent targets to have their configs fowarded, so
218 // it goes here rather than in FillConfigs. 235 // it goes here rather than in FillConfigs.
219 FillForwardDependentConfigs(); 236 if (!FillForwardDependentConfigs())
220 if (err_->has_error()) 237 return false;
221 return; 238 return true;
222 } 239 }
223 240
224 void TargetGenerator::FillTestonly() { 241 bool TargetGenerator::FillTestonly() {
225 const Value* value = scope_->GetValue(variables::kTestonly, true); 242 const Value* value = scope_->GetValue(variables::kTestonly, true);
226 if (value) { 243 if (value) {
227 if (!value->VerifyTypeIs(Value::BOOLEAN, err_)) 244 if (!value->VerifyTypeIs(Value::BOOLEAN, err_))
228 return; 245 return false;
229 target_->set_testonly(value->boolean_value()); 246 target_->set_testonly(value->boolean_value());
230 } 247 }
248 return true;
231 } 249 }
232 250
233 void TargetGenerator::FillOutputs(bool allow_substitutions) { 251 bool TargetGenerator::FillOutputs(bool allow_substitutions) {
234 const Value* value = scope_->GetValue(variables::kOutputs, true); 252 const Value* value = scope_->GetValue(variables::kOutputs, true);
235 if (!value) 253 if (!value)
236 return; 254 return true;
237 255
238 SubstitutionList& outputs = target_->action_values().outputs(); 256 SubstitutionList& outputs = target_->action_values().outputs();
239 if (!outputs.Parse(*value, err_)) 257 if (!outputs.Parse(*value, err_))
240 return; 258 return false;
241 259
242 if (!allow_substitutions) { 260 if (!allow_substitutions) {
243 // Verify no substitutions were actually used. 261 // Verify no substitutions were actually used.
244 if (!outputs.required_types().empty()) { 262 if (!outputs.required_types().empty()) {
245 *err_ = Err(*value, "Source expansions not allowed here.", 263 *err_ = Err(*value, "Source expansions not allowed here.",
246 "The outputs of this target used source {{expansions}} but this " 264 "The outputs of this target used source {{expansions}} but this "
247 "targe type\ndoesn't support them. Just express the outputs " 265 "targe type\ndoesn't support them. Just express the outputs "
248 "literally."); 266 "literally.");
249 return; 267 return false;
250 } 268 }
251 } 269 }
252 270
253 // Check the substitutions used are valid for this purpose. 271 // Check the substitutions used are valid for this purpose.
254 if (!EnsureValidSourcesSubstitutions(outputs.required_types(), 272 if (!EnsureValidSourcesSubstitutions(outputs.required_types(),
255 value->origin(), err_)) 273 value->origin(), err_))
256 return; 274 return false;
257 275
258 // Validate that outputs are in the output dir. 276 // Validate that outputs are in the output dir.
259 CHECK(outputs.list().size() == value->list_value().size()); 277 CHECK(outputs.list().size() == value->list_value().size());
260 for (size_t i = 0; i < outputs.list().size(); i++) { 278 for (size_t i = 0; i < outputs.list().size(); i++) {
261 if (!EnsureSubstitutionIsInOutputDir(outputs.list()[i], 279 if (!EnsureSubstitutionIsInOutputDir(outputs.list()[i],
262 value->list_value()[i])) 280 value->list_value()[i]))
263 return; 281 return false;
264 } 282 }
283 return true;
265 } 284 }
266 285
267 bool TargetGenerator::EnsureSubstitutionIsInOutputDir( 286 bool TargetGenerator::EnsureSubstitutionIsInOutputDir(
268 const SubstitutionPattern& pattern, 287 const SubstitutionPattern& pattern,
269 const Value& original_value) { 288 const Value& original_value) {
270 if (pattern.ranges().empty()) { 289 if (pattern.ranges().empty()) {
271 // Pattern is empty, error out (this prevents weirdness below). 290 // Pattern is empty, error out (this prevents weirdness below).
272 *err_ = Err(original_value, "This has an empty value in it."); 291 *err_ = Err(original_value, "This has an empty value in it.");
273 return false; 292 return false;
274 } 293 }
(...skipping 13 matching lines...) Expand all
288 "The given file should be in the output directory. Normally you\n" 307 "The given file should be in the output directory. Normally you\n"
289 "would specify\n\"$target_out_dir/foo\" or " 308 "would specify\n\"$target_out_dir/foo\" or "
290 "\"{{source_gen_dir}}/foo\"."); 309 "\"{{source_gen_dir}}/foo\".");
291 return false; 310 return false;
292 } 311 }
293 } 312 }
294 313
295 return true; 314 return true;
296 } 315 }
297 316
298 void TargetGenerator::FillGenericConfigs(const char* var_name, 317 bool TargetGenerator::FillGenericConfigs(const char* var_name,
299 UniqueVector<LabelConfigPair>* dest) { 318 UniqueVector<LabelConfigPair>* dest) {
300 const Value* value = scope_->GetValue(var_name, true); 319 const Value* value = scope_->GetValue(var_name, true);
301 if (value) { 320 if (value) {
302 ExtractListOfUniqueLabels(*value, scope_->GetSourceDir(), 321 ExtractListOfUniqueLabels(*value, scope_->GetSourceDir(),
303 ToolchainLabelForScope(scope_), dest, err_); 322 ToolchainLabelForScope(scope_), dest, err_);
304 } 323 }
324 return !err_->has_error();
305 } 325 }
306 326
307 void TargetGenerator::FillGenericDeps(const char* var_name, 327 bool TargetGenerator::FillGenericDeps(const char* var_name,
308 LabelTargetVector* dest) { 328 LabelTargetVector* dest) {
309 const Value* value = scope_->GetValue(var_name, true); 329 const Value* value = scope_->GetValue(var_name, true);
310 if (value) { 330 if (value) {
311 ExtractListOfLabels(*value, scope_->GetSourceDir(), 331 ExtractListOfLabels(*value, scope_->GetSourceDir(),
312 ToolchainLabelForScope(scope_), dest, err_); 332 ToolchainLabelForScope(scope_), dest, err_);
313 } 333 }
334 return !err_->has_error();
314 } 335 }
315 336
316 void TargetGenerator::FillForwardDependentConfigs() { 337 bool TargetGenerator::FillForwardDependentConfigs() {
317 const Value* value = scope_->GetValue( 338 const Value* value = scope_->GetValue(
318 variables::kForwardDependentConfigsFrom, true); 339 variables::kForwardDependentConfigsFrom, true);
319 if (value) { 340 if (value) {
320 ExtractListOfUniqueLabels(*value, scope_->GetSourceDir(), 341 ExtractListOfUniqueLabels(*value, scope_->GetSourceDir(),
321 ToolchainLabelForScope(scope_), 342 ToolchainLabelForScope(scope_),
322 &target_->forward_dependent_configs(), err_); 343 &target_->forward_dependent_configs(), err_);
323 } 344 }
345 return !err_->has_error();
324 } 346 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698