Ensure the CommandSwitches::Get() singleton is properly initialized.
Otherwise, flags like `--as=buildfile` are ignored. This caused a
GN autoroll failure in Chromium. This fixes the issue by ensuring
that CommandSwitches::Init() is called from main(), and by adding
runtime checks to verify CommandSwitches::Get() and
CommandSwitches::Set() are always called after
CommandSwitches::Init().
Bug: chromium/1300012
Change-Id: Iaf2b3a9332f25b24c13f3075fe9bceed6c3f1a4b
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/13000
Reviewed-by: Nico Weber <thakis@chromium.org>
Reviewed-by: Petr Hosek <phosek@google.com>
Commit-Queue: Petr Hosek <phosek@google.com>
diff --git a/src/gn/commands.cc b/src/gn/commands.cc
index a5f2ca9..cb44795 100644
--- a/src/gn/commands.cc
+++ b/src/gn/commands.cc
@@ -366,16 +366,22 @@
// static
bool CommandSwitches::Init(const base::CommandLine& cmdline) {
+ CHECK(!s_global_switches_.is_initialized())
+ << "Only call this once from main()";
return s_global_switches_.InitFrom(cmdline);
}
// static
const CommandSwitches& CommandSwitches::Get() {
+ CHECK(s_global_switches_.is_initialized())
+ << "Missing previous succesful call to CommandSwitches::Init()";
return s_global_switches_;
}
// static
CommandSwitches CommandSwitches::Set(CommandSwitches new_switches) {
+ CHECK(s_global_switches_.is_initialized())
+ << "Missing previous succesful call to CommandSwitches::Init()";
CommandSwitches result = std::move(s_global_switches_);
s_global_switches_ = std::move(new_switches);
return result;
@@ -383,6 +389,7 @@
bool CommandSwitches::InitFrom(const base::CommandLine& cmdline) {
CommandSwitches result;
+ result.initialized_ = true;
result.has_quiet_ = cmdline.HasSwitch("a");
result.has_force_ = cmdline.HasSwitch("force");
result.has_all_ = cmdline.HasSwitch("all");
diff --git a/src/gn/commands.h b/src/gn/commands.h
index 049ff85..acff044 100644
--- a/src/gn/commands.h
+++ b/src/gn/commands.h
@@ -209,10 +209,13 @@
static CommandSwitches Set(CommandSwitches new_switches);
private:
+ bool is_initialized() const { return initialized_; }
+
bool InitFrom(const base::CommandLine&);
static CommandSwitches s_global_switches_;
+ bool initialized_ = false;
bool has_quiet_ = false;
bool has_force_ = false;
bool has_all_ = false;
diff --git a/src/gn/gn_main.cc b/src/gn/gn_main.cc
index e839b32..e1a0517 100644
--- a/src/gn/gn_main.cc
+++ b/src/gn/gn_main.cc
@@ -63,6 +63,9 @@
args.erase(args.begin());
}
+ if (!commands::CommandSwitches::Init(cmdline))
+ return 1;
+
const commands::CommandInfoMap& command_map = commands::GetCommands();
commands::CommandInfoMap::const_iterator found_command =
command_map.find(command);