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