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

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

Issue 2936773006: Allow overriding script executable in .gn file (Closed)
Patch Set: Windows path handling Created 3 years, 6 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
« no previous file with comments | « tools/gn/setup.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/setup.h" 5 #include "tools/gn/setup.h"
6 6
7 #include <stdlib.h> 7 #include <stdlib.h>
8 #include <algorithm> 8 #include <algorithm>
9 #include <sstream> 9 #include <sstream>
10 #include <utility> 10 #include <utility>
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 exec_script_whitelist = [ 91 exec_script_whitelist = [
92 "//base/BUILD.gn", 92 "//base/BUILD.gn",
93 "//build/my_config.gni", 93 "//build/my_config.gni",
94 ] 94 ]
95 95
96 root [optional] 96 root [optional]
97 Label of the root build target. The GN build will start by loading the 97 Label of the root build target. The GN build will start by loading the
98 build file containing this target name. This defaults to "//:" which will 98 build file containing this target name. This defaults to "//:" which will
99 cause the file //BUILD.gn to be loaded. 99 cause the file //BUILD.gn to be loaded.
100 100
101 script_executable [optional]
102 Path to specific Python executable or potentially a different language
103 interpreter that is used to execute scripts in action targets and
104 exec_script calls.
105
101 secondary_source [optional] 106 secondary_source [optional]
102 Label of an alternate directory tree to find input files. When searching 107 Label of an alternate directory tree to find input files. When searching
103 for a BUILD.gn file (or the build config file discussed above), the file 108 for a BUILD.gn file (or the build config file discussed above), the file
104 will first be looked for in the source root. If it's not found, the 109 will first be looked for in the source root. If it's not found, the
105 secondary source root will be checked (which would contain a parallel 110 secondary source root will be checked (which would contain a parallel
106 directory hierarchy). 111 directory hierarchy).
107 112
108 This behavior is intended to be used when BUILD.gn files can't be checked 113 This behavior is intended to be used when BUILD.gn files can't be checked
109 in to certain source directories for whatever reason. 114 in to certain source directories for whatever reason.
110 115
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 return false; 312 return false;
308 if (!RunConfigFile()) 313 if (!RunConfigFile())
309 return false; 314 return false;
310 if (!FillOtherConfig(*cmdline)) 315 if (!FillOtherConfig(*cmdline))
311 return false; 316 return false;
312 317
313 // Must be after FillSourceDir to resolve. 318 // Must be after FillSourceDir to resolve.
314 if (!FillBuildDir(build_dir, !force_create)) 319 if (!FillBuildDir(build_dir, !force_create))
315 return false; 320 return false;
316 321
317 // Check for unused variables in the .gn file.
318 Err err;
319 if (!dotfile_scope_.CheckForUnusedVars(&err)) {
320 err.PrintToStdout();
321 return false;
322 }
323
324 // Apply project-specific default (if specified). 322 // Apply project-specific default (if specified).
325 // Must happen before FillArguments(). 323 // Must happen before FillArguments().
326 if (default_args_) { 324 if (default_args_) {
327 Scope::KeyValueMap overrides; 325 Scope::KeyValueMap overrides;
328 default_args_->GetCurrentScopeValues(&overrides); 326 default_args_->GetCurrentScopeValues(&overrides);
329 build_settings_.build_args().AddArgOverrides(overrides); 327 build_settings_.build_args().AddArgOverrides(overrides);
330 } 328 }
331 329
332 if (fill_arguments_) { 330 if (fill_arguments_) {
333 if (!FillArguments(*cmdline)) 331 if (!FillArguments(*cmdline))
334 return false; 332 return false;
335 } 333 }
336 FillPythonPath(*cmdline); 334 if (!FillPythonPath(*cmdline))
335 return false;
336
337 // Check for unused variables in the .gn file.
338 Err err;
339 if (!dotfile_scope_.CheckForUnusedVars(&err)) {
340 err.PrintToStdout();
341 return false;
342 }
337 343
338 return true; 344 return true;
339 } 345 }
340 346
341 bool Setup::Run() { 347 bool Setup::Run() {
342 RunPreMessageLoop(); 348 RunPreMessageLoop();
343 if (!scheduler_.Run()) 349 if (!scheduler_.Run())
344 return false; 350 return false;
345 return RunPostMessageLoop(); 351 return RunPostMessageLoop();
346 } 352 }
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
619 "\nwhich doesn't seem to contain a previously-generated build.") 625 "\nwhich doesn't seem to contain a previously-generated build.")
620 .PrintToStdout(); 626 .PrintToStdout();
621 return false; 627 return false;
622 } 628 }
623 } 629 }
624 630
625 build_settings_.SetBuildDir(resolved); 631 build_settings_.SetBuildDir(resolved);
626 return true; 632 return true;
627 } 633 }
628 634
629 void Setup::FillPythonPath(const base::CommandLine& cmdline) { 635 bool Setup::FillPythonPath(const base::CommandLine& cmdline) {
630 // Trace this since it tends to be a bit slow on Windows. 636 // Trace this since it tends to be a bit slow on Windows.
631 ScopedTrace setup_trace(TraceItem::TRACE_SETUP, "Fill Python Path"); 637 ScopedTrace setup_trace(TraceItem::TRACE_SETUP, "Fill Python Path");
638 const Value* value = dotfile_scope_.GetValue("script_executable", true);
632 if (cmdline.HasSwitch(switches::kScriptExecutable)) { 639 if (cmdline.HasSwitch(switches::kScriptExecutable)) {
633 build_settings_.set_python_path( 640 build_settings_.set_python_path(
634 cmdline.GetSwitchValuePath(switches::kScriptExecutable)); 641 cmdline.GetSwitchValuePath(switches::kScriptExecutable));
642 } else if (value) {
643 Err err;
644 if (!value->VerifyTypeIs(Value::STRING, &err)) {
645 err.PrintToStdout();
646 return false;
647 }
648 build_settings_.set_python_path(
649 base::FilePath(UTF8ToFilePath(value->string_value())));
635 } else { 650 } else {
636 #if defined(OS_WIN) 651 #if defined(OS_WIN)
637 base::FilePath python_path = FindWindowsPython(); 652 base::FilePath python_path = FindWindowsPython();
638 if (python_path.empty()) { 653 if (python_path.empty()) {
639 scheduler_.Log("WARNING", "Could not find python on path, using " 654 scheduler_.Log("WARNING", "Could not find python on path, using "
640 "just \"python.exe\""); 655 "just \"python.exe\"");
641 python_path = base::FilePath(kPythonExeName); 656 python_path = base::FilePath(kPythonExeName);
642 } 657 }
643 build_settings_.set_python_path(python_path.NormalizePathSeparatorsTo('/')); 658 build_settings_.set_python_path(python_path.NormalizePathSeparatorsTo('/'));
644 #else 659 #else
645 build_settings_.set_python_path(base::FilePath("python")); 660 build_settings_.set_python_path(base::FilePath("python"));
646 #endif 661 #endif
647 } 662 }
663 return true;
648 } 664 }
649 665
650 bool Setup::RunConfigFile() { 666 bool Setup::RunConfigFile() {
651 if (scheduler_.verbose_logging()) 667 if (scheduler_.verbose_logging())
652 scheduler_.Log("Got dotfile", FilePathToUTF8(dotfile_name_)); 668 scheduler_.Log("Got dotfile", FilePathToUTF8(dotfile_name_));
653 669
654 dotfile_input_file_.reset(new InputFile(SourceFile("//.gn"))); 670 dotfile_input_file_.reset(new InputFile(SourceFile("//.gn")));
655 if (!dotfile_input_file_->Load(dotfile_name_)) { 671 if (!dotfile_input_file_->Load(dotfile_name_)) {
656 Err(Location(), "Could not load dotfile.", 672 Err(Location(), "Could not load dotfile.",
657 "The file \"" + FilePathToUTF8(dotfile_name_) + "\" couldn't be loaded") 673 "The file \"" + FilePathToUTF8(dotfile_name_) + "\" couldn't be loaded")
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
787 if (!arg_file_template_value->VerifyTypeIs(Value::STRING, &err)) { 803 if (!arg_file_template_value->VerifyTypeIs(Value::STRING, &err)) {
788 err.PrintToStdout(); 804 err.PrintToStdout();
789 return false; 805 return false;
790 } 806 }
791 SourceFile path(arg_file_template_value->string_value()); 807 SourceFile path(arg_file_template_value->string_value());
792 build_settings_.set_arg_file_template_path(path); 808 build_settings_.set_arg_file_template_path(path);
793 } 809 }
794 810
795 return true; 811 return true;
796 } 812 }
OLDNEW
« no previous file with comments | « tools/gn/setup.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698