forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathargs.h
147 lines (115 loc) · 5.58 KB
/
args.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
// 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 <map>
#include <set>
#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<base::StringPiece, ValueWithOverride>;
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<SourceFile>& build_args_dependency_files() const {
return build_args_dependency_files_;
}
void set_build_args_dependency_files(
const std::set<SourceFile>& build_args_dependency_files) {
build_args_dependency_files_ = build_args_dependency_files;
}
private:
using ArgumentsPerToolchain =
base::hash_map<const Settings*, Scope::KeyValueMap>;
// 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<SourceFile> build_args_dependency_files_;
DISALLOW_ASSIGN(Args);
};
#endif // TOOLS_GN_ARGS_H_