@@ -64,6 +64,9 @@ struct Options {
64
64
65
65
// / Tool to run rather than building.
66
66
const Tool* tool;
67
+
68
+ // / Whether duplicate rules for one target should warn or print an error.
69
+ bool dupe_edges_should_err;
67
70
};
68
71
69
72
// / The Ninja main() loads up a series of data structures; various tools need
@@ -199,7 +202,8 @@ void Usage(const BuildConfig& config) {
199
202
" \n "
200
203
" -d MODE enable debugging (use -d list to list modes)\n "
201
204
" -t TOOL run a subtool (use -t list to list subtools)\n "
202
- " terminates toplevel options; further flags are passed to the tool\n " ,
205
+ " terminates toplevel options; further flags are passed to the tool\n "
206
+ " -w FLAG adjust warnings (use -w list to list warnings)\n " ,
203
207
kNinjaVersion , config.parallelism );
204
208
}
205
209
@@ -792,6 +796,32 @@ bool DebugEnable(const string& name) {
792
796
}
793
797
}
794
798
799
+ // / Set a warning flag. Returns false if Ninja should exit instead of
800
+ // / continuing.
801
+ bool WarningEnable (const string& name, Options* options) {
802
+ if (name == " list" ) {
803
+ printf (" warning flags:\n "
804
+ " dupbuild={err,warn} multiple build lines for one target\n " );
805
+ return false ;
806
+ } else if (name == " dupbuild=err" ) {
807
+ options->dupe_edges_should_err = true ;
808
+ return true ;
809
+ } else if (name == " dupbuild=warn" ) {
810
+ options->dupe_edges_should_err = false ;
811
+ return true ;
812
+ } else {
813
+ const char * suggestion =
814
+ SpellcheckString (name.c_str (), " dupbuild=err" , " dupbuild=warn" , NULL );
815
+ if (suggestion) {
816
+ Error (" unknown warning flag '%s', did you mean '%s'?" ,
817
+ name.c_str (), suggestion);
818
+ } else {
819
+ Error (" unknown warning flag '%s'" , name.c_str ());
820
+ }
821
+ return false ;
822
+ }
823
+ }
824
+
795
825
bool NinjaMain::OpenBuildLog (bool recompact_only) {
796
826
string log_path = " .ninja_log" ;
797
827
if (!build_dir_.empty ())
@@ -962,7 +992,7 @@ int ReadFlags(int* argc, char*** argv,
962
992
963
993
int opt;
964
994
while (!options->tool &&
965
- (opt = getopt_long (*argc, *argv, " d:f:j:k:l:nt:vC :h" , kLongOptions ,
995
+ (opt = getopt_long (*argc, *argv, " d:f:j:k:l:nt:vw:C :h" , kLongOptions ,
966
996
NULL )) != -1 ) {
967
997
switch (opt) {
968
998
case ' d' :
@@ -1011,6 +1041,10 @@ int ReadFlags(int* argc, char*** argv,
1011
1041
case ' v' :
1012
1042
config->verbosity = BuildConfig::VERBOSE;
1013
1043
break ;
1044
+ case ' w' :
1045
+ if (!WarningEnable (optarg , options))
1046
+ return 1 ;
1047
+ break ;
1014
1048
case ' C' :
1015
1049
options->working_dir = optarg ;
1016
1050
break ;
@@ -1067,7 +1101,8 @@ int real_main(int argc, char** argv) {
1067
1101
NinjaMain ninja (ninja_command, config);
1068
1102
1069
1103
RealFileReader file_reader;
1070
- ManifestParser parser (&ninja.state_ , &file_reader);
1104
+ ManifestParser parser (&ninja.state_ , &file_reader,
1105
+ options.dupe_edges_should_err );
1071
1106
string err;
1072
1107
if (!parser.Load (options.input_file , &err)) {
1073
1108
Error (" %s" , err.c_str ());
0 commit comments