feat: enhance perl command resolution with PATH environment handling
This commit is contained in:
+19
-6
@@ -48,7 +48,8 @@ pub fn build(
|
|||||||
let configure_script = resolve_perl_configure_script(spec, &actual_src);
|
let configure_script = resolve_perl_configure_script(spec, &actual_src);
|
||||||
crate::log_info!("Running perl {}...", configure_script.display());
|
crate::log_info!("Running perl {}...", configure_script.display());
|
||||||
|
|
||||||
let mut configure_cmd = Command::new("perl");
|
let mut configure_cmd =
|
||||||
|
Command::new(resolved_command_path("perl").unwrap_or_else(|| PathBuf::from("perl")));
|
||||||
configure_cmd.current_dir(&actual_src);
|
configure_cmd.current_dir(&actual_src);
|
||||||
configure_cmd.arg(&configure_script);
|
configure_cmd.arg(&configure_script);
|
||||||
if !has_assignment_prefix(&flags.configure, "INSTALLDIRS") {
|
if !has_assignment_prefix(&flags.configure, "INSTALLDIRS") {
|
||||||
@@ -307,15 +308,27 @@ fn resolved_script_path(cmd: &Command) -> Option<PathBuf> {
|
|||||||
return Some(program.to_path_buf());
|
return Some(program.to_path_buf());
|
||||||
}
|
}
|
||||||
|
|
||||||
let path_value = cmd
|
let path_value = command_path_env(cmd)?;
|
||||||
.get_envs()
|
std::env::split_paths(&path_value)
|
||||||
.find_map(|(key, value)| (key == "PATH").then_some(value))
|
|
||||||
.flatten()?;
|
|
||||||
std::env::split_paths(path_value)
|
|
||||||
.map(|dir| dir.join(program))
|
.map(|dir| dir.join(program))
|
||||||
.find(|candidate| candidate.is_file())
|
.find(|candidate| candidate.is_file())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn resolved_command_path(program: &str) -> Option<PathBuf> {
|
||||||
|
let path_value = std::env::var_os("PATH")?;
|
||||||
|
std::env::split_paths(&path_value)
|
||||||
|
.map(|dir| dir.join(program))
|
||||||
|
.find(|candidate| candidate.is_file())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn command_path_env(cmd: &Command) -> Option<std::ffi::OsString> {
|
||||||
|
cmd.get_envs()
|
||||||
|
.find_map(|(key, value)| (key == "PATH").then_some(value))
|
||||||
|
.flatten()
|
||||||
|
.map(|value| value.to_os_string())
|
||||||
|
.or_else(|| std::env::var_os("PATH"))
|
||||||
|
}
|
||||||
|
|
||||||
fn has_assignment_prefix(args: &[String], name: &str) -> bool {
|
fn has_assignment_prefix(args: &[String], name: &str) -> bool {
|
||||||
args.iter().any(|arg| {
|
args.iter().any(|arg| {
|
||||||
let trimmed = arg.trim();
|
let trimmed = arg.trim();
|
||||||
|
|||||||
Reference in New Issue
Block a user