fix(e2e): honor custom Cargo target directory

This commit is contained in:
overtrue
2026-08-23 08:05:08 +08:00
parent 20d1266496
commit b287bd3b34
+38 -12
View File
@@ -310,6 +310,17 @@ pub fn rustfs_binary_path() -> PathBuf {
rustfs_binary_path_with_features(requested_rustfs_build_features().as_deref()) rustfs_binary_path_with_features(requested_rustfs_build_features().as_deref())
} }
fn resolve_rustfs_binary_path(workspace: &Path, configured_target_dir: Option<&Path>) -> PathBuf {
let mut path = match configured_target_dir {
Some(path) if path.is_absolute() => path.to_path_buf(),
Some(path) => workspace.join(path),
None => workspace.join("target"),
};
path.push(if cfg!(debug_assertions) { "debug" } else { "release" });
path.push(format!("rustfs{}", std::env::consts::EXE_SUFFIX));
path
}
/// Resolve the RustFS binary relative to the workspace, optionally requesting build features. /// Resolve the RustFS binary relative to the workspace, optionally requesting build features.
pub fn rustfs_binary_path_with_features(requested_features: Option<&str>) -> PathBuf { pub fn rustfs_binary_path_with_features(requested_features: Option<&str>) -> PathBuf {
if let Some(path) = std::env::var_os("CARGO_BIN_EXE_rustfs") { if let Some(path) = std::env::var_os("CARGO_BIN_EXE_rustfs") {
@@ -317,11 +328,9 @@ pub fn rustfs_binary_path_with_features(requested_features: Option<&str>) -> Pat
} }
let requested_features = requested_features.and_then(normalize_rustfs_build_features); let requested_features = requested_features.and_then(normalize_rustfs_build_features);
let mut binary_path = workspace_root(); let workspace = workspace_root();
binary_path.push("target"); let configured_target_dir = std::env::var_os("CARGO_TARGET_DIR").map(PathBuf::from);
let profile_dir = if cfg!(debug_assertions) { "debug" } else { "release" }; let binary_path = resolve_rustfs_binary_path(&workspace, configured_target_dir.as_deref());
binary_path.push(profile_dir);
binary_path.push(format!("rustfs{}", std::env::consts::EXE_SUFFIX));
let features_match = binary_features_match(&binary_path, requested_features.as_deref()); let features_match = binary_features_match(&binary_path, requested_features.as_deref());
let source_is_newer = workspace_sources_newer_than_binary(&binary_path); let source_is_newer = workspace_sources_newer_than_binary(&binary_path);
@@ -338,7 +347,7 @@ pub fn rustfs_binary_path_with_features(requested_features: Option<&str>) -> Pat
} }
info!("Building RustFS binary to ensure it's up to date..."); info!("Building RustFS binary to ensure it's up to date...");
build_rustfs_binary(requested_features.as_deref()); build_rustfs_binary(requested_features.as_deref(), &binary_path);
info!("Using RustFS binary at {:?}", binary_path); info!("Using RustFS binary at {:?}", binary_path);
binary_path binary_path
@@ -440,7 +449,7 @@ fn path_is_newer_than(binary_modified: std::time::SystemTime, path: &Path) -> bo
} }
/// Build the RustFS binary using cargo /// Build the RustFS binary using cargo
fn build_rustfs_binary(requested_features: Option<&str>) { fn build_rustfs_binary(requested_features: Option<&str>, binary_path: &Path) {
let workspace = workspace_root(); let workspace = workspace_root();
info!("Building RustFS binary from workspace: {:?}", workspace); info!("Building RustFS binary from workspace: {:?}", workspace);
@@ -476,11 +485,7 @@ fn build_rustfs_binary(requested_features: Option<&str>) {
panic!("Failed to build RustFS binary. Error: {stderr}"); panic!("Failed to build RustFS binary. Error: {stderr}");
} }
let mut binary_path = workspace; let stamp_path = rustfs_binary_features_stamp_path(binary_path);
binary_path.push("target");
binary_path.push(if cfg!(debug_assertions) { "debug" } else { "release" });
binary_path.push(format!("rustfs{}", std::env::consts::EXE_SUFFIX));
let stamp_path = rustfs_binary_features_stamp_path(&binary_path);
if let Err(err) = stdfs::write(&stamp_path, requested_features.unwrap_or_default()) { if let Err(err) = stdfs::write(&stamp_path, requested_features.unwrap_or_default()) {
warn!("Failed to write RustFS feature stamp {:?}: {}", stamp_path, err); warn!("Failed to write RustFS feature stamp {:?}: {}", stamp_path, err);
} }
@@ -1755,6 +1760,27 @@ mod tests {
); );
} }
#[test]
fn resolves_rustfs_binary_in_configured_cargo_target_directory() {
let workspace = Path::new("workspace");
let profile = if cfg!(debug_assertions) { "debug" } else { "release" };
let binary = format!("rustfs{}", std::env::consts::EXE_SUFFIX);
assert_eq!(
resolve_rustfs_binary_path(workspace, None),
workspace.join("target").join(profile).join(&binary)
);
assert_eq!(
resolve_rustfs_binary_path(workspace, Some(Path::new("custom-target"))),
workspace.join("custom-target").join(profile).join(&binary)
);
let absolute = std::env::temp_dir().join("rustfs-e2e-custom-target");
assert_eq!(
resolve_rustfs_binary_path(workspace, Some(&absolute)),
absolute.join(profile).join(binary)
);
}
#[test] #[test]
fn full_feature_enables_any_required_feature() { fn full_feature_enables_any_required_feature() {
assert!(rustfs_build_feature_enabled(Some("full"), "sftp")); assert!(rustfs_build_feature_enabled(Some("full"), "sftp"));