| // Copyright (c) 2013 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_CONFIG_H_ |
| #define TOOLS_GN_CONFIG_H_ |
| |
| #include "base/logging.h" |
| #include "base/macros.h" |
| #include "gn/config_values.h" |
| #include "gn/item.h" |
| #include "gn/label_ptr.h" |
| #include "gn/unique_vector.h" |
| |
| // Represents a named config in the dependency graph. |
| // |
| // A config can list other configs. We track both the data assigned directly |
| // on the config, this list of sub-configs, and (when the config is resolved) |
| // the resulting values of everything merged together. The flatten step |
| // means we can avoid doing a recursive config walk for every target to compute |
| // flags. |
| class Config : public Item { |
| public: |
| // We track the set of build files that may affect this config, please refer |
| // to Scope for how this is determined. |
| Config(const Settings* settings, |
| const Label& label, |
| const SourceFileSet& build_dependency_files = {}); |
| ~Config() override; |
| |
| // Item implementation. |
| Config* AsConfig() override; |
| const Config* AsConfig() const override; |
| bool OnResolved(Err* err) override; |
| |
| // The values set directly on this config. This will not contain data from |
| // sub-configs. |
| ConfigValues& own_values() { return own_values_; } |
| const ConfigValues& own_values() const { return own_values_; } |
| |
| // The values that represent this config and all sub-configs combined into |
| // one. This is only valid after the config is resolved (when we know the |
| // contents of the sub-configs). |
| const ConfigValues& resolved_values() const { |
| DCHECK(resolved_); |
| if (configs_.empty()) // No sub configs, just use the regular values. |
| return own_values_; |
| return composite_values_; |
| } |
| |
| // List of sub-configs. |
| const UniqueVector<LabelConfigPair>& configs() const { return configs_; } |
| UniqueVector<LabelConfigPair>& configs() { return configs_; } |
| |
| private: |
| ConfigValues own_values_; |
| |
| // Contains the own_values combined with sub-configs. Most configs don't have |
| // sub-configs. So as an optimization, this is not populated if there are no |
| // items in configs_. The resolved_values() getter handles this. |
| bool resolved_ = false; |
| ConfigValues composite_values_; |
| |
| UniqueVector<LabelConfigPair> configs_; |
| |
| DISALLOW_COPY_AND_ASSIGN(Config); |
| }; |
| |
| #endif // TOOLS_GN_CONFIG_H_ |