aboutsummaryrefslogtreecommitdiffstats
path: root/src/flags.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/flags.cc')
-rw-r--r--src/flags.cc197
1 files changed, 197 insertions, 0 deletions
diff --git a/src/flags.cc b/src/flags.cc
new file mode 100644
index 0000000..329e0fd
--- /dev/null
+++ b/src/flags.cc
@@ -0,0 +1,197 @@
+// Copyright 2015 Google Inc. All rights reserved
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// +build ignore
+
+#include "flags.h"
+
+#include <stdlib.h>
+#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 = num_cpus = sysconf(_SC_NPROCESSORS_ONLN);
+ const char* num_jobs_str;
+ const char* writable_str;
+
+ if (const char* makeflags = getenv("MAKEFLAGS")) {
+ for (StringPiece tok : WordScanner(makeflags)) {
+ if (!HasPrefix(tok, "-") && tok.find('=') != string::npos)
+ cl_vars.push_back(tok);
+ }
+ }
+
+ 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, "-d")) {
+ enable_debug = true;
+ } else if (!strcmp(arg, "--kati_stats")) {
+ enable_stat_logs = true;
+ } else if (!strcmp(arg, "--warn")) {
+ enable_kati_warnings = true;
+ } else if (!strcmp(arg, "--ninja")) {
+ generate_ninja = true;
+ } else if (!strcmp(arg, "--empty_ninja_file")) {
+ generate_empty_ninja = true;
+ } else if (!strcmp(arg, "--gen_all_targets")) {
+ gen_all_targets = true;
+ } else if (!strcmp(arg, "--regen")) {
+ // TODO: Make this default.
+ regen = true;
+ } else if (!strcmp(arg, "--regen_debug")) {
+ regen_debug = 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;
+ regen_debug = true;
+ } else if (!strcmp(arg, "--detect_android_echo")) {
+ detect_android_echo = true;
+ } else if (!strcmp(arg, "--detect_depfiles")) {
+ detect_depfiles = true;
+ } else if (!strcmp(arg, "--color_warnings")) {
+ color_warnings = true;
+ } else if (!strcmp(arg, "--no_builtin_rules")) {
+ no_builtin_rules = true;
+ } else if (!strcmp(arg, "--no_ninja_prelude")) {
+ no_ninja_prelude = true;
+ } else if (!strcmp(arg, "--use_ninja_phony_output")) {
+ use_ninja_phony_output = true;
+ } else if (!strcmp(arg, "--use_ninja_validations")) {
+ use_ninja_validations = true;
+ } else if (!strcmp(arg, "--werror_find_emulator")) {
+ werror_find_emulator = true;
+ } else if (!strcmp(arg, "--werror_overriding_commands")) {
+ werror_overriding_commands = true;
+ } else if (!strcmp(arg, "--warn_implicit_rules")) {
+ warn_implicit_rules = true;
+ } else if (!strcmp(arg, "--werror_implicit_rules")) {
+ werror_implicit_rules = true;
+ } else if (!strcmp(arg, "--warn_suffix_rules")) {
+ warn_suffix_rules = true;
+ } else if (!strcmp(arg, "--werror_suffix_rules")) {
+ werror_suffix_rules = true;
+ } else if (!strcmp(arg, "--top_level_phony")) {
+ top_level_phony = true;
+ } else if (!strcmp(arg, "--warn_real_to_phony")) {
+ warn_real_to_phony = true;
+ } else if (!strcmp(arg, "--werror_real_to_phony")) {
+ warn_real_to_phony = true;
+ werror_real_to_phony = true;
+ } else if (!strcmp(arg, "--warn_phony_looks_real")) {
+ warn_phony_looks_real = true;
+ } else if (!strcmp(arg, "--werror_phony_looks_real")) {
+ warn_phony_looks_real = true;
+ werror_phony_looks_real = true;
+ } else if (!strcmp(arg, "--werror_writable")) {
+ werror_writable = true;
+ } else if (!strcmp(arg, "--warn_real_no_cmds_or_deps")) {
+ warn_real_no_cmds_or_deps = true;
+ } else if (!strcmp(arg, "--werror_real_no_cmds_or_deps")) {
+ warn_real_no_cmds_or_deps = true;
+ werror_real_no_cmds_or_deps = true;
+ } else if (!strcmp(arg, "--warn_real_no_cmds")) {
+ warn_real_no_cmds = true;
+ } else if (!strcmp(arg, "--werror_real_no_cmds")) {
+ warn_real_no_cmds = true;
+ werror_real_no_cmds = 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 (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 (ParseCommandLineOptionWithArg("--no_ignore_dirty", argv, &i,
+ &no_ignore_dirty_pattern)) {
+ } else if (ParseCommandLineOptionWithArg("--writable", argv, &i,
+ &writable_str)) {
+ writable.push_back(writable_str);
+ } else if (ParseCommandLineOptionWithArg("--default_pool", argv, &i,
+ &default_pool)) {
+ } 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]);
+ }
+ }
+ }
+}