OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "tools/gn/config.h" | |
6 | |
7 #include "tools/gn/err.h" | |
8 #include "tools/gn/input_file_manager.h" | |
9 #include "tools/gn/item_node.h" | |
10 #include "tools/gn/item_tree.h" | |
11 #include "tools/gn/scheduler.h" | |
12 | |
13 Config::Config(const Label& label) : Item(label) { | |
14 } | |
15 | |
16 Config::~Config() { | |
17 } | |
18 | |
19 Config* Config::AsConfig() { | |
20 return this; | |
21 } | |
22 | |
23 const Config* Config::AsConfig() const { | |
24 return this; | |
25 } | |
26 | |
27 // static | |
28 Config* Config::GetConfig(const Settings* settings, | |
29 const LocationRange& specified_from_here, | |
30 const Label& label, | |
31 Item* dep_from, | |
32 Err* err) { | |
33 DCHECK(!label.is_null()); | |
34 | |
35 ItemTree* tree = &settings->build_settings()->item_tree(); | |
36 base::AutoLock lock(tree->lock()); | |
37 | |
38 ItemNode* node = tree->GetExistingNodeLocked(label); | |
39 Config* config = NULL; | |
40 if (!node) { | |
41 config = new Config(label); | |
42 node = new ItemNode(config); | |
43 tree->AddNodeLocked(node); | |
44 | |
45 // Only schedule loading the given target if somebody is depending on it | |
46 // (and we optimize by not re-asking it to run the current file). | |
47 // Otherwise, we're probably generating it right now. | |
48 if (dep_from && dep_from->label().dir() != label.dir()) { | |
49 settings->build_settings()->toolchain_manager().ScheduleInvocationLocked( | |
50 specified_from_here, label.GetToolchainLabel(), label.dir(), | |
51 err); | |
52 } | |
53 } else if ((config = node->item()->AsConfig())) { | |
54 // Previously saw this item as a config. | |
55 | |
56 // If we have no dep_from, we're generating it. In this case, it had better | |
57 // not already be generated. | |
58 if (!dep_from && node->state() != ItemNode::REFERENCED) { | |
59 *err = Err(specified_from_here, "Duplicate config definition.", | |
60 "You already told me about a config with this name."); | |
61 return NULL; | |
62 } | |
63 } else { | |
64 // Previously saw this thing as a non-config. | |
65 *err = Err(specified_from_here, | |
66 "Config name already used.", | |
67 "Previously you specified a " + | |
68 node->item()->GetItemTypeName() + " with this name instead."); | |
69 return NULL; | |
70 } | |
71 | |
72 // Keep a record of the guy asking us for this dependency. We know if | |
73 // somebody is adding a dependency, that guy it himself not resolved. | |
74 if (dep_from && node->state() != ItemNode::RESOLVED) | |
75 tree->GetExistingNodeLocked(dep_from->label())->AddDependency(node); | |
76 | |
77 return config; | |
78 } | |
OLD | NEW |