108808d3a778e6b4b653372b6d08dd4da96ebee27Shinichiro Hamaji// Copyright 2015 Google Inc. All rights reserved
208808d3a778e6b4b653372b6d08dd4da96ebee27Shinichiro Hamaji//
308808d3a778e6b4b653372b6d08dd4da96ebee27Shinichiro Hamaji// Licensed under the Apache License, Version 2.0 (the "License");
408808d3a778e6b4b653372b6d08dd4da96ebee27Shinichiro Hamaji// you may not use this file except in compliance with the License.
508808d3a778e6b4b653372b6d08dd4da96ebee27Shinichiro Hamaji// You may obtain a copy of the License at
608808d3a778e6b4b653372b6d08dd4da96ebee27Shinichiro Hamaji//
708808d3a778e6b4b653372b6d08dd4da96ebee27Shinichiro Hamaji//      http://www.apache.org/licenses/LICENSE-2.0
808808d3a778e6b4b653372b6d08dd4da96ebee27Shinichiro Hamaji//
908808d3a778e6b4b653372b6d08dd4da96ebee27Shinichiro Hamaji// Unless required by applicable law or agreed to in writing, software
1008808d3a778e6b4b653372b6d08dd4da96ebee27Shinichiro Hamaji// distributed under the License is distributed on an "AS IS" BASIS,
1108808d3a778e6b4b653372b6d08dd4da96ebee27Shinichiro Hamaji// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1208808d3a778e6b4b653372b6d08dd4da96ebee27Shinichiro Hamaji// See the License for the specific language governing permissions and
1308808d3a778e6b4b653372b6d08dd4da96ebee27Shinichiro Hamaji// limitations under the License.
1408808d3a778e6b4b653372b6d08dd4da96ebee27Shinichiro Hamaji
1508808d3a778e6b4b653372b6d08dd4da96ebee27Shinichiro Hamaji// +build ignore
1608808d3a778e6b4b653372b6d08dd4da96ebee27Shinichiro Hamaji
1708808d3a778e6b4b653372b6d08dd4da96ebee27Shinichiro Hamaji#include "flags.h"
1808808d3a778e6b4b653372b6d08dd4da96ebee27Shinichiro Hamaji
194627ab22520d904004bb50048267c6c5f5bbd2dbShinichiro Hamaji#include <stdlib.h>
20003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji#include <unistd.h>
21003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji
22003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji#include "log.h"
23003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji#include "strutil.h"
24003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji
25003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro HamajiFlags g_flags;
26003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji
27003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamajistatic bool ParseCommandLineOptionWithArg(StringPiece option,
28003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji                                          char* argv[],
29003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji                                          int* index,
30003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji                                          const char** out_arg) {
31003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  const char* arg = argv[*index];
32003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  if (!HasPrefix(arg, option))
33003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    return false;
34003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  if (arg[option.size()] == '\0') {
35003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    ++*index;
36003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    *out_arg = argv[*index];
37003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    return true;
38003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  }
39003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  if (arg[option.size()] == '=') {
40003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    *out_arg = arg + option.size() + 1;
41003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    return true;
42003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  }
43003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  // E.g, -j999
44003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  if (option.size() == 2) {
45003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    *out_arg = arg + option.size();
46003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    return true;
47003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  }
48003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  return false;
49003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji}
50003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji
51003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamajivoid Flags::Parse(int argc, char** argv) {
52003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  subkati_args.push_back(argv[0]);
531a444a870705b263cb4ee080ddfafde42c0f5563Shinichiro Hamaji  num_jobs = num_cpus = sysconf(_SC_NPROCESSORS_ONLN);
54003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  const char* num_jobs_str;
55003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji
564627ab22520d904004bb50048267c6c5f5bbd2dbShinichiro Hamaji  if (const char* makeflags = getenv("MAKEFLAGS")) {
574627ab22520d904004bb50048267c6c5f5bbd2dbShinichiro Hamaji    for (StringPiece tok : WordScanner(makeflags)) {
584627ab22520d904004bb50048267c6c5f5bbd2dbShinichiro Hamaji      if (!HasPrefix(tok, "-") && tok.find('=') != string::npos)
594627ab22520d904004bb50048267c6c5f5bbd2dbShinichiro Hamaji        cl_vars.push_back(tok);
60d570f214b76beac77ecfd287822cc4f7a690f7c4Po Hu    }
61d570f214b76beac77ecfd287822cc4f7a690f7c4Po Hu  }
62d570f214b76beac77ecfd287822cc4f7a690f7c4Po Hu
63003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  for (int i = 1; i < argc; i++) {
64003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    const char* arg = argv[i];
65003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    bool should_propagate = true;
66003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    int pi = i;
67003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    if (!strcmp(arg, "-f")) {
68003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      makefile = argv[++i];
69003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      should_propagate = false;
70003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (!strcmp(arg, "-c")) {
71003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      is_syntax_check_only = true;
72003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (!strcmp(arg, "-i")) {
73003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      is_dry_run = true;
74003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (!strcmp(arg, "-s")) {
75003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      is_silent_mode = true;
76c58db9a0532cc01103fdf2726074a48c62d293a6Shinichiro Hamaji    } else if (!strcmp(arg, "-d")) {
77c58db9a0532cc01103fdf2726074a48c62d293a6Shinichiro Hamaji      enable_debug = true;
78003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (!strcmp(arg, "--kati_stats")) {
79003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      enable_stat_logs = true;
80644d6b9b5e0ffa14e38e7c2212e1a686b248c1cdShinichiro Hamaji    } else if (!strcmp(arg, "--warn")) {
81644d6b9b5e0ffa14e38e7c2212e1a686b248c1cdShinichiro Hamaji      enable_kati_warnings = true;
82003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (!strcmp(arg, "--ninja")) {
83003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      generate_ninja = true;
847223e7be32cc2fcb263612f9cece0d307e70ed8bShinichiro Hamaji    } else if (!strcmp(arg, "--gen_all_targets")) {
857223e7be32cc2fcb263612f9cece0d307e70ed8bShinichiro Hamaji      gen_all_targets = true;
86003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (!strcmp(arg, "--regen")) {
87003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      // TODO: Make this default.
88003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      regen = true;
89f6486ce40716ecb5ef30886b156d9f9bf0876a18Dan Willemsen    } else if (!strcmp(arg, "--regen_debug")) {
90f6486ce40716ecb5ef30886b156d9f9bf0876a18Dan Willemsen      regen_debug = true;
91003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (!strcmp(arg, "--regen_ignoring_kati_binary")) {
92003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      regen_ignoring_kati_binary = true;
93003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (!strcmp(arg, "--dump_kati_stamp")) {
94003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      dump_kati_stamp = true;
95f6486ce40716ecb5ef30886b156d9f9bf0876a18Dan Willemsen      regen_debug = true;
96003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (!strcmp(arg, "--detect_android_echo")) {
97003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      detect_android_echo = true;
98f3ad9e0cec73953592df5143d16d880595c7bc6eShinichiro Hamaji    } else if (!strcmp(arg, "--detect_depfiles")) {
99f3ad9e0cec73953592df5143d16d880595c7bc6eShinichiro Hamaji      detect_depfiles = true;
100e41c7556c22bda359c2b97cd98d59082110add95Dan Willemsen    } else if (!strcmp(arg, "--color_warnings")) {
101e41c7556c22bda359c2b97cd98d59082110add95Dan Willemsen      color_warnings = true;
102003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (ParseCommandLineOptionWithArg(
103003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        "-j", argv, &i, &num_jobs_str)) {
104003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      num_jobs = strtol(num_jobs_str, NULL, 10);
105003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      if (num_jobs <= 0) {
106003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        ERROR("Invalid -j flag: %s", num_jobs_str);
107003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      }
108003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (ParseCommandLineOptionWithArg(
109003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        "--remote_num_jobs", argv, &i, &num_jobs_str)) {
110003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      remote_num_jobs = strtol(num_jobs_str, NULL, 10);
111003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      if (remote_num_jobs <= 0) {
112003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        ERROR("Invalid -j flag: %s", num_jobs_str);
113003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      }
114003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (ParseCommandLineOptionWithArg(
115003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        "--ninja_suffix", argv, &i, &ninja_suffix)) {
116003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (ParseCommandLineOptionWithArg(
117003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        "--ninja_dir", argv, &i, &ninja_dir)) {
118003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (!strcmp(arg, "--use_find_emulator")) {
119003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      use_find_emulator = true;
120003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (ParseCommandLineOptionWithArg(
121003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        "--goma_dir", argv, &i, &goma_dir)) {
122003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (ParseCommandLineOptionWithArg(
123003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        "--ignore_optional_include",
124003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        argv, &i, &ignore_optional_include_pattern)) {
125003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (ParseCommandLineOptionWithArg(
126003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        "--ignore_dirty",
127003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        argv, &i, &ignore_dirty_pattern)) {
128f23ae8caf11bf0d37d5669603224b76638fc74d4Colin Cross    } else if (ParseCommandLineOptionWithArg(
129f23ae8caf11bf0d37d5669603224b76638fc74d4Colin Cross        "--no_ignore_dirty",
130f23ae8caf11bf0d37d5669603224b76638fc74d4Colin Cross        argv, &i, &no_ignore_dirty_pattern)) {
131003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (arg[0] == '-') {
132003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      ERROR("Unknown flag: %s", arg);
133003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else {
134003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      if (strchr(arg, '=')) {
135003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        cl_vars.push_back(arg);
136003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      } else {
137003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        should_propagate = false;
138003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        targets.push_back(Intern(arg));
139003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      }
140003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    }
141003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji
142003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    if (should_propagate) {
143003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      for (; pi <= i; pi++) {
144003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        subkati_args.push_back(argv[pi]);
145003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      }
146003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    }
147003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  }
148003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji}
149