Index: tools/gn/ninja_build_writer.cc |
diff --git a/tools/gn/ninja_build_writer.cc b/tools/gn/ninja_build_writer.cc |
index d27ce2d9216d24bccb7fdfdf2843401141c790d2..d28969084eea60e485a8471e302c2fe8fe5af485 100644 |
--- a/tools/gn/ninja_build_writer.cc |
+++ b/tools/gn/ninja_build_writer.cc |
@@ -114,8 +114,12 @@ Err GetDuplicateOutputError(const std::vector<const Target*>& all_targets, |
const OutputFile& bad_output) { |
std::vector<const Target*> matches; |
for (const Target* target : all_targets) { |
- if (GetTargetOutputFile(target) == bad_output) |
- matches.push_back(target); |
+ for (const auto& output : target->computed_outputs()) { |
+ if (output == bad_output) { |
+ matches.push_back(target); |
+ break; |
+ } |
+ } |
} |
// There should always be at least two targets generating this file for this |
@@ -127,11 +131,10 @@ Err GetDuplicateOutputError(const std::vector<const Target*>& all_targets, |
Err result(matches[0]->defined_from(), "Duplicate output file.", |
"Two or more targets generate the same output:\n " + |
- bad_output.value() + "\n" |
- "This is normally the result of either overriding the output name or\n" |
- "having two shared libraries or executables in different directories\n" |
- "with the same name (since all such targets will be written to the root\n" |
- "output directory).\n\nCollisions:\n" + matches_string); |
+ bad_output.value() + "\n\n" |
+ "This is can often be fixed by changing one of the target names, or by \n" |
+ "setting an output_name on one of them.\n" |
+ "\nCollisions:\n" + matches_string); |
for (size_t i = 1; i < matches.size(); i++) |
result.AppendSubErr(Err(matches[i]->defined_from(), "Collision.")); |
return result; |
@@ -294,12 +297,14 @@ bool NinjaBuildWriter::WritePhonyAndAllRules(Err* err) { |
for (const auto& target : default_toolchain_targets_) { |
const Label& label = target->label(); |
- OutputFile target_file = GetTargetOutputFile(target); |
- if (!target_files.insert(target_file.value()).second) { |
- *err = GetDuplicateOutputError(default_toolchain_targets_, target_file); |
- return false; |
+ for (const auto& output : target->computed_outputs()) { |
+ if (!target_files.insert(output.value()).second) { |
+ *err = GetDuplicateOutputError(default_toolchain_targets_, output); |
+ return false; |
+ } |
} |
+ OutputFile target_file = GetTargetOutputFile(target); |
// Write the long name "foo/bar:baz" for the target "//foo/bar:baz". |
std::string long_name = label.GetUserVisibleName(false); |
base::TrimString(long_name, "/", &long_name); |