From 760ff62f3642106214d079ad931dac611dc4bf6d Mon Sep 17 00:00:00 2001 From: Weihang Lo Date: Sat, 11 Dec 2021 08:21:24 +0800 Subject: [PATCH] Improve I/O error message for fingerprint of build script It is a bit rough but I don't think there is a network I/O error in `pkg_fingerprint`. Checking only `io::Error` type should be fine. --- src/cargo/core/compiler/fingerprint.rs | 19 ++++++++++++++----- tests/testsuite/build_script.rs | 6 ++++++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/cargo/core/compiler/fingerprint.rs b/src/cargo/core/compiler/fingerprint.rs index 90e99da5c9f..e3aaf9c76ec 100644 --- a/src/cargo/core/compiler/fingerprint.rs +++ b/src/cargo/core/compiler/fingerprint.rs @@ -316,6 +316,7 @@ use std::collections::hash_map::{Entry, HashMap}; use std::convert::TryInto; use std::env; use std::hash::{self, Hash, Hasher}; +use std::io; use std::path::{Path, PathBuf}; use std::str; use std::sync::{Arc, Mutex}; @@ -1366,11 +1367,19 @@ fn calculate_run_custom_build(cx: &mut Context<'_, '_>, unit: &Unit) -> CargoRes let local = (gen_local)( deps, Some(&|| { - pkg_fingerprint(cx.bcx, &unit.pkg).with_context(|| { - format!( - "failed to determine package fingerprint for build script for {}", - unit.pkg - ) + const IO_ERR_MESSAGE: &str = "\ +An I/O error happened. Please make sure you can access the file. + +By default, if your project contains a build script, cargo scans all files in +it to determine whether a rebuild is needed. If you don't expect to access the +file, specify `rerun-if-changed` in your build script. +See https://doc.rust-lang.org/cargo/reference/build-scripts.html#rerun-if-changed for more information."; + pkg_fingerprint(cx.bcx, &unit.pkg).map_err(|err| { + let mut message = format!("failed to determine package fingerprint for build script for {}", unit.pkg); + if err.root_cause().is::() { + message = format!("{}\n{}", message, IO_ERR_MESSAGE) + } + err.context(message) }) }), )? diff --git a/tests/testsuite/build_script.rs b/tests/testsuite/build_script.rs index 4b8f648b579..966ea1e1a3c 100644 --- a/tests/testsuite/build_script.rs +++ b/tests/testsuite/build_script.rs @@ -4639,6 +4639,12 @@ fn build_script_scan_eacces() { .with_stderr( "\ [ERROR] failed to determine package fingerprint for build script for foo v0.0.1 ([..]/foo) +An I/O error happened[..] + +By default[..] +it to[..] +file[..] +See[..] Caused by: failed to determine the most recently modified file in [..]/foo