1717use std:: io:: { BufRead , BufReader , Read } ;
1818use std:: process:: { Command , Output } ;
1919
20+ pub const SUPPRESS_WARNINGS_ENV : & str = "RULES_RUST_SUPPRESS_BUILD_SCRIPT_WARNINGS" ;
21+
2022pub mod cargo_manifest_dir;
2123
2224#[ derive( Debug , PartialEq , Eq ) ]
@@ -57,13 +59,7 @@ pub enum BuildScriptOutput {
5759}
5860
5961impl BuildScriptOutput {
60- /// Converts a line into a [BuildScriptOutput] enum.
61- ///
62- /// Examples
63- /// ```rust
64- /// assert_eq!(BuildScriptOutput::new("cargo::rustc-link-lib=lib"), Some(BuildScriptOutput::LinkLib("lib".to_owned())));
65- /// ```
66- fn new ( line : & str ) -> Option < BuildScriptOutput > {
62+ fn new ( line : & str , emit_warnings : bool ) -> Option < BuildScriptOutput > {
6763 let split = line. splitn ( 2 , '=' ) . collect :: < Vec < _ > > ( ) ;
6864 if split. len ( ) <= 1 {
6965 // Not a cargo directive.
@@ -94,7 +90,9 @@ impl BuildScriptOutput {
9490 None
9591 }
9692 "warning" => {
97- eprint ! ( "Build Script Warning: {}" , split[ 1 ] ) ;
93+ if emit_warnings {
94+ eprint ! ( "Build Script Warning: {}" , split[ 1 ] ) ;
95+ }
9896 None
9997 }
10098 "metadata" => {
@@ -117,10 +115,12 @@ impl BuildScriptOutput {
117115 "rustc-link-arg-bins" => Some ( BuildScriptOutput :: BinLinkArg ( param) ) ,
118116 "rustc-link-arg-bin" => {
119117 // cargo::rustc-link-arg-bin=BIN=FLAG – Passes custom flags to a linker for the binary BIN.
120- eprint ! (
121- "Warning: build script returned unsupported directive `{}`" ,
122- split[ 0 ]
123- ) ;
118+ if emit_warnings {
119+ eprint ! (
120+ "Warning: build script returned unsupported directive `{}`" ,
121+ split[ 0 ]
122+ ) ;
123+ }
124124 None
125125 }
126126 _ => {
@@ -135,7 +135,10 @@ impl BuildScriptOutput {
135135 }
136136
137137 /// Converts a [BufReader] into a vector of [BuildScriptOutput] enums.
138- fn outputs_from_reader < T : Read > ( mut reader : BufReader < T > ) -> Vec < BuildScriptOutput > {
138+ fn outputs_from_reader < T : Read > (
139+ mut reader : BufReader < T > ,
140+ emit_warnings : bool ,
141+ ) -> Vec < BuildScriptOutput > {
139142 let mut result = Vec :: < BuildScriptOutput > :: new ( ) ;
140143 let mut buf = Vec :: new ( ) ;
141144 while reader
@@ -145,7 +148,7 @@ impl BuildScriptOutput {
145148 {
146149 // like cargo, ignore any lines that are not valid utf8
147150 if let Ok ( line) = String :: from_utf8 ( buf. clone ( ) ) {
148- if let Some ( bso) = BuildScriptOutput :: new ( & line) {
151+ if let Some ( bso) = BuildScriptOutput :: new ( & line, emit_warnings ) {
149152 result. push ( bso) ;
150153 }
151154 }
@@ -157,13 +160,14 @@ impl BuildScriptOutput {
157160 /// Take a [Command], execute it and converts its input into a vector of [BuildScriptOutput]
158161 pub fn outputs_from_command (
159162 cmd : & mut Command ,
163+ emit_warnings : bool ,
160164 ) -> Result < ( Vec < BuildScriptOutput > , Output ) , Output > {
161165 let child_output = cmd
162166 . output ( )
163167 . unwrap_or_else ( |e| panic ! ( "Unable to start command:\n {:#?}\n {:?}" , cmd, e) ) ;
164168 if child_output. status . success ( ) {
165169 let reader = BufReader :: new ( child_output. stdout . as_slice ( ) ) ;
166- let output = Self :: outputs_from_reader ( reader) ;
170+ let output = Self :: outputs_from_reader ( reader, emit_warnings ) ;
167171 Ok ( ( output, child_output) )
168172 } else {
169173 Err ( child_output)
@@ -308,7 +312,7 @@ mod tests {
308312
309313 fn from_read_buffer_to_env_and_flags_test_impl ( buff : Cursor < & str > ) {
310314 let reader = BufReader :: new ( buff) ;
311- let result = BuildScriptOutput :: outputs_from_reader ( reader) ;
315+ let result = BuildScriptOutput :: outputs_from_reader ( reader, true ) ;
312316 assert_eq ! ( result. len( ) , 13 ) ;
313317 assert_eq ! ( result[ 0 ] , BuildScriptOutput :: LinkLib ( "sdfsdf" . to_owned( ) ) ) ;
314318 assert_eq ! ( result[ 1 ] , BuildScriptOutput :: Env ( "FOO=BAR" . to_owned( ) ) ) ;
@@ -399,7 +403,7 @@ cargo::rustc-cdylib-link-arg=-undefined
399403cargo::rustc-link-arg-bins=-Wl,--whole-archive
400404cargo::rustc-link-arg-bin=mybin=-Wl,--per-bin" ,
401405 ) ;
402- let result = BuildScriptOutput :: outputs_from_reader ( BufReader :: new ( buff) ) ;
406+ let result = BuildScriptOutput :: outputs_from_reader ( BufReader :: new ( buff) , false ) ;
403407
404408 // `rustc-link-arg-bin` (the per-binary form) is unsupported and dropped.
405409 assert_eq ! (
@@ -453,7 +457,7 @@ cargo::rustc-env=valid2=2
453457" ,
454458 ) ;
455459 let reader = BufReader :: new ( buff) ;
456- let result = BuildScriptOutput :: outputs_from_reader ( reader) ;
460+ let result = BuildScriptOutput :: outputs_from_reader ( reader, true ) ;
457461 assert_eq ! ( result. len( ) , 2 ) ;
458462 assert_eq ! (
459463 & BuildScriptOutput :: outputs_to_env( & result, "/some/absolute/path" , "" ) ,
@@ -472,18 +476,30 @@ cargo:rustc-env=valid2=2
472476" ,
473477 ) ;
474478 let reader = BufReader :: new ( buff) ;
475- let result = BuildScriptOutput :: outputs_from_reader ( reader) ;
479+ let result = BuildScriptOutput :: outputs_from_reader ( reader, true ) ;
476480 assert_eq ! ( result. len( ) , 2 ) ;
477481 assert_eq ! (
478482 & BuildScriptOutput :: outputs_to_env( & result, "/some/absolute/path" , "" ) ,
479483 "valid1=1\n valid2=2"
480484 ) ;
481485 }
482486
487+ #[ test]
488+ fn warning_lines_never_appear_in_outputs ( ) {
489+ let lines = "cargo::warning=hello\n cargo::rustc-env=A=1\n " ;
490+ for emit_warnings in [ true , false ] {
491+ let result = BuildScriptOutput :: outputs_from_reader (
492+ BufReader :: new ( Cursor :: new ( lines) ) ,
493+ emit_warnings,
494+ ) ;
495+ assert_eq ! ( result, vec![ BuildScriptOutput :: Env ( "A=1" . to_owned( ) ) ] ) ;
496+ }
497+ }
498+
483499 #[ test]
484500 fn metadata_directive_maps_to_dep_env_key_value ( ) {
485501 let reader = BufReader :: new ( Cursor :: new ( "cargo::metadata=version_1_10_0=1\n " ) ) ;
486- let result = BuildScriptOutput :: outputs_from_reader ( reader) ;
502+ let result = BuildScriptOutput :: outputs_from_reader ( reader, true ) ;
487503 assert_eq ! (
488504 result,
489505 vec![ BuildScriptOutput :: DepEnv ( "VERSION_1_10_0=1" . to_owned( ) ) ]
@@ -507,7 +523,7 @@ cargo::rustc-env=BAR=/abs/exec_root/elsewhere/file.rs
507523" ,
508524 ) ;
509525 let reader = BufReader :: new ( buff) ;
510- let result = BuildScriptOutput :: outputs_from_reader ( reader) ;
526+ let result = BuildScriptOutput :: outputs_from_reader ( reader, true ) ;
511527 assert_eq ! (
512528 BuildScriptOutput :: outputs_to_env(
513529 & result,
@@ -531,7 +547,7 @@ cargo::rustc-link-search=/abs/exec_root/other/path
531547" ,
532548 ) ;
533549 let reader = BufReader :: new ( buff) ;
534- let result = BuildScriptOutput :: outputs_from_reader ( reader) ;
550+ let result = BuildScriptOutput :: outputs_from_reader ( reader, true ) ;
535551 assert_eq ! (
536552 BuildScriptOutput :: outputs_to_flags(
537553 & result,
0 commit comments