about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2022-05-20 15:29:12 +0000
committerbors <bors@rust-lang.org>2022-05-20 15:29:12 +0000
commit11823872240d83aa5075575056414cd7d29eba3f (patch)
treeb7698bd4fc047dee90920b2cfca1adf7379b3886
parent2a978e1404cdfa6f83818717b2dcdc989e8bc09f (diff)
parent33939a3db1da5a9e9c0009e50d3b70318a0b84a4 (diff)
downloadrust-11823872240d83aa5075575056414cd7d29eba3f.tar.gz
rust-11823872240d83aa5075575056414cd7d29eba3f.zip
Auto merge of #12329 - jonas-schievink:build-script-errors, r=jonas-schievink
fix: Don't swallow build script errors
-rw-r--r--crates/project-model/src/build_scripts.rs34
1 files changed, 17 insertions, 17 deletions
diff --git a/crates/project-model/src/build_scripts.rs b/crates/project-model/src/build_scripts.rs
index 5aa23331a13..d4792633efb 100644
--- a/crates/project-model/src/build_scripts.rs
+++ b/crates/project-model/src/build_scripts.rs
@@ -7,6 +7,7 @@
 //! here, but it covers procedural macros as well.
 
 use std::{
+    cell::RefCell,
     io,
     path::PathBuf,
     process::{Command, Stdio},
@@ -107,15 +108,15 @@ impl WorkspaceBuildScripts {
             by_id.insert(workspace[package].id.clone(), package);
         }
 
-        let mut cfg_err = None;
-        let mut stderr = String::new();
+        let errors = RefCell::new(String::new());
+        let push_err = |err: &str| {
+            let mut e = errors.borrow_mut();
+            e.push_str(err);
+            e.push('\n');
+        };
         let output = stdx::process::streaming_output(
             cmd,
             &mut |line| {
-                if cfg_err.is_some() {
-                    return;
-                }
-
                 // Copy-pasted from existing cargo_metadata. It seems like we
                 // should be using serde_stacker here?
                 let mut deserializer = serde_json::Deserializer::from_str(line);
@@ -135,7 +136,7 @@ impl WorkspaceBuildScripts {
                                 match cfg.parse::<CfgFlag>() {
                                     Ok(it) => acc.push(it),
                                     Err(err) => {
-                                        cfg_err = Some(format!(
+                                        push_err(&format!(
                                             "invalid cfg from cargo-metadata: {}",
                                             err
                                         ));
@@ -177,6 +178,10 @@ impl WorkspaceBuildScripts {
                     }
                     Message::CompilerMessage(message) => {
                         progress(message.target.name);
+
+                        if let Some(diag) = message.message.rendered.as_deref() {
+                            push_err(diag);
+                        }
                     }
                     Message::BuildFinished(_) => {}
                     Message::TextLine(_) => {}
@@ -184,8 +189,7 @@ impl WorkspaceBuildScripts {
                 }
             },
             &mut |line| {
-                stderr.push_str(line);
-                stderr.push('\n');
+                push_err(line);
             },
         )?;
 
@@ -205,16 +209,12 @@ impl WorkspaceBuildScripts {
             }
         }
 
-        if let Some(cfg_err) = cfg_err {
-            stderr.push_str(&cfg_err);
-            stderr.push('\n');
-        }
-
+        let mut errors = errors.into_inner();
         if !output.status.success() {
-            if stderr.is_empty() {
-                stderr = "cargo check failed".to_string();
+            if errors.is_empty() {
+                errors = "cargo check failed".to_string();
             }
-            res.error = Some(stderr)
+            res.error = Some(errors);
         }
 
         Ok(res)