| 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/target.h" | 5 #include "tools/gn/target.h" | 
| 6 | 6 | 
| 7 #include <stddef.h> | 7 #include <stddef.h> | 
| 8 | 8 | 
| 9 #include <algorithm> | 9 #include <algorithm> | 
| 10 | 10 | 
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 76 // to avoid duplicate checking. | 76 // to avoid duplicate checking. | 
| 77 // | 77 // | 
| 78 // Checking of object files is optional because it is much slower. This allows | 78 // Checking of object files is optional because it is much slower. This allows | 
| 79 // us to check targets for normal outputs, and then as a second pass check | 79 // us to check targets for normal outputs, and then as a second pass check | 
| 80 // object files (since we know it will be an error otherwise). This allows | 80 // object files (since we know it will be an error otherwise). This allows | 
| 81 // us to avoid computing all object file names in the common case. | 81 // us to avoid computing all object file names in the common case. | 
| 82 bool EnsureFileIsGeneratedByDependency(const Target* target, | 82 bool EnsureFileIsGeneratedByDependency(const Target* target, | 
| 83                                        const OutputFile& file, | 83                                        const OutputFile& file, | 
| 84                                        bool check_private_deps, | 84                                        bool check_private_deps, | 
| 85                                        bool consider_object_files, | 85                                        bool consider_object_files, | 
|  | 86                                        bool check_data_deps, | 
| 86                                        std::set<const Target*>* seen_targets) { | 87                                        std::set<const Target*>* seen_targets) { | 
| 87   if (seen_targets->find(target) != seen_targets->end()) | 88   if (seen_targets->find(target) != seen_targets->end()) | 
| 88     return false;  // Already checked this one and it's not found. | 89     return false;  // Already checked this one and it's not found. | 
| 89   seen_targets->insert(target); | 90   seen_targets->insert(target); | 
| 90 | 91 | 
| 91   // Assume that we have relatively few generated inputs so brute-force | 92   // Assume that we have relatively few generated inputs so brute-force | 
| 92   // searching here is OK. If this becomes a bottleneck, consider storing | 93   // searching here is OK. If this becomes a bottleneck, consider storing | 
| 93   // computed_outputs as a hash set. | 94   // computed_outputs as a hash set. | 
| 94   for (const OutputFile& cur : target->computed_outputs()) { | 95   for (const OutputFile& cur : target->computed_outputs()) { | 
| 95     if (file == cur) | 96     if (file == cur) | 
| 96       return true; | 97       return true; | 
| 97   } | 98   } | 
| 98 | 99 | 
|  | 100   if (file == target->write_runtime_deps_output()) { | 
|  | 101     return true; | 
|  | 102   } | 
|  | 103 | 
| 99   // Check binary target intermediate files if requested. | 104   // Check binary target intermediate files if requested. | 
| 100   if (consider_object_files && target->IsBinary()) { | 105   if (consider_object_files && target->IsBinary()) { | 
| 101     std::vector<OutputFile> source_outputs; | 106     std::vector<OutputFile> source_outputs; | 
| 102     for (const SourceFile& source : target->sources()) { | 107     for (const SourceFile& source : target->sources()) { | 
| 103       Toolchain::ToolType tool_type; | 108       Toolchain::ToolType tool_type; | 
| 104       if (!target->GetOutputFilesForSource(source, &tool_type, &source_outputs)) | 109       if (!target->GetOutputFilesForSource(source, &tool_type, &source_outputs)) | 
| 105         continue; | 110         continue; | 
| 106       if (std::find(source_outputs.begin(), source_outputs.end(), file) != | 111       if (std::find(source_outputs.begin(), source_outputs.end(), file) != | 
| 107           source_outputs.end()) | 112           source_outputs.end()) | 
| 108         return true; | 113         return true; | 
| 109     } | 114     } | 
| 110   } | 115   } | 
| 111 | 116 | 
|  | 117   if (check_data_deps) { | 
|  | 118     check_data_deps = false;  // Consider only direct data_deps. | 
|  | 119     for (const auto& pair : target->data_deps()) { | 
|  | 120       if (EnsureFileIsGeneratedByDependency(pair.ptr, file, false, | 
|  | 121                                             consider_object_files, | 
|  | 122                                             check_data_deps, seen_targets)) | 
|  | 123         return true;  // Found a path. | 
|  | 124     } | 
|  | 125   } | 
|  | 126 | 
| 112   // Check all public dependencies (don't do data ones since those are | 127   // Check all public dependencies (don't do data ones since those are | 
| 113   // runtime-only). | 128   // runtime-only). | 
| 114   for (const auto& pair : target->public_deps()) { | 129   for (const auto& pair : target->public_deps()) { | 
| 115     if (EnsureFileIsGeneratedByDependency(pair.ptr, file, false, | 130     if (EnsureFileIsGeneratedByDependency(pair.ptr, file, false, | 
| 116                                           consider_object_files, seen_targets)) | 131                                           consider_object_files, | 
|  | 132                                           check_data_deps, seen_targets)) | 
| 117       return true;  // Found a path. | 133       return true;  // Found a path. | 
| 118   } | 134   } | 
| 119 | 135 | 
| 120   // Only check private deps if requested. | 136   // Only check private deps if requested. | 
| 121   if (check_private_deps) { | 137   if (check_private_deps) { | 
| 122     for (const auto& pair : target->private_deps()) { | 138     for (const auto& pair : target->private_deps()) { | 
| 123       if (EnsureFileIsGeneratedByDependency(pair.ptr, file, false, | 139       if (EnsureFileIsGeneratedByDependency(pair.ptr, file, false, | 
| 124                                             consider_object_files, | 140                                             consider_object_files, | 
| 125                                             seen_targets)) | 141                                             check_data_deps, seen_targets)) | 
| 126         return true;  // Found a path. | 142         return true;  // Found a path. | 
| 127     } | 143     } | 
| 128   } | 144   } | 
| 129   return false; | 145   return false; | 
| 130 } | 146 } | 
| 131 | 147 | 
| 132 // check_this indicates if the given target should be matched against the | 148 // check_this indicates if the given target should be matched against the | 
| 133 // patterns. It should be set to false for the first call since assert_no_deps | 149 // patterns. It should be set to false for the first call since assert_no_deps | 
| 134 // shouldn't match the target itself. | 150 // shouldn't match the target itself. | 
| 135 // | 151 // | 
| (...skipping 618 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 754 void Target::CheckSourceGenerated(const SourceFile& source) const { | 770 void Target::CheckSourceGenerated(const SourceFile& source) const { | 
| 755   if (!IsStringInOutputDir(settings()->build_settings()->build_dir(), | 771   if (!IsStringInOutputDir(settings()->build_settings()->build_dir(), | 
| 756                            source.value())) | 772                            source.value())) | 
| 757     return;  // Not in output dir, this is OK. | 773     return;  // Not in output dir, this is OK. | 
| 758 | 774 | 
| 759   // Tell the scheduler about unknown files. This will be noted for later so | 775   // Tell the scheduler about unknown files. This will be noted for later so | 
| 760   // the list of files written by the GN build itself (often response files) | 776   // the list of files written by the GN build itself (often response files) | 
| 761   // can be filtered out of this list. | 777   // can be filtered out of this list. | 
| 762   OutputFile out_file(settings()->build_settings(), source); | 778   OutputFile out_file(settings()->build_settings(), source); | 
| 763   std::set<const Target*> seen_targets; | 779   std::set<const Target*> seen_targets; | 
| 764   if (!EnsureFileIsGeneratedByDependency(this, out_file, true, false, | 780   bool check_data_deps = false; | 
|  | 781   bool consider_object_files = false; | 
|  | 782   if (!EnsureFileIsGeneratedByDependency(this, out_file, true, | 
|  | 783                                          consider_object_files, check_data_deps, | 
| 765                                          &seen_targets)) { | 784                                          &seen_targets)) { | 
|  | 785     seen_targets.clear(); | 
|  | 786     // Allow dependency to be through data_deps for files generated by gn. | 
|  | 787     check_data_deps = g_scheduler->IsFileGeneratedByWriteRuntimeDeps(out_file); | 
| 766     // Check object files (much slower and very rare) only if the "normal" | 788     // Check object files (much slower and very rare) only if the "normal" | 
| 767     // output check failed. | 789     // output check failed. | 
| 768     seen_targets.clear(); | 790     consider_object_files = !check_data_deps; | 
| 769     if (!EnsureFileIsGeneratedByDependency(this, out_file, true, true, | 791     if (!EnsureFileIsGeneratedByDependency(this, out_file, true, | 
| 770                                            &seen_targets)) | 792                                            consider_object_files, | 
|  | 793                                            check_data_deps, &seen_targets)) | 
| 771       g_scheduler->AddUnknownGeneratedInput(this, source); | 794       g_scheduler->AddUnknownGeneratedInput(this, source); | 
| 772   } | 795   } | 
| 773 } | 796 } | 
| OLD | NEW | 
|---|