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