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/setup.h" | 5 #include "tools/gn/setup.h" |
6 | 6 |
7 #include <stdlib.h> | 7 #include <stdlib.h> |
8 | 8 |
| 9 #include "base/bind.h" |
9 #include "base/command_line.h" | 10 #include "base/command_line.h" |
10 #include "base/file_util.h" | 11 #include "base/file_util.h" |
11 #include "base/files/file_path.h" | 12 #include "base/files/file_path.h" |
12 #include "base/strings/string_split.h" | 13 #include "base/strings/string_split.h" |
13 #include "base/strings/string_util.h" | 14 #include "base/strings/string_util.h" |
14 #include "build/build_config.h" | 15 #include "build/build_config.h" |
15 #include "tools/gn/filesystem_utils.h" | 16 #include "tools/gn/filesystem_utils.h" |
16 #include "tools/gn/input_file.h" | 17 #include "tools/gn/input_file.h" |
17 #include "tools/gn/parse_tree.h" | 18 #include "tools/gn/parse_tree.h" |
18 #include "tools/gn/parser.h" | 19 #include "tools/gn/parser.h" |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 base::string16 ending_in1 = L"depot_tools\\"; | 135 base::string16 ending_in1 = L"depot_tools\\"; |
135 base::FilePath::StringType ending_in2 = FILE_PATH_LITERAL("depot_tools"); | 136 base::FilePath::StringType ending_in2 = FILE_PATH_LITERAL("depot_tools"); |
136 | 137 |
137 base::FilePath found = GetPathEndingIn(components, ending_in1); | 138 base::FilePath found = GetPathEndingIn(components, ending_in1); |
138 if (!found.empty()) | 139 if (!found.empty()) |
139 return found; | 140 return found; |
140 return GetPathEndingIn(components, ending_in2); | 141 return GetPathEndingIn(components, ending_in2); |
141 } | 142 } |
142 #endif | 143 #endif |
143 | 144 |
| 145 // Called on any thread. Post the item to the builder on the main thread. |
| 146 void ItemDefinedCallback(base::MessageLoop* main_loop, |
| 147 scoped_refptr<Builder> builder, |
| 148 scoped_ptr<Item> item) { |
| 149 DCHECK(item); |
| 150 main_loop->PostTask(FROM_HERE, base::Bind(&Builder::ItemDefined, builder, |
| 151 base::Passed(&item))); |
| 152 } |
| 153 |
| 154 void DecrementWorkCount() { |
| 155 g_scheduler->DecrementWorkCount(); |
| 156 } |
| 157 |
144 } // namespace | 158 } // namespace |
145 | 159 |
146 // CommonSetup ----------------------------------------------------------------- | 160 // CommonSetup ----------------------------------------------------------------- |
147 | 161 |
148 CommonSetup::CommonSetup() | 162 CommonSetup::CommonSetup() |
149 : check_for_bad_items_(true) { | 163 : build_settings_(), |
| 164 loader_(new LoaderImpl(&build_settings_)), |
| 165 builder_(new Builder(loader_.get())), |
| 166 check_for_bad_items_(true) { |
| 167 loader_->set_complete_callback(base::Bind(&DecrementWorkCount)); |
150 } | 168 } |
151 | 169 |
152 CommonSetup::CommonSetup(const CommonSetup& other) | 170 CommonSetup::CommonSetup(const CommonSetup& other) |
153 : build_settings_(other.build_settings_), | 171 : build_settings_(other.build_settings_), |
| 172 loader_(new LoaderImpl(&build_settings_)), |
| 173 builder_(new Builder(loader_.get())), |
154 check_for_bad_items_(other.check_for_bad_items_) { | 174 check_for_bad_items_(other.check_for_bad_items_) { |
| 175 loader_->set_complete_callback(base::Bind(&DecrementWorkCount)); |
155 } | 176 } |
156 | 177 |
157 CommonSetup::~CommonSetup() { | 178 CommonSetup::~CommonSetup() { |
158 } | 179 } |
159 | 180 |
160 void CommonSetup::RunPreMessageLoop() { | 181 void CommonSetup::RunPreMessageLoop() { |
161 // Load the root build file. | 182 // Load the root build file. |
162 build_settings_.toolchain_manager().StartLoadingUnlocked( | 183 loader_->Load(SourceFile("//BUILD.gn"), Label()); |
163 SourceFile("//BUILD.gn")); | 184 |
| 185 // Will be decremented with the loader is drained. |
| 186 g_scheduler->IncrementWorkCount(); |
164 } | 187 } |
165 | 188 |
166 bool CommonSetup::RunPostMessageLoop() { | 189 bool CommonSetup::RunPostMessageLoop() { |
167 Err err; | 190 Err err; |
168 if (check_for_bad_items_) { | 191 if (check_for_bad_items_) { |
169 err = build_settings_.item_tree().CheckForBadItems(); | 192 if (!builder_->CheckForBadItems(&err)) { |
170 if (err.has_error()) { | |
171 err.PrintToStdout(); | 193 err.PrintToStdout(); |
172 return false; | 194 return false; |
173 } | 195 } |
174 } | 196 } |
175 | 197 |
176 if (!build_settings_.build_args().VerifyAllOverridesUsed(&err)) { | 198 if (!build_settings_.build_args().VerifyAllOverridesUsed(&err)) { |
177 err.PrintToStdout(); | 199 err.PrintToStdout(); |
178 return false; | 200 return false; |
179 } | 201 } |
180 | 202 |
181 // Write out tracing and timing if requested. | 203 // Write out tracing and timing if requested. |
182 const CommandLine* cmdline = CommandLine::ForCurrentProcess(); | 204 const CommandLine* cmdline = CommandLine::ForCurrentProcess(); |
183 if (cmdline->HasSwitch(kTimeSwitch)) | 205 if (cmdline->HasSwitch(kTimeSwitch)) |
184 PrintLongHelp(SummarizeTraces()); | 206 PrintLongHelp(SummarizeTraces()); |
185 if (cmdline->HasSwitch(kTracelogSwitch)) | 207 if (cmdline->HasSwitch(kTracelogSwitch)) |
186 SaveTraces(cmdline->GetSwitchValuePath(kTracelogSwitch)); | 208 SaveTraces(cmdline->GetSwitchValuePath(kTracelogSwitch)); |
187 | 209 |
188 return true; | 210 return true; |
189 } | 211 } |
190 | 212 |
191 // Setup ----------------------------------------------------------------------- | 213 // Setup ----------------------------------------------------------------------- |
192 | 214 |
193 Setup::Setup() | 215 Setup::Setup() |
194 : CommonSetup(), | 216 : CommonSetup(), |
195 empty_settings_(&empty_build_settings_, std::string()), | 217 empty_settings_(&empty_build_settings_, std::string()), |
196 dotfile_scope_(&empty_settings_) { | 218 dotfile_scope_(&empty_settings_) { |
197 empty_settings_.set_toolchain_label(Label()); | 219 empty_settings_.set_toolchain_label(Label()); |
| 220 build_settings_.set_item_defined_callback( |
| 221 base::Bind(&ItemDefinedCallback, scheduler_.main_loop(), builder_)); |
| 222 |
| 223 // The scheduler's main loop wasn't created when the Loader was created, so |
| 224 // we need to set it now. |
| 225 loader_->set_main_loop(scheduler_.main_loop()); |
198 } | 226 } |
199 | 227 |
200 Setup::~Setup() { | 228 Setup::~Setup() { |
201 } | 229 } |
202 | 230 |
203 bool Setup::DoSetup() { | 231 bool Setup::DoSetup() { |
204 CommandLine* cmdline = CommandLine::ForCurrentProcess(); | 232 CommandLine* cmdline = CommandLine::ForCurrentProcess(); |
205 | 233 |
206 scheduler_.set_verbose_logging(cmdline->HasSwitch(kSwitchVerbose)); | 234 scheduler_.set_verbose_logging(cmdline->HasSwitch(kSwitchVerbose)); |
207 if (cmdline->HasSwitch(kTimeSwitch) || | 235 if (cmdline->HasSwitch(kTimeSwitch) || |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
404 return false; | 432 return false; |
405 } | 433 } |
406 build_settings_.set_build_config_file( | 434 build_settings_.set_build_config_file( |
407 SourceFile(build_config_value->string_value())); | 435 SourceFile(build_config_value->string_value())); |
408 | 436 |
409 return true; | 437 return true; |
410 } | 438 } |
411 | 439 |
412 // DependentSetup -------------------------------------------------------------- | 440 // DependentSetup -------------------------------------------------------------- |
413 | 441 |
414 DependentSetup::DependentSetup(const Setup& main_setup) | 442 DependentSetup::DependentSetup(Setup& main_setup) |
415 : CommonSetup(main_setup) { | 443 : CommonSetup(main_setup) { |
| 444 build_settings_.set_item_defined_callback( |
| 445 base::Bind(&ItemDefinedCallback, main_setup.scheduler().main_loop(), |
| 446 builder_)); |
416 } | 447 } |
417 | 448 |
418 DependentSetup::~DependentSetup() { | 449 DependentSetup::~DependentSetup() { |
419 } | 450 } |
420 | 451 |
421 void DependentSetup::RunPreMessageLoop() { | 452 void DependentSetup::RunPreMessageLoop() { |
422 CommonSetup::RunPreMessageLoop(); | 453 CommonSetup::RunPreMessageLoop(); |
423 } | 454 } |
424 | 455 |
425 bool DependentSetup::RunPostMessageLoop() { | 456 bool DependentSetup::RunPostMessageLoop() { |
426 return CommonSetup::RunPostMessageLoop(); | 457 return CommonSetup::RunPostMessageLoop(); |
427 } | 458 } |
428 | 459 |
OLD | NEW |