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

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

Issue 2152413002: GN: don't write separate files for non-binary targets (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: typo Created 4 years, 4 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/ninja_toolchain_writer.h ('k') | tools/gn/ninja_toolchain_writer_unittest.cc » ('j') | 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/ninja_toolchain_writer.h" 5 #include "tools/gn/ninja_toolchain_writer.h"
6 6
7 #include <fstream> 7 #include <fstream>
8 8
9 #include "base/files/file_util.h" 9 #include "base/files/file_util.h"
10 #include "base/strings/stringize_macros.h" 10 #include "base/strings/stringize_macros.h"
11 #include "tools/gn/build_settings.h" 11 #include "tools/gn/build_settings.h"
12 #include "tools/gn/filesystem_utils.h" 12 #include "tools/gn/filesystem_utils.h"
13 #include "tools/gn/ninja_utils.h" 13 #include "tools/gn/ninja_utils.h"
14 #include "tools/gn/pool.h" 14 #include "tools/gn/pool.h"
15 #include "tools/gn/settings.h" 15 #include "tools/gn/settings.h"
16 #include "tools/gn/substitution_writer.h" 16 #include "tools/gn/substitution_writer.h"
17 #include "tools/gn/target.h" 17 #include "tools/gn/target.h"
18 #include "tools/gn/toolchain.h" 18 #include "tools/gn/toolchain.h"
19 #include "tools/gn/trace.h" 19 #include "tools/gn/trace.h"
20 20
21 namespace { 21 namespace {
22 22
23 const char kIndent[] = " "; 23 const char kIndent[] = " ";
24 24
25 } // namespace 25 } // namespace
26 26
27 NinjaToolchainWriter::NinjaToolchainWriter( 27 NinjaToolchainWriter::NinjaToolchainWriter(
28 const Settings* settings, 28 const Settings* settings,
29 const Toolchain* toolchain, 29 const Toolchain* toolchain,
30 const std::vector<const Target*>& targets,
31 std::ostream& out) 30 std::ostream& out)
32 : settings_(settings), 31 : settings_(settings),
33 toolchain_(toolchain), 32 toolchain_(toolchain),
34 targets_(targets),
35 out_(out), 33 out_(out),
36 path_output_(settings_->build_settings()->build_dir(), 34 path_output_(settings_->build_settings()->build_dir(),
37 settings_->build_settings()->root_path_utf8(), 35 settings_->build_settings()->root_path_utf8(),
38 ESCAPE_NINJA) { 36 ESCAPE_NINJA) {
39 } 37 }
40 38
41 NinjaToolchainWriter::~NinjaToolchainWriter() { 39 NinjaToolchainWriter::~NinjaToolchainWriter() {
42 } 40 }
43 41
44 void NinjaToolchainWriter::Run() { 42 void NinjaToolchainWriter::Run(
45 WriteRules(); 43 const std::vector<NinjaWriter::TargetRulePair>& rules) {
46 WriteSubninjas(); 44 std::string rule_prefix = GetNinjaRulePrefixForToolchain(settings_);
45
46 for (int i = Toolchain::TYPE_NONE + 1; i < Toolchain::TYPE_NUMTYPES; i++) {
47 Toolchain::ToolType tool_type = static_cast<Toolchain::ToolType>(i);
48 const Tool* tool = toolchain_->GetTool(tool_type);
49 if (tool)
50 WriteToolRule(tool_type, tool, rule_prefix);
51 }
52 out_ << std::endl;
53
54 for (const auto& pair : rules)
55 out_ << pair.second;
47 } 56 }
48 57
49 // static 58 // static
50 bool NinjaToolchainWriter::RunAndWriteFile( 59 bool NinjaToolchainWriter::RunAndWriteFile(
51 const Settings* settings, 60 const Settings* settings,
52 const Toolchain* toolchain, 61 const Toolchain* toolchain,
53 const std::vector<const Target*>& targets) { 62 const std::vector<NinjaWriter::TargetRulePair>& rules) {
54 base::FilePath ninja_file(settings->build_settings()->GetFullPath( 63 base::FilePath ninja_file(settings->build_settings()->GetFullPath(
55 GetNinjaFileForToolchain(settings))); 64 GetNinjaFileForToolchain(settings)));
56 ScopedTrace trace(TraceItem::TRACE_FILE_WRITE, FilePathToUTF8(ninja_file)); 65 ScopedTrace trace(TraceItem::TRACE_FILE_WRITE, FilePathToUTF8(ninja_file));
57 66
58 base::CreateDirectory(ninja_file.DirName()); 67 base::CreateDirectory(ninja_file.DirName());
59 68
60 std::ofstream file; 69 std::ofstream file;
61 file.open(FilePathToUTF8(ninja_file).c_str(), 70 file.open(FilePathToUTF8(ninja_file).c_str(),
62 std::ios_base::out | std::ios_base::binary); 71 std::ios_base::out | std::ios_base::binary);
63 if (file.fail()) 72 if (file.fail())
64 return false; 73 return false;
65 74
66 NinjaToolchainWriter gen(settings, toolchain, targets, file); 75 NinjaToolchainWriter gen(settings, toolchain, file);
67 gen.Run(); 76 gen.Run(rules);
68 return true; 77 return true;
69 } 78 }
70 79
71 void NinjaToolchainWriter::WriteRules() {
72 std::string rule_prefix = GetNinjaRulePrefixForToolchain(settings_);
73
74 for (int i = Toolchain::TYPE_NONE + 1; i < Toolchain::TYPE_NUMTYPES; i++) {
75 Toolchain::ToolType tool_type = static_cast<Toolchain::ToolType>(i);
76 const Tool* tool = toolchain_->GetTool(tool_type);
77 if (tool)
78 WriteToolRule(tool_type, tool, rule_prefix);
79 }
80 out_ << std::endl;
81 }
82
83 void NinjaToolchainWriter::WriteToolRule(const Toolchain::ToolType type, 80 void NinjaToolchainWriter::WriteToolRule(const Toolchain::ToolType type,
84 const Tool* tool, 81 const Tool* tool,
85 const std::string& rule_prefix) { 82 const std::string& rule_prefix) {
86 out_ << "rule " << rule_prefix << Toolchain::ToolTypeToName(type) 83 out_ << "rule " << rule_prefix << Toolchain::ToolTypeToName(type)
87 << std::endl; 84 << std::endl;
88 85
89 // Rules explicitly include shell commands, so don't try to escape. 86 // Rules explicitly include shell commands, so don't try to escape.
90 EscapeOptions options; 87 EscapeOptions options;
91 options.mode = ESCAPE_NINJA_PREFORMATTED_COMMAND; 88 options.mode = ESCAPE_NINJA_PREFORMATTED_COMMAND;
92 89
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 123
127 void NinjaToolchainWriter::WriteRulePattern(const char* name, 124 void NinjaToolchainWriter::WriteRulePattern(const char* name,
128 const SubstitutionPattern& pattern, 125 const SubstitutionPattern& pattern,
129 const EscapeOptions& options) { 126 const EscapeOptions& options) {
130 if (pattern.empty()) 127 if (pattern.empty())
131 return; 128 return;
132 out_ << kIndent << name << " = "; 129 out_ << kIndent << name << " = ";
133 SubstitutionWriter::WriteWithNinjaVariables(pattern, options, out_); 130 SubstitutionWriter::WriteWithNinjaVariables(pattern, options, out_);
134 out_ << std::endl; 131 out_ << std::endl;
135 } 132 }
136
137 void NinjaToolchainWriter::WriteSubninjas() {
138 // Write subninja commands for each generated target.
139 for (auto* target : targets_) {
140 OutputFile ninja_file(target->settings()->build_settings(),
141 GetNinjaFileForTarget(target));
142 out_ << "subninja ";
143 path_output_.WriteFile(out_, ninja_file);
144 out_ << std::endl;
145 }
146 out_ << std::endl;
147 }
OLDNEW
« no previous file with comments | « tools/gn/ninja_toolchain_writer.h ('k') | tools/gn/ninja_toolchain_writer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698