| Index: tools/gn/header_checker.cc
|
| diff --git a/tools/gn/header_checker.cc b/tools/gn/header_checker.cc
|
| index c950fca1cbebd2f1c48860f9e2874d0759a7d4bc..1c48a72a672132daf7dc7df26fd64dba4381ef71 100644
|
| --- a/tools/gn/header_checker.cc
|
| +++ b/tools/gn/header_checker.cc
|
| @@ -130,16 +130,17 @@ HeaderChecker::~HeaderChecker() {
|
| }
|
|
|
| bool HeaderChecker::Run(const std::vector<const Target*>& to_check,
|
| + bool force_check,
|
| std::vector<Err>* errors) {
|
| if (to_check.empty()) {
|
| // Check all files.
|
| - RunCheckOverFiles(file_map_);
|
| + RunCheckOverFiles(file_map_, force_check);
|
| } else {
|
| // Run only over the files in the given targets.
|
| FileMap files_to_check;
|
| for (size_t i = 0; i < to_check.size(); i++)
|
| AddTargetToFileMap(to_check[i], &files_to_check);
|
| - RunCheckOverFiles(files_to_check);
|
| + RunCheckOverFiles(files_to_check, force_check);
|
| }
|
|
|
| if (errors_.empty())
|
| @@ -148,7 +149,7 @@ bool HeaderChecker::Run(const std::vector<const Target*>& to_check,
|
| return false;
|
| }
|
|
|
| -void HeaderChecker::RunCheckOverFiles(const FileMap& files) {
|
| +void HeaderChecker::RunCheckOverFiles(const FileMap& files, bool force_check) {
|
| if (files.empty())
|
| return;
|
|
|
| @@ -164,6 +165,16 @@ void HeaderChecker::RunCheckOverFiles(const FileMap& files) {
|
| type != SOURCE_M && type != SOURCE_MM && type != SOURCE_RC)
|
| continue;
|
|
|
| + // Do a first pass to find if this should be skipped. All targets including
|
| + // this source file must exclude it from checking.
|
| + if (!force_check) {
|
| + bool check_includes = false;
|
| + for (size_t vect_i = 0; vect_i < vect.size(); ++vect_i)
|
| + check_includes |= vect[vect_i].target->check_includes();
|
| + if (!check_includes)
|
| + continue;
|
| + }
|
| +
|
| for (size_t vect_i = 0; vect_i < vect.size(); ++vect_i) {
|
| pool->PostWorkerTaskWithShutdownBehavior(
|
| FROM_HERE,
|
| @@ -350,6 +361,11 @@ bool HeaderChecker::CheckInclude(const Target* from_target,
|
| }
|
|
|
| found_dependency = true;
|
| + } else if (
|
| + to_target->allow_circular_includes_from().find(from_target->label()) !=
|
| + to_target->allow_circular_includes_from().end()) {
|
| + // Not a dependency, but this include is whitelisted from the destination.
|
| + found_dependency = true;
|
| }
|
| }
|
|
|
|
|