Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions src/cargo/ops/cargo_package.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use std::sync::Arc;
use std::task::Poll;

use crate::core::compiler::{BuildConfig, CompileMode, DefaultExecutor, Executor};
use crate::core::manifest::Target;
use crate::core::resolver::CliFeatures;
use crate::core::{registry::PackageRegistry, resolver::HasDevUnits};
use crate::core::{Feature, Shell, Verbosity, Workspace};
Expand Down Expand Up @@ -331,6 +332,29 @@ fn build_ar_list(
warn_on_nonexistent_file(&pkg, &readme_path, "readme", &ws)?;
}
}

for t in pkg
.manifest()
.targets()
.iter()
.filter(|t| t.is_custom_build())
{
if let Some(custome_build_path) = t.src_path().path() {
let abs_custome_build_path =
paths::normalize_path(&pkg.root().join(custome_build_path));
if abs_custome_build_path.is_file() {
if !abs_custome_build_path
.ancestors()
.any(|ancestor| ancestor == pkg.root())
{
warn_custom_build_file_not_in_package(pkg, &abs_custome_build_path, t, &ws)?
}
} else {
warn_on_nonexistent_file(&pkg, &custome_build_path, "build", &ws)?
}
}
}

result.sort_unstable_by(|a, b| a.rel_path.cmp(&b.rel_path));

Ok(result)
Expand Down Expand Up @@ -405,6 +429,23 @@ fn warn_on_nonexistent_file(
))
}

fn warn_custom_build_file_not_in_package(
pkg: &Package,
path: &Path,
target: &Target,
ws: &Workspace<'_>,
) -> CargoResult<()> {
let msg = format!(
"the source file of {:?} target `{}` doesn't appear to be a path inside of the package.\n\
It is at {}, whereas the root the package is {}.\n\
This may cause issue during packaging, as modules resolution and resources included via macros are often relative to the path of source files.\n\
Please update the `build` setting in the manifest at `{}` and point to a path inside the root of the package.",
target.kind(), target.name(), path.display(), pkg.root().display(), pkg.manifest_path().display()
);

ws.config().shell().warn(&msg)
}

/// Construct `Cargo.lock` for the package to be published.
fn build_lock(ws: &Workspace<'_>, orig_pkg: &Package) -> CargoResult<String> {
let config = ws.config();
Expand Down
54 changes: 54 additions & 0 deletions tests/testsuite/package.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3304,3 +3304,57 @@ fn init_and_add_inner_target(p: ProjectBuilder) -> ProjectBuilder {
.file("derp/target/foo.txt", "")
.file("derp/not_target/foo.txt", "")
}

#[cargo_test]
fn custom_build_warning() {
let p = project()
.file(
"Cargo.toml",
r#"
[package]
name = "foo"
version = "0.0.1"
license = "MIT"
description = "foo"
authors = []
build = "../t_custom_build/custom_build.rs"
"#,
)
.file("src/main.rs", "fn main() {}")
.build();
p.cargo("package -l")
.with_stderr(format!(
"\
warning: manifest has no documentation, homepage or repository.
See https://doc.rust-lang.org/cargo/reference/manifest.html#package-metadata for more info.
warning: build `{}/../t_custom_build/custom_build.rs` does not appear to exist.
Please update the build setting in the manifest at `{}/Cargo.toml`
This may become a hard error in the future.
",
p.root().display(),
p.root().display()
))
.run();

// crate custom_build.rs outside the package root
let custom_build_root = p.root().parent().unwrap().join("t_custom_build");
_ = fs::create_dir(&custom_build_root).unwrap();
_ = fs::write(&custom_build_root.join("custom_build.rs"), "fn main() {}");

p.cargo("package -l")
.with_stderr(format!(
"\
warning: manifest has no documentation, homepage or repository.
See https://doc.rust-lang.org/cargo/reference/manifest.html#package-metadata for more info.
warning: the source file of \"custom-build\" target `build-script-custom_build` doesn't appear to be a path inside of the package.
It is at {}/t_custom_build/custom_build.rs, whereas the root the package is {}.
This may cause issue during packaging, as modules resolution and resources included via macros are often relative to the path of source files.
Please update the `build` setting in the manifest at `{}/Cargo.toml` and point to a path inside the root of the package.
",
p.root().parent().unwrap().display(),
p.root().display(),
p.root().display()
))
.run();
_ = fs::remove_dir_all(&custom_build_root).unwrap();
}