| // Copyright 2018 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef TOOLS_GN_COMPILE_COMMANDS_WRITER_H_ | |
| #define TOOLS_GN_COMPILE_COMMANDS_WRITER_H_ | |
| #include <optional> | |
| #include <vector> | |
| #include "gn/err.h" | |
| #include "gn/label_pattern.h" | |
| #include "gn/target.h" | |
| class Builder; | |
| class BuildSettings; | |
| class CompileCommandsWriter { | |
| public: | |
| // Writes a compilation database to the given file name consisting of the | |
| // recursive dependencies of all targets that match or are dependencies of | |
| // targets that match any given pattern. | |
| // | |
| // The legacy target filters takes a deprecated list of comma-separated target | |
| // names ("target_name1,target_name2...") which are matched against targets in | |
| // any directory. This is passed as an optional to encapsulate the legacy | |
| // behavior that providing the switch with no patterns matches everything, but | |
| // not passing the flag (nullopt for the function parameter) matches nothing. | |
| // | |
| // The union of the legacy matches and the target patterns are used. | |
| // | |
| // TODO(https://bugs.chromium.org/p/gn/issues/detail?id=302): | |
| // Remove this legacy target filters behavior. | |
| static bool RunAndWriteFiles( | |
| const BuildSettings* build_setting, | |
| const std::vector<const Target*>& all_targets, | |
| const std::vector<LabelPattern>& patterns, | |
| const std::optional<std::string>& legacy_target_filters, | |
| const base::FilePath& output_path, | |
| Err* err); | |
| // Collects all the targets whose commands should get written as part of | |
| // RunAndWriteFiles() (separated out for unit testing). | |
| static std::vector<const Target*> CollectTargets( | |
| const BuildSettings* build_setting, | |
| const std::vector<const Target*>& all_targets, | |
| const std::vector<LabelPattern>& patterns, | |
| const std::optional<std::string>& legacy_target_filters, | |
| Err* err); | |
| static std::string RenderJSON(const BuildSettings* build_settings, | |
| std::vector<const Target*>& all_targets); | |
| // Does a depth-first search of the graph starting at the input target and | |
| // collects all recursive dependencies of those targets. | |
| static std::vector<const Target*> CollectDepsOfMatches( | |
| const std::vector<const Target*>& input_targets); | |
| // Performs the legacy target_name filtering. | |
| static std::vector<const Target*> FilterLegacyTargets( | |
| const std::vector<const Target*>& all_targets, | |
| const std::string& target_filter_string); | |
| }; | |
| #endif // TOOLS_GN_COMPILE_COMMANDS_WRITER_H_ |