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 <unistd.h>
20 
21 #include "log.h"
22 #include "strutil.h"
23 
24 Flags g_flags;
25 
ParseCommandLineOptionWithArg(StringPiece option,char * argv[],int * index,const char ** out_arg)26 static bool ParseCommandLineOptionWithArg(StringPiece option,
27                                           char* argv[],
28                                           int* index,
29                                           const char** out_arg) {
30   const char* arg = argv[*index];
31   if (!HasPrefix(arg, option))
32     return false;
33   if (arg[option.size()] == '\0') {
34     ++*index;
35     *out_arg = argv[*index];
36     return true;
37   }
38   if (arg[option.size()] == '=') {
39     *out_arg = arg + option.size() + 1;
40     return true;
41   }
42   // E.g, -j999
43   if (option.size() == 2) {
44     *out_arg = arg + option.size();
45     return true;
46   }
47   return false;
48 }
49 
Parse(int argc,char ** argv)50 void Flags::Parse(int argc, char** argv) {
51   subkati_args.push_back(argv[0]);
52   num_jobs = num_cpus = sysconf(_SC_NPROCESSORS_ONLN);
53   const char* num_jobs_str;
54 
55   for (int i = 1; i < argc; i++) {
56     const char* arg = argv[i];
57     bool should_propagate = true;
58     int pi = i;
59     if (!strcmp(arg, "-f")) {
60       makefile = argv[++i];
61       should_propagate = false;
62     } else if (!strcmp(arg, "-c")) {
63       is_syntax_check_only = true;
64     } else if (!strcmp(arg, "-i")) {
65       is_dry_run = true;
66     } else if (!strcmp(arg, "-s")) {
67       is_silent_mode = true;
68     } else if (!strcmp(arg, "--kati_stats")) {
69       enable_stat_logs = true;
70     } else if (!strcmp(arg, "--warn")) {
71       enable_kati_warnings = true;
72     } else if (!strcmp(arg, "--ninja")) {
73       generate_ninja = true;
74     } else if (!strcmp(arg, "--gen_all_targets")) {
75       gen_all_targets = true;
76     } else if (!strcmp(arg, "--regen")) {
77       // TODO: Make this default.
78       regen = true;
79     } else if (!strcmp(arg, "--regen_ignoring_kati_binary")) {
80       regen_ignoring_kati_binary = true;
81     } else if (!strcmp(arg, "--dump_kati_stamp")) {
82       dump_kati_stamp = true;
83     } else if (!strcmp(arg, "--detect_android_echo")) {
84       detect_android_echo = true;
85     } else if (!strcmp(arg, "--detect_depfiles")) {
86       detect_depfiles = true;
87     } else if (ParseCommandLineOptionWithArg(
88         "-j", argv, &i, &num_jobs_str)) {
89       num_jobs = strtol(num_jobs_str, NULL, 10);
90       if (num_jobs <= 0) {
91         ERROR("Invalid -j flag: %s", num_jobs_str);
92       }
93     } else if (ParseCommandLineOptionWithArg(
94         "--remote_num_jobs", argv, &i, &num_jobs_str)) {
95       remote_num_jobs = strtol(num_jobs_str, NULL, 10);
96       if (remote_num_jobs <= 0) {
97         ERROR("Invalid -j flag: %s", num_jobs_str);
98       }
99     } else if (ParseCommandLineOptionWithArg(
100         "--ninja_suffix", argv, &i, &ninja_suffix)) {
101     } else if (ParseCommandLineOptionWithArg(
102         "--ninja_dir", argv, &i, &ninja_dir)) {
103     } else if (!strcmp(arg, "--use_find_emulator")) {
104       use_find_emulator = true;
105     } else if (ParseCommandLineOptionWithArg(
106         "--goma_dir", argv, &i, &goma_dir)) {
107     } else if (ParseCommandLineOptionWithArg(
108         "--ignore_optional_include",
109         argv, &i, &ignore_optional_include_pattern)) {
110     } else if (ParseCommandLineOptionWithArg(
111         "--ignore_dirty",
112         argv, &i, &ignore_dirty_pattern)) {
113     } else if (ParseCommandLineOptionWithArg(
114         "--no_ignore_dirty",
115         argv, &i, &no_ignore_dirty_pattern)) {
116     } else if (arg[0] == '-') {
117       ERROR("Unknown flag: %s", arg);
118     } else {
119       if (strchr(arg, '=')) {
120         cl_vars.push_back(arg);
121       } else {
122         should_propagate = false;
123         targets.push_back(Intern(arg));
124       }
125     }
126 
127     if (should_propagate) {
128       for (; pi <= i; pi++) {
129         subkati_args.push_back(argv[pi]);
130       }
131     }
132   }
133 }
134