Move over to ABSL logging and flags.

Removes gperftools too since that wants gflags.

Here come the fireworks.

Change-Id: I79cb7bcf60f1047fbfa28bfffc21a0fd692e4b1c
Signed-off-by: Austin Schuh <austin.linux@gmail.com>
diff --git a/aos/init.cc b/aos/init.cc
index 579ad33..b51dc1c 100644
--- a/aos/init.cc
+++ b/aos/init.cc
@@ -11,29 +11,61 @@
 #include <cstdlib>
 #include <cstring>
 
-#include "gflags/gflags.h"
-#include "glog/logging.h"
+#include "absl/debugging/failure_signal_handler.h"
+#include "absl/debugging/symbolize.h"
+#include "absl/flags/flag.h"
+#include "absl/flags/parse.h"
+#include "absl/log/check.h"
+#include "absl/log/flags.h"
+#include "absl/log/globals.h"
+#include "absl/log/initialize.h"
+#include "absl/log/log.h"
 
 #include "aos/realtime.h"
 #include "aos/uuid.h"
 
-DEFINE_bool(coredump, false, "If true, write core dumps on failure.");
+ABSL_FLAG(bool, coredump, false, "If true, write core dumps on failure.");
+ABSL_FLAG(bool, backtrace, true, "If true, print backtraces out on crashes.");
 
 namespace aos {
 namespace {
-bool initialized = false;
+std::atomic<bool> initialized{false};
 }  // namespace
 
 bool IsInitialized() { return initialized; }
 
 void InitGoogle(int *argc, char ***argv) {
   CHECK(!IsInitialized()) << "Only initialize once.";
-  FLAGS_logtostderr = true;
-  google::InitGoogleLogging((*argv)[0]);
-  gflags::ParseCommandLineFlags(argc, argv, true);
-  google::InstallFailureSignalHandler();
+  absl::SetStderrThreshold(absl::LogSeverityAtLeast::kInfo);
+  std::vector<char *> positional_arguments =
+      absl::ParseCommandLine(*argc, *argv);
 
-  if (FLAGS_coredump) {
+  {
+    const std::vector<absl::UnrecognizedFlag> unrecognized_flags;
+    absl::ReportUnrecognizedFlags(unrecognized_flags);
+    if (!unrecognized_flags.empty()) {
+      for (const absl::UnrecognizedFlag &flag : unrecognized_flags) {
+        LOG(ERROR) << "Unrecognized flag " << flag.flag_name;
+      }
+      LOG(FATAL) << "Found unrecognized flags, aborting";
+    }
+  }
+
+  CHECK_LE(positional_arguments.size(), static_cast<size_t>(*argc));
+  for (size_t i = 0; i < positional_arguments.size(); ++i) {
+    (*argv)[i] = positional_arguments[i];
+  }
+  *argc = positional_arguments.size();
+
+  absl::InitializeLog();
+
+  if (absl::GetFlag(FLAGS_backtrace)) {
+    absl::InitializeSymbolizer((*argv)[0]);
+    absl::FailureSignalHandlerOptions options;
+    absl::InstallFailureSignalHandler(options);
+  }
+
+  if (absl::GetFlag(FLAGS_coredump)) {
     WriteCoreDumps();
   }