// 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_ARGS_H_ #define TOOLS_GN_ARGS_H_ #include #include #include "base/containers/hash_tables.h" #include "base/macros.h" #include "base/synchronization/lock.h" #include "tools/gn/scope.h" class Err; class SourceFile; extern const char kBuildArgs_Help[]; // Manages build arguments. It stores the global arguments specified on the // command line, and sets up the root scope with the proper values. // // This class tracks accesses so we can report errors about unused variables. // The use case is if the user specifies an override on the command line, but // no buildfile actually uses that variable. We want to be able to report that // the argument was unused. class Args { public: struct ValueWithOverride { ValueWithOverride(); ValueWithOverride(const Value& def_val); ~ValueWithOverride(); Value default_value; // Default value given in declare_args. bool has_override; // True indicates override_value is valid. Value override_value; // From .gn or the current build's "gn args". }; using ValueWithOverrideMap = std::map; Args(); Args(const Args& other); ~Args(); // Specifies overrides of the build arguments. These are normally specified // on the command line. void AddArgOverride(const char* name, const Value& value); void AddArgOverrides(const Scope::KeyValueMap& overrides); // Specifies default overrides of the build arguments. These are normally // specified in the .gn file. void AddDefaultArgOverrides(const Scope::KeyValueMap& overrides); // Returns the value corresponding to the given argument name, or NULL if no // argument is set. const Value* GetArgOverride(const char* name) const; // Sets up the root scope for a toolchain. This applies the default system // flags and saves the toolchain overrides so they can be applied to // declare_args blocks that appear when loading files in that toolchain. void SetupRootScope(Scope* dest, const Scope::KeyValueMap& toolchain_overrides) const; // Sets up the given scope with arguments passed in. // // If the values specified in the args are not already set, the values in // the args list will be used (which are assumed to be the defaults), but // they will not override the system defaults or the current overrides. // // All args specified in the input will be marked as "used". // // On failure, the err will be set and it will return false. bool DeclareArgs(const Scope::KeyValueMap& args, Scope* scope_to_set, Err* err) const; // Checks to see if any of the overrides ever used were never declared as // arguments. If there are, this returns false and sets the error. bool VerifyAllOverridesUsed(Err* err) const; // Returns information about all arguments, both defaults and overrides. // This is used for the help system which is not performance critical. Use a // map instead of a hash map so the arguments are sorted alphabetically. ValueWithOverrideMap GetAllArguments() const; // Returns the set of build files that may affect the build arguments, please // refer to Scope for how this is determined. const std::set& build_args_dependency_files() const { return build_args_dependency_files_; } void set_build_args_dependency_files( const std::set& build_args_dependency_files) { build_args_dependency_files_ = build_args_dependency_files; } private: using ArgumentsPerToolchain = base::hash_map; // Sets the default config based on the current system. void SetSystemVarsLocked(Scope* scope) const; // Sets the given already declared vars on the given scope. void ApplyOverridesLocked(const Scope::KeyValueMap& values, Scope* scope) const; void SaveOverrideRecordLocked(const Scope::KeyValueMap& values) const; // Returns the KeyValueMap used for arguments declared for the specified // toolchain. Scope::KeyValueMap& DeclaredArgumentsForToolchainLocked(Scope* scope) const; // Returns the KeyValueMap used for overrides for the specified // toolchain. Scope::KeyValueMap& OverridesForToolchainLocked(Scope* scope) const; // Since this is called during setup which we assume is single-threaded, // this is not protected by the lock. It should be set only during init. Scope::KeyValueMap overrides_; mutable base::Lock lock_; // Maintains a list of all overrides we've ever seen. This is the main // |overrides_| as well as toolchain overrides. Tracking this allows us to // check for overrides that were specified but never used. mutable Scope::KeyValueMap all_overrides_; // Maps from Settings (which corresponds to a toolchain) to the map of // declared variables. This is used to tracks all variables declared in any // buildfile. This is so we can see if the user set variables on the command // line that are not used anywhere. Each map is toolchain specific as each // toolchain may define variables in different locations. mutable ArgumentsPerToolchain declared_arguments_per_toolchain_; // Overrides for individual toolchains. This is necessary so we // can apply the correct override for the current toolchain, once // we see an argument declaration. mutable ArgumentsPerToolchain toolchain_overrides_; std::set build_args_dependency_files_; DISALLOW_ASSIGN(Args); }; #endif // TOOLS_GN_ARGS_H_