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
19003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji#include <unistd.h>
20003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji
21003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji#include "log.h"
22003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji#include "strutil.h"
23003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji
24003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro HamajiFlags g_flags;
25003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji
26003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamajistatic bool ParseCommandLineOptionWithArg(StringPiece option,
27003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji                                          char* argv[],
28003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji                                          int* index,
29003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji                                          const char** out_arg) {
30003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  const char* arg = argv[*index];
31003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  if (!HasPrefix(arg, option))
32003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    return false;
33003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  if (arg[option.size()] == '\0') {
34003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    ++*index;
35003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    *out_arg = argv[*index];
36003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    return true;
37003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  }
38003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  if (arg[option.size()] == '=') {
39003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    *out_arg = arg + option.size() + 1;
40003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    return true;
41003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  }
42003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  // E.g, -j999
43003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  if (option.size() == 2) {
44003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    *out_arg = arg + option.size();
45003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    return true;
46003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  }
47003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  return false;
48003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji}
49003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji
50003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamajivoid Flags::Parse(int argc, char** argv) {
51003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  subkati_args.push_back(argv[0]);
521a444a870705b263cb4ee080ddfafde42c0f5563Shinichiro Hamaji  num_jobs = num_cpus = sysconf(_SC_NPROCESSORS_ONLN);
53003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  const char* num_jobs_str;
54003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji
55003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  for (int i = 1; i < argc; i++) {
56003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    const char* arg = argv[i];
57003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    bool should_propagate = true;
58003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    int pi = i;
59003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    if (!strcmp(arg, "-f")) {
60003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      makefile = argv[++i];
61003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      should_propagate = false;
62003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (!strcmp(arg, "-c")) {
63003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      is_syntax_check_only = true;
64003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (!strcmp(arg, "-i")) {
65003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      is_dry_run = true;
66003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (!strcmp(arg, "-s")) {
67003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      is_silent_mode = true;
68003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (!strcmp(arg, "--kati_stats")) {
69003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      enable_stat_logs = true;
70644d6b9b5e0ffa14e38e7c2212e1a686b248c1cdShinichiro Hamaji    } else if (!strcmp(arg, "--warn")) {
71644d6b9b5e0ffa14e38e7c2212e1a686b248c1cdShinichiro Hamaji      enable_kati_warnings = true;
72003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (!strcmp(arg, "--ninja")) {
73003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      generate_ninja = true;
747223e7be32cc2fcb263612f9cece0d307e70ed8bShinichiro Hamaji    } else if (!strcmp(arg, "--gen_all_targets")) {
757223e7be32cc2fcb263612f9cece0d307e70ed8bShinichiro Hamaji      gen_all_targets = true;
76003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (!strcmp(arg, "--regen")) {
77003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      // TODO: Make this default.
78003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      regen = true;
79003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (!strcmp(arg, "--regen_ignoring_kati_binary")) {
80003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      regen_ignoring_kati_binary = true;
81003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (!strcmp(arg, "--dump_kati_stamp")) {
82003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      dump_kati_stamp = true;
83003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (!strcmp(arg, "--detect_android_echo")) {
84003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      detect_android_echo = true;
85f3ad9e0cec73953592df5143d16d880595c7bc6eShinichiro Hamaji    } else if (!strcmp(arg, "--detect_depfiles")) {
86f3ad9e0cec73953592df5143d16d880595c7bc6eShinichiro Hamaji      detect_depfiles = true;
87003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (ParseCommandLineOptionWithArg(
88003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        "-j", argv, &i, &num_jobs_str)) {
89003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      num_jobs = strtol(num_jobs_str, NULL, 10);
90003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      if (num_jobs <= 0) {
91003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        ERROR("Invalid -j flag: %s", num_jobs_str);
92003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      }
93003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (ParseCommandLineOptionWithArg(
94003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        "--remote_num_jobs", argv, &i, &num_jobs_str)) {
95003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      remote_num_jobs = strtol(num_jobs_str, NULL, 10);
96003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      if (remote_num_jobs <= 0) {
97003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        ERROR("Invalid -j flag: %s", num_jobs_str);
98003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      }
99003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (ParseCommandLineOptionWithArg(
100003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        "--ninja_suffix", argv, &i, &ninja_suffix)) {
101003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (ParseCommandLineOptionWithArg(
102003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        "--ninja_dir", argv, &i, &ninja_dir)) {
103003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (!strcmp(arg, "--use_find_emulator")) {
104003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      use_find_emulator = true;
105003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (ParseCommandLineOptionWithArg(
106003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        "--goma_dir", argv, &i, &goma_dir)) {
107003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (ParseCommandLineOptionWithArg(
108003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        "--ignore_optional_include",
109003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        argv, &i, &ignore_optional_include_pattern)) {
110003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (ParseCommandLineOptionWithArg(
111003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        "--ignore_dirty",
112003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        argv, &i, &ignore_dirty_pattern)) {
113f23ae8caf11bf0d37d5669603224b76638fc74d4Colin Cross    } else if (ParseCommandLineOptionWithArg(
114f23ae8caf11bf0d37d5669603224b76638fc74d4Colin Cross        "--no_ignore_dirty",
115f23ae8caf11bf0d37d5669603224b76638fc74d4Colin Cross        argv, &i, &no_ignore_dirty_pattern)) {
116003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else if (arg[0] == '-') {
117003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      ERROR("Unknown flag: %s", arg);
118003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    } else {
119003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      if (strchr(arg, '=')) {
120003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        cl_vars.push_back(arg);
121003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      } else {
122003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        should_propagate = false;
123003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        targets.push_back(Intern(arg));
124003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      }
125003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    }
126003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji
127003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    if (should_propagate) {
128003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      for (; pi <= i; pi++) {
129003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji        subkati_args.push_back(argv[pi]);
130003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji      }
131003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji    }
132003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji  }
133003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji}
134