Use shlex instead of shell-words

This commit is contained in:
Alan Egerton
2026-03-05 10:59:18 +00:00
parent cbc711ea01
commit f352e743b1
4 changed files with 23 additions and 20 deletions
+1 -7
View File
@@ -4121,7 +4121,7 @@ version = "0.0.0"
dependencies = [
"cc",
"libc",
"shell-words",
"shlex",
]
[[package]]
@@ -5116,12 +5116,6 @@ dependencies = [
"lazy_static",
]
[[package]]
name = "shell-words"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77"
[[package]]
name = "shlex"
version = "1.3.0"
+1 -1
View File
@@ -12,7 +12,7 @@ libc = "0.2.73"
# tidy-alphabetical-start
# `cc` updates often break things, so we pin it here.
cc = "=1.2.16"
shell-words = "1.1.1"
shlex = "1.3.0"
# tidy-alphabetical-end
[features]
+21 -11
View File
@@ -5,7 +5,8 @@
use std::path::{Path, PathBuf};
use std::process::{Command, Output, Stdio};
use std::str::SplitWhitespace;
use std::vec::IntoIter;
use shlex::Shlex;
const OPTIONAL_COMPONENTS: &[&str] = &[
"x86",
@@ -121,9 +122,8 @@ enum LlvmConfigOutput {
UnquotedPaths(String),
}
#[derive(Clone)]
enum SplitLlvmConfigOutput<'a> {
QuotedPaths(IntoIter<String>),
QuotedPaths(Shlex<'a>),
UnquotedPaths(SplitWhitespace<'a>),
}
@@ -137,14 +137,22 @@ fn next(&mut self) -> Option<Cow<'a, str>> {
}
}
impl Drop for SplitLlvmConfigOutput<'_> {
fn drop(&mut self) {
if let Self::QuotedPaths(shlex) = self {
assert!(!shlex.had_error, "error parsing llvm-config output");
}
}
}
impl<'a> IntoIterator for &'a LlvmConfigOutput {
type Item = Cow<'a, str>;
type IntoIter = SplitLlvmConfigOutput<'a>;
fn into_iter(self) -> Self::IntoIter {
match self {
LlvmConfigOutput::QuotedPaths(output) => SplitLlvmConfigOutput::QuotedPaths(
shell_words::split(&output).expect("matched quotes").into_iter(),
),
LlvmConfigOutput::QuotedPaths(output) => {
SplitLlvmConfigOutput::QuotedPaths(Shlex::new(output))
}
LlvmConfigOutput::UnquotedPaths(output) => {
SplitLlvmConfigOutput::UnquotedPaths(output.split_whitespace())
}
@@ -229,7 +237,6 @@ fn main() {
let mut cmd = Command::new(&llvm_config);
cmd.arg("--cxxflags");
let cxxflags = quoted_split(cmd);
let mut cxxflags_iter = cxxflags.into_iter();
let mut cfg = cc::Build::new();
cfg.warnings(false);
@@ -242,7 +249,7 @@ fn main() {
if std::env::var_os("CI").is_some() && !target.contains("msvc") {
cfg.warnings_into_errors(true);
}
for flag in cxxflags_iter.clone() {
for flag in &cxxflags {
// Ignore flags like `-m64` when we're doing a cross build
if is_crossed && flag.starts_with("-m") {
continue;
@@ -435,13 +442,16 @@ fn main() {
// dependencies.
let llvm_linker_flags = tracked_env_var_os("LLVM_LINKER_FLAGS");
if let Some(s) = llvm_linker_flags {
for lib in shell_words::split(&s.into_string().unwrap()).expect("matched quotes") {
let linker_flags = s.into_string().unwrap();
let mut shlex = Shlex::new(&linker_flags);
for lib in shlex.by_ref() {
if let Some(stripped) = lib.strip_prefix("-l") {
println!("cargo:rustc-link-lib={stripped}");
} else if let Some(stripped) = lib.strip_prefix("-L") {
println!("cargo:rustc-link-search=native={stripped}");
}
}
assert!(!shlex.had_error, "error parsing LLVM_LINKER_FLAGS");
}
let llvm_static_stdcpp = tracked_env_var_os("LLVM_STATIC_STDCPP");
@@ -476,7 +486,7 @@ fn main() {
// C++ runtime library
if !target.contains("msvc") {
if let Some(s) = llvm_static_stdcpp {
assert!(cxxflags_iter.all(|flag| flag != "-stdlib=libc++"));
assert!(cxxflags.into_iter().all(|flag| flag != "-stdlib=libc++"));
let path = PathBuf::from(s);
println!("cargo:rustc-link-search=native={}", path.parent().unwrap().display());
if target.contains("windows") {
@@ -484,7 +494,7 @@ fn main() {
} else {
println!("cargo:rustc-link-lib=static={stdcppname}");
}
} else if cxxflags_iter.any(|flag| flag == "-stdlib=libc++") {
} else if cxxflags.into_iter().any(|flag| flag == "-stdlib=libc++") {
println!("cargo:rustc-link-lib=c++");
} else {
println!("cargo:rustc-link-lib={stdcppname}");
-1
View File
@@ -425,7 +425,6 @@ pub(crate) struct WorkspaceInfo<'a> {
"sha1",
"sha2",
"sharded-slab",
"shell-words",
"shlex",
"simd-adler32",
"smallvec",