• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2015 Google Inc. All rights reserved
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 // +build ignore
16 
17 #include "flags.h"
18 
19 #include <stdlib.h>
20 #include <unistd.h>
21 
22 #include "log.h"
23 #include "strutil.h"
24 
25 Flags g_flags;
26 
ParseCommandLineOptionWithArg(StringPiece option,char * argv[],int * index,const char ** out_arg)27 static bool ParseCommandLineOptionWithArg(StringPiece option,
28                                           char* argv[],
29                                           int* index,
30                                           const char** out_arg) {
31   const char* arg = argv[*index];
32   if (!HasPrefix(arg, option))
33     return false;
34   if (arg[option.size()] == '\0') {
35     ++*index;
36     *out_arg = argv[*index];
37     return true;
38   }
39   if (arg[option.size()] == '=') {
40     *out_arg = arg + option.size() + 1;
41     return true;
42   }
43   // E.g, -j999
44   if (option.size() == 2) {
45     *out_arg = arg + option.size();
46     return true;
47   }
48   return false;
49 }
50 
Parse(int argc,char ** argv)51 void Flags::Parse(int argc, char** argv) {
52   subkati_args.push_back(argv[0]);
53   num_jobs = num_cpus = sysconf(_SC_NPROCESSORS_ONLN);
54   const char* num_jobs_str;
55   const char* writable_str;
56 
57   if (const char* makeflags = getenv("MAKEFLAGS")) {
58     for (StringPiece tok : WordScanner(makeflags)) {
59       if (!HasPrefix(tok, "-") && tok.find('=') != string::npos)
60         cl_vars.push_back(tok);
61     }
62   }
63 
64   for (int i = 1; i < argc; i++) {
65     const char* arg = argv[i];
66     bool should_propagate = true;
67     int pi = i;
68     if (!strcmp(arg, "-f")) {
69       makefile = argv[++i];
70       should_propagate = false;
71     } else if (!strcmp(arg, "-c")) {
72       is_syntax_check_only = true;
73     } else if (!strcmp(arg, "-i")) {
74       is_dry_run = true;
75     } else if (!strcmp(arg, "-s")) {
76       is_silent_mode = true;
77     } else if (!strcmp(arg, "-d")) {
78       enable_debug = true;
79     } else if (!strcmp(arg, "--kati_stats")) {
80       enable_stat_logs = true;
81     } else if (!strcmp(arg, "--warn")) {
82       enable_kati_warnings = true;
83     } else if (!strcmp(arg, "--ninja")) {
84       generate_ninja = true;
85     } else if (!strcmp(arg, "--empty_ninja_file")) {
86       generate_empty_ninja = true;
87     } else if (!strcmp(arg, "--gen_all_targets")) {
88       gen_all_targets = true;
89     } else if (!strcmp(arg, "--regen")) {
90       // TODO: Make this default.
91       regen = true;
92     } else if (!strcmp(arg, "--regen_debug")) {
93       regen_debug = true;
94     } else if (!strcmp(arg, "--regen_ignoring_kati_binary")) {
95       regen_ignoring_kati_binary = true;
96     } else if (!strcmp(arg, "--dump_kati_stamp")) {
97       dump_kati_stamp = true;
98       regen_debug = true;
99     } else if (!strcmp(arg, "--detect_android_echo")) {
100       detect_android_echo = true;
101     } else if (!strcmp(arg, "--detect_depfiles")) {
102       detect_depfiles = true;
103     } else if (!strcmp(arg, "--color_warnings")) {
104       color_warnings = true;
105     } else if (!strcmp(arg, "--no_builtin_rules")) {
106       no_builtin_rules = true;
107     } else if (!strcmp(arg, "--no_ninja_prelude")) {
108       no_ninja_prelude = true;
109     } else if (!strcmp(arg, "--werror_find_emulator")) {
110       werror_find_emulator = true;
111     } else if (!strcmp(arg, "--werror_overriding_commands")) {
112       werror_overriding_commands = true;
113     } else if (!strcmp(arg, "--warn_implicit_rules")) {
114       warn_implicit_rules = true;
115     } else if (!strcmp(arg, "--werror_implicit_rules")) {
116       werror_implicit_rules = true;
117     } else if (!strcmp(arg, "--warn_suffix_rules")) {
118       warn_suffix_rules = true;
119     } else if (!strcmp(arg, "--werror_suffix_rules")) {
120       werror_suffix_rules = true;
121     } else if (!strcmp(arg, "--top_level_phony")) {
122       top_level_phony = true;
123     } else if (!strcmp(arg, "--warn_real_to_phony")) {
124       warn_real_to_phony = true;
125     } else if (!strcmp(arg, "--werror_real_to_phony")) {
126       warn_real_to_phony = true;
127       werror_real_to_phony = true;
128     } else if (!strcmp(arg, "--warn_phony_looks_real")) {
129       warn_phony_looks_real = true;
130     } else if (!strcmp(arg, "--werror_phony_looks_real")) {
131       warn_phony_looks_real = true;
132       werror_phony_looks_real = true;
133     } else if (!strcmp(arg, "--werror_writable")) {
134       werror_writable = true;
135     } else if (ParseCommandLineOptionWithArg("-j", argv, &i, &num_jobs_str)) {
136       num_jobs = strtol(num_jobs_str, NULL, 10);
137       if (num_jobs <= 0) {
138         ERROR("Invalid -j flag: %s", num_jobs_str);
139       }
140     } else if (ParseCommandLineOptionWithArg("--remote_num_jobs", argv, &i,
141                                              &num_jobs_str)) {
142       remote_num_jobs = strtol(num_jobs_str, NULL, 10);
143       if (remote_num_jobs <= 0) {
144         ERROR("Invalid -j flag: %s", num_jobs_str);
145       }
146     } else if (ParseCommandLineOptionWithArg("--ninja_suffix", argv, &i,
147                                              &ninja_suffix)) {
148     } else if (ParseCommandLineOptionWithArg("--ninja_dir", argv, &i,
149                                              &ninja_dir)) {
150     } else if (!strcmp(arg, "--use_find_emulator")) {
151       use_find_emulator = true;
152     } else if (ParseCommandLineOptionWithArg("--goma_dir", argv, &i,
153                                              &goma_dir)) {
154     } else if (ParseCommandLineOptionWithArg(
155                    "--ignore_optional_include", argv, &i,
156                    &ignore_optional_include_pattern)) {
157     } else if (ParseCommandLineOptionWithArg("--ignore_dirty", argv, &i,
158                                              &ignore_dirty_pattern)) {
159     } else if (ParseCommandLineOptionWithArg("--no_ignore_dirty", argv, &i,
160                                              &no_ignore_dirty_pattern)) {
161     } else if (ParseCommandLineOptionWithArg("--writable", argv, &i,
162                                              &writable_str)) {
163       writable.push_back(writable_str);
164     } else if (arg[0] == '-') {
165       ERROR("Unknown flag: %s", arg);
166     } else {
167       if (strchr(arg, '=')) {
168         cl_vars.push_back(arg);
169       } else {
170         should_propagate = false;
171         targets.push_back(Intern(arg));
172       }
173     }
174 
175     if (should_propagate) {
176       for (; pi <= i; pi++) {
177         subkati_args.push_back(argv[pi]);
178       }
179     }
180   }
181 }
182