| 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_target_writer.h" | 5 #include "tools/gn/ninja_target_writer.h" |
| 6 | 6 |
| 7 #include <fstream> | 7 #include <fstream> |
| 8 #include <sstream> | 8 #include <sstream> |
| 9 | 9 |
| 10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 79 | 79 |
| 80 std::string contents = file.str(); | 80 std::string contents = file.str(); |
| 81 base::WriteFile(ninja_file, contents.c_str(), | 81 base::WriteFile(ninja_file, contents.c_str(), |
| 82 static_cast<int>(contents.size())); | 82 static_cast<int>(contents.size())); |
| 83 } | 83 } |
| 84 | 84 |
| 85 std::string NinjaTargetWriter::WriteInputDepsStampAndGetDep( | 85 std::string NinjaTargetWriter::WriteInputDepsStampAndGetDep( |
| 86 const std::vector<const Target*>& extra_hard_deps) const { | 86 const std::vector<const Target*>& extra_hard_deps) const { |
| 87 // For an action (where we run a script only once) the sources are the same | 87 // For an action (where we run a script only once) the sources are the same |
| 88 // as the source prereqs. | 88 // as the source prereqs. |
| 89 bool list_sources_as_input_deps = target_->output_type() == Target::ACTION; | 89 bool list_sources_as_input_deps = (target_->output_type() == Target::ACTION); |
| 90 | 90 |
| 91 // Actions get implicit dependencies on the script itself. | 91 // Actions get implicit dependencies on the script itself. |
| 92 bool add_script_source_as_dep = target_->output_type() == Target::ACTION || | 92 bool add_script_source_as_dep = |
| 93 target_->output_type() == Target::ACTION_FOREACH; | 93 (target_->output_type() == Target::ACTION) || |
| 94 (target_->output_type() == Target::ACTION_FOREACH); |
| 94 | 95 |
| 95 if (!add_script_source_as_dep && | 96 if (!add_script_source_as_dep && |
| 96 extra_hard_deps.empty() && | 97 extra_hard_deps.empty() && |
| 97 target_->inputs().empty() && | 98 target_->inputs().empty() && |
| 98 target_->recursive_hard_deps().empty() && | 99 target_->recursive_hard_deps().empty() && |
| 99 (!list_sources_as_input_deps || target_->sources().empty())) | 100 (!list_sources_as_input_deps || target_->sources().empty()) && |
| 101 toolchain_->deps().empty()) |
| 100 return std::string(); // No input/hard deps. | 102 return std::string(); // No input/hard deps. |
| 101 | 103 |
| 102 // One potential optimization is if there are few input dependencies (or | 104 // One potential optimization is if there are few input dependencies (or |
| 103 // potentially few sources that depend on these) it's better to just write | 105 // potentially few sources that depend on these) it's better to just write |
| 104 // all hard deps on each sources line than have this intermediate stamp. We | 106 // all hard deps on each sources line than have this intermediate stamp. We |
| 105 // do the stamp file because duplicating all the order-only deps for each | 107 // do the stamp file because duplicating all the order-only deps for each |
| 106 // source file can really explode the ninja file but this won't be the most | 108 // source file can really explode the ninja file but this won't be the most |
| 107 // optimal thing in all cases. | 109 // optimal thing in all cases. |
| 108 | 110 |
| 109 OutputFile input_stamp_file = helper_.GetTargetOutputDir(target_); | 111 OutputFile input_stamp_file = helper_.GetTargetOutputDir(target_); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 138 } | 140 } |
| 139 | 141 |
| 140 // Add on any hard deps that are direct or indirect dependencies. | 142 // Add on any hard deps that are direct or indirect dependencies. |
| 141 const std::set<const Target*>& hard_deps = target_->recursive_hard_deps(); | 143 const std::set<const Target*>& hard_deps = target_->recursive_hard_deps(); |
| 142 for (std::set<const Target*>::const_iterator i = hard_deps.begin(); | 144 for (std::set<const Target*>::const_iterator i = hard_deps.begin(); |
| 143 i != hard_deps.end(); ++i) { | 145 i != hard_deps.end(); ++i) { |
| 144 out_ << " "; | 146 out_ << " "; |
| 145 path_output_.WriteFile(out_, helper_.GetTargetOutputFile(*i)); | 147 path_output_.WriteFile(out_, helper_.GetTargetOutputFile(*i)); |
| 146 } | 148 } |
| 147 | 149 |
| 150 // Toolchain dependencies. These must be resolved before doing anything. |
| 151 // This just writs all toolchain deps for simplicity. If we find that |
| 152 // toolchains often have more than one dependency, we could consider writing |
| 153 // a toolchain-specific stamp file and only include the stamp here. |
| 154 const LabelTargetVector& toolchain_deps = toolchain_->deps(); |
| 155 for (size_t i = 0; i < toolchain_deps.size(); i++) { |
| 156 out_ << " "; |
| 157 path_output_.WriteFile(out_, |
| 158 helper_.GetTargetOutputFile(toolchain_deps[i].ptr)); |
| 159 } |
| 160 |
| 148 // Extra hard deps passed in. | 161 // Extra hard deps passed in. |
| 149 for (size_t i = 0; i < extra_hard_deps.size(); i++) { | 162 for (size_t i = 0; i < extra_hard_deps.size(); i++) { |
| 150 out_ << " "; | 163 out_ << " "; |
| 151 path_output_.WriteFile(out_, | 164 path_output_.WriteFile(out_, |
| 152 helper_.GetTargetOutputFile(extra_hard_deps[i])); | 165 helper_.GetTargetOutputFile(extra_hard_deps[i])); |
| 153 } | 166 } |
| 154 | 167 |
| 155 out_ << "\n"; | 168 out_ << "\n"; |
| 156 return " | " + stamp_file_string; | 169 return " | " + stamp_file_string; |
| 157 } | 170 } |
| 158 | 171 |
| 159 FileTemplate NinjaTargetWriter::GetOutputTemplate() const { | 172 FileTemplate NinjaTargetWriter::GetOutputTemplate() const { |
| 160 const Target::FileList& outputs = target_->action_values().outputs(); | 173 const Target::FileList& outputs = target_->action_values().outputs(); |
| 161 std::vector<std::string> output_template_args; | 174 std::vector<std::string> output_template_args; |
| 162 for (size_t i = 0; i < outputs.size(); i++) { | 175 for (size_t i = 0; i < outputs.size(); i++) { |
| 163 // All outputs should be in the output dir. | 176 // All outputs should be in the output dir. |
| 164 output_template_args.push_back( | 177 output_template_args.push_back( |
| 165 RemovePrefix(outputs[i].value(), | 178 RemovePrefix(outputs[i].value(), |
| 166 settings_->build_settings()->build_dir().value())); | 179 settings_->build_settings()->build_dir().value())); |
| 167 } | 180 } |
| 168 return FileTemplate(target_->settings(), output_template_args); | 181 return FileTemplate(target_->settings(), output_template_args); |
| 169 } | 182 } |
| OLD | NEW |