aboutsummaryrefslogtreecommitdiffstats
path: root/flags.cc
diff options
context:
space:
mode:
authorShinichiro Hamaji <shinichiro.hamaji@gmail.com>2015-09-09 18:22:04 +0900
committerShinichiro Hamaji <shinichiro.hamaji@gmail.com>2015-09-09 18:22:04 +0900
commit003d06ede28997fcfbda65a14907b3ca17fb2d39 (patch)
treef6c114298dd06ddba83da635a8317682da087373 /flags.cc
parentb6a04540f2522a37b88090c0c806649399bed083 (diff)
downloadandroid_build_kati-003d06ede28997fcfbda65a14907b3ca17fb2d39.tar.gz
android_build_kati-003d06ede28997fcfbda65a14907b3ca17fb2d39.tar.bz2
android_build_kati-003d06ede28997fcfbda65a14907b3ca17fb2d39.zip
[C++] A global refactoring for command line flags
So we will be able to use the command line parser for sub-makes.
Diffstat (limited to 'flags.cc')
-rw-r--r--flags.cc124
1 files changed, 113 insertions, 11 deletions
diff --git a/flags.cc b/flags.cc
index 9c90bd1..5e29c7a 100644
--- a/flags.cc
+++ b/flags.cc
@@ -16,14 +16,116 @@
#include "flags.h"
-bool g_enable_stat_logs;
-bool g_is_dry_run;
-const char* g_ignore_optional_include_pattern;
-const char* g_goma_dir;
-int g_num_jobs;
-int g_remote_num_jobs;
-bool g_detect_android_echo;
-bool g_gen_regen_rule;
-const char* g_ignore_dirty_pattern;
-bool g_gen_all_phony_targets;
-bool g_is_silent_mode;
+#include <unistd.h>
+
+#include "log.h"
+#include "strutil.h"
+
+Flags g_flags;
+
+static bool ParseCommandLineOptionWithArg(StringPiece option,
+ char* argv[],
+ int* index,
+ const char** out_arg) {
+ const char* arg = argv[*index];
+ if (!HasPrefix(arg, option))
+ return false;
+ if (arg[option.size()] == '\0') {
+ ++*index;
+ *out_arg = argv[*index];
+ return true;
+ }
+ if (arg[option.size()] == '=') {
+ *out_arg = arg + option.size() + 1;
+ return true;
+ }
+ // E.g, -j999
+ if (option.size() == 2) {
+ *out_arg = arg + option.size();
+ return true;
+ }
+ return false;
+}
+
+void Flags::Parse(int argc, char** argv) {
+ subkati_args.push_back(argv[0]);
+ num_jobs = sysconf(_SC_NPROCESSORS_ONLN);
+ const char* num_jobs_str;
+
+ for (int i = 1; i < argc; i++) {
+ const char* arg = argv[i];
+ bool should_propagate = true;
+ int pi = i;
+ if (!strcmp(arg, "-f")) {
+ makefile = argv[++i];
+ should_propagate = false;
+ } else if (!strcmp(arg, "-c")) {
+ is_syntax_check_only = true;
+ } else if (!strcmp(arg, "-i")) {
+ is_dry_run = true;
+ } else if (!strcmp(arg, "-s")) {
+ is_silent_mode = true;
+ } else if (!strcmp(arg, "--kati_stats")) {
+ enable_stat_logs = true;
+ } else if (!strcmp(arg, "--ninja")) {
+ generate_ninja = true;
+ } else if (!strcmp(arg, "--gen_all_phony_targets")) {
+ // TODO: Remove this.
+ gen_all_phony_targets = true;
+ } else if (!strcmp(arg, "--regen")) {
+ // TODO: Make this default.
+ regen = true;
+ } else if (!strcmp(arg, "--regen_ignoring_kati_binary")) {
+ regen_ignoring_kati_binary = true;
+ } else if (!strcmp(arg, "--dump_kati_stamp")) {
+ dump_kati_stamp = true;
+ } else if (!strcmp(arg, "--detect_android_echo")) {
+ detect_android_echo = true;
+ } else if (ParseCommandLineOptionWithArg(
+ "-j", argv, &i, &num_jobs_str)) {
+ num_jobs = strtol(num_jobs_str, NULL, 10);
+ if (num_jobs <= 0) {
+ ERROR("Invalid -j flag: %s", num_jobs_str);
+ }
+ } else if (ParseCommandLineOptionWithArg(
+ "--remote_num_jobs", argv, &i, &num_jobs_str)) {
+ remote_num_jobs = strtol(num_jobs_str, NULL, 10);
+ if (remote_num_jobs <= 0) {
+ ERROR("Invalid -j flag: %s", num_jobs_str);
+ }
+ } else if (ParseCommandLineOptionWithArg(
+ "--ninja_suffix", argv, &i, &ninja_suffix)) {
+ } else if (ParseCommandLineOptionWithArg(
+ "--ninja_dir", argv, &i, &ninja_dir)) {
+ } else if (!strcmp(arg, "--use_find_emulator")) {
+ use_find_emulator = true;
+ } else if (!strcmp(arg, "--gen_regen_rule")) {
+ // TODO: Make this default once we have removed unnecessary
+ // command line change from Android build.
+ gen_regen_rule = true;
+ } else if (ParseCommandLineOptionWithArg(
+ "--goma_dir", argv, &i, &goma_dir)) {
+ } else if (ParseCommandLineOptionWithArg(
+ "--ignore_optional_include",
+ argv, &i, &ignore_optional_include_pattern)) {
+ } else if (ParseCommandLineOptionWithArg(
+ "--ignore_dirty",
+ argv, &i, &ignore_dirty_pattern)) {
+ } else if (arg[0] == '-') {
+ ERROR("Unknown flag: %s", arg);
+ } else {
+ if (strchr(arg, '=')) {
+ cl_vars.push_back(arg);
+ } else {
+ should_propagate = false;
+ targets.push_back(Intern(arg));
+ }
+ }
+
+ if (should_propagate) {
+ for (; pi <= i; pi++) {
+ subkati_args.push_back(argv[pi]);
+ }
+ }
+ }
+}