| 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/ninja_build_writer.h" | 5 #include "tools/gn/ninja_build_writer.h" |
| 6 | 6 |
| 7 #include <fstream> | 7 #include <fstream> |
| 8 #include <map> | 8 #include <map> |
| 9 | 9 |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 #else | 68 #else |
| 69 return cmdline.GetCommandLineString(); | 69 return cmdline.GetCommandLineString(); |
| 70 #endif | 70 #endif |
| 71 } | 71 } |
| 72 | 72 |
| 73 } // namespace | 73 } // namespace |
| 74 | 74 |
| 75 NinjaBuildWriter::NinjaBuildWriter( | 75 NinjaBuildWriter::NinjaBuildWriter( |
| 76 const BuildSettings* build_settings, | 76 const BuildSettings* build_settings, |
| 77 const std::vector<const Settings*>& all_settings, | 77 const std::vector<const Settings*>& all_settings, |
| 78 const Toolchain* default_toolchain, |
| 78 const std::vector<const Target*>& default_toolchain_targets, | 79 const std::vector<const Target*>& default_toolchain_targets, |
| 79 std::ostream& out, | 80 std::ostream& out, |
| 80 std::ostream& dep_out) | 81 std::ostream& dep_out) |
| 81 : build_settings_(build_settings), | 82 : build_settings_(build_settings), |
| 82 all_settings_(all_settings), | 83 all_settings_(all_settings), |
| 84 default_toolchain_(default_toolchain), |
| 83 default_toolchain_targets_(default_toolchain_targets), | 85 default_toolchain_targets_(default_toolchain_targets), |
| 84 out_(out), | 86 out_(out), |
| 85 dep_out_(dep_out), | 87 dep_out_(dep_out), |
| 86 path_output_(build_settings->build_dir(), ESCAPE_NINJA) { | 88 path_output_(build_settings->build_dir(), ESCAPE_NINJA) { |
| 87 } | 89 } |
| 88 | 90 |
| 89 NinjaBuildWriter::~NinjaBuildWriter() { | 91 NinjaBuildWriter::~NinjaBuildWriter() { |
| 90 } | 92 } |
| 91 | 93 |
| 92 void NinjaBuildWriter::Run() { | 94 void NinjaBuildWriter::Run() { |
| 93 WriteNinjaRules(); | 95 WriteNinjaRules(); |
| 96 WriteLinkPool(); |
| 94 WriteSubninjas(); | 97 WriteSubninjas(); |
| 95 WritePhonyAndAllRules(); | 98 WritePhonyAndAllRules(); |
| 96 } | 99 } |
| 97 | 100 |
| 98 // static | 101 // static |
| 99 bool NinjaBuildWriter::RunAndWriteFile( | 102 bool NinjaBuildWriter::RunAndWriteFile( |
| 100 const BuildSettings* build_settings, | 103 const BuildSettings* build_settings, |
| 101 const std::vector<const Settings*>& all_settings, | 104 const std::vector<const Settings*>& all_settings, |
| 105 const Toolchain* default_toolchain, |
| 102 const std::vector<const Target*>& default_toolchain_targets) { | 106 const std::vector<const Target*>& default_toolchain_targets) { |
| 103 ScopedTrace trace(TraceItem::TRACE_FILE_WRITE, "build.ninja"); | 107 ScopedTrace trace(TraceItem::TRACE_FILE_WRITE, "build.ninja"); |
| 104 | 108 |
| 105 base::FilePath ninja_file(build_settings->GetFullPath( | 109 base::FilePath ninja_file(build_settings->GetFullPath( |
| 106 SourceFile(build_settings->build_dir().value() + "build.ninja"))); | 110 SourceFile(build_settings->build_dir().value() + "build.ninja"))); |
| 107 base::CreateDirectory(ninja_file.DirName()); | 111 base::CreateDirectory(ninja_file.DirName()); |
| 108 | 112 |
| 109 std::ofstream file; | 113 std::ofstream file; |
| 110 file.open(FilePathToUTF8(ninja_file).c_str(), | 114 file.open(FilePathToUTF8(ninja_file).c_str(), |
| 111 std::ios_base::out | std::ios_base::binary); | 115 std::ios_base::out | std::ios_base::binary); |
| 112 if (file.fail()) | 116 if (file.fail()) |
| 113 return false; | 117 return false; |
| 114 | 118 |
| 115 std::ofstream depfile; | 119 std::ofstream depfile; |
| 116 depfile.open((FilePathToUTF8(ninja_file) + ".d").c_str(), | 120 depfile.open((FilePathToUTF8(ninja_file) + ".d").c_str(), |
| 117 std::ios_base::out | std::ios_base::binary); | 121 std::ios_base::out | std::ios_base::binary); |
| 118 if (depfile.fail()) | 122 if (depfile.fail()) |
| 119 return false; | 123 return false; |
| 120 | 124 |
| 121 NinjaBuildWriter gen(build_settings, all_settings, | 125 NinjaBuildWriter gen(build_settings, all_settings, default_toolchain, |
| 122 default_toolchain_targets, file, depfile); | 126 default_toolchain_targets, file, depfile); |
| 123 gen.Run(); | 127 gen.Run(); |
| 124 return true; | 128 return true; |
| 125 } | 129 } |
| 126 | 130 |
| 127 void NinjaBuildWriter::WriteNinjaRules() { | 131 void NinjaBuildWriter::WriteNinjaRules() { |
| 128 out_ << "rule gn\n"; | 132 out_ << "rule gn\n"; |
| 129 out_ << " command = " << GetSelfInvocationCommand(build_settings_) << "\n"; | 133 out_ << " command = " << GetSelfInvocationCommand(build_settings_) << "\n"; |
| 130 out_ << " description = Regenerating ninja files\n\n"; | 134 out_ << " description = Regenerating ninja files\n\n"; |
| 131 | 135 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 145 dep_out_ << " " << FilePathToUTF8(input_files[i]); | 149 dep_out_ << " " << FilePathToUTF8(input_files[i]); |
| 146 | 150 |
| 147 // Other files read by the build. | 151 // Other files read by the build. |
| 148 std::vector<base::FilePath> other_files = g_scheduler->GetGenDependencies(); | 152 std::vector<base::FilePath> other_files = g_scheduler->GetGenDependencies(); |
| 149 for (size_t i = 0; i < other_files.size(); i++) | 153 for (size_t i = 0; i < other_files.size(); i++) |
| 150 dep_out_ << " " << FilePathToUTF8(other_files[i]); | 154 dep_out_ << " " << FilePathToUTF8(other_files[i]); |
| 151 | 155 |
| 152 out_ << std::endl; | 156 out_ << std::endl; |
| 153 } | 157 } |
| 154 | 158 |
| 159 void NinjaBuildWriter::WriteLinkPool() { |
| 160 out_ << "pool link_pool\n" |
| 161 << " depth = " << default_toolchain_->concurrent_links() << std::endl |
| 162 << std::endl; |
| 163 } |
| 164 |
| 155 void NinjaBuildWriter::WriteSubninjas() { | 165 void NinjaBuildWriter::WriteSubninjas() { |
| 156 for (size_t i = 0; i < all_settings_.size(); i++) { | 166 for (size_t i = 0; i < all_settings_.size(); i++) { |
| 157 out_ << "subninja "; | 167 out_ << "subninja "; |
| 158 path_output_.WriteFile(out_, GetNinjaFileForToolchain(all_settings_[i])); | 168 path_output_.WriteFile(out_, GetNinjaFileForToolchain(all_settings_[i])); |
| 159 out_ << std::endl; | 169 out_ << std::endl; |
| 160 } | 170 } |
| 161 out_ << std::endl; | 171 out_ << std::endl; |
| 162 } | 172 } |
| 163 | 173 |
| 164 void NinjaBuildWriter::WritePhonyAndAllRules() { | 174 void NinjaBuildWriter::WritePhonyAndAllRules() { |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 245 EscapeOptions ninja_escape; | 255 EscapeOptions ninja_escape; |
| 246 ninja_escape.mode = ESCAPE_NINJA; | 256 ninja_escape.mode = ESCAPE_NINJA; |
| 247 | 257 |
| 248 // Escape for special chars Ninja will handle. | 258 // Escape for special chars Ninja will handle. |
| 249 std::string escaped = EscapeString(phony_name, ninja_escape, NULL); | 259 std::string escaped = EscapeString(phony_name, ninja_escape, NULL); |
| 250 | 260 |
| 251 out_ << "build " << escaped << ": phony "; | 261 out_ << "build " << escaped << ": phony "; |
| 252 path_output_.WriteFile(out_, target_file); | 262 path_output_.WriteFile(out_, target_file); |
| 253 out_ << std::endl; | 263 out_ << std::endl; |
| 254 } | 264 } |
| OLD | NEW |