Skip to content

Commit 76aa6af

Browse files
committed
make show targets use new target_specs path querying
1 parent ccd2e25 commit 76aa6af

File tree

1 file changed

+30
-63
lines changed

1 file changed

+30
-63
lines changed

crates/cargo-gpu/src/show.rs

Lines changed: 30 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
//! Display various information about `cargo gpu`, eg its cache directory.
22
3-
use std::fs;
4-
53
use crate::cache_dir;
4+
use crate::spirv_source::{query_metadata, SpirvSource};
5+
use crate::target_specs::update_target_specs_files;
6+
use anyhow::bail;
7+
use std::fs;
8+
use std::path::Path;
69

710
/// Show the computed source of the spirv-std dependency.
811
#[derive(Clone, Debug, clap::Parser)]
@@ -25,7 +28,7 @@ pub enum Info {
2528
Capabilities,
2629

2730
/// All available SPIR-V targets
28-
Targets,
31+
Targets(SpirvSourceDep),
2932
}
3033

3134
/// `cargo gpu show`
@@ -51,8 +54,7 @@ impl Show {
5154
println!("{}\n", cache_dir()?.display());
5255
}
5356
Info::SpirvSource(SpirvSourceDep { shader_crate }) => {
54-
let rust_gpu_source =
55-
crate::spirv_source::SpirvSource::get_rust_gpu_deps_from_shader(shader_crate)?;
57+
let rust_gpu_source = SpirvSource::get_rust_gpu_deps_from_shader(shader_crate)?;
5658
println!("{rust_gpu_source}\n");
5759
}
5860
Info::Commitsh => {
@@ -68,8 +70,10 @@ impl Show {
6870
println!(" {capability:?}");
6971
}
7072
}
71-
Info::Targets => {
72-
for target in Self::available_spirv_targets_iter()? {
73+
Info::Targets(SpirvSourceDep { shader_crate }) => {
74+
let (source, targets) = Self::available_spirv_targets_iter(shader_crate)?;
75+
println!("All available targets for rust-gpu version '{}':", source);
76+
for target in targets {
7377
println!("{target}");
7478
}
7579
}
@@ -89,66 +93,29 @@ impl Show {
8993

9094
/// List all available spirv targets, note: the targets from compile time of cargo-gpu and those
9195
/// in the cache-directory will be picked up.
92-
fn available_spirv_targets_iter() -> anyhow::Result<impl Iterator<Item = String>> {
93-
let legacy_targets = legacy_target_specs::TARGET_SPECS
94-
.iter()
95-
.map(|(spec, _src)| (*spec).to_owned());
96-
97-
let cache_dir = cache_dir()?;
98-
if !cache_dir.exists() {
99-
log::error!(
100-
"SPIR-V cache directory does not exist: {}",
101-
cache_dir.display()
102-
);
96+
fn available_spirv_targets_iter(
97+
shader_crate: &Path,
98+
) -> anyhow::Result<(SpirvSource, impl Iterator<Item = String>)> {
99+
let source = SpirvSource::new(shader_crate, None, None)?;
100+
let install_dir = source.install_dir()?;
101+
if !install_dir.is_dir() {
102+
bail!("rust-gpu version {} is not installed", source);
103103
}
104-
let entries = fs::read_dir(&cache_dir)?;
104+
let dummy_metadata = query_metadata(&install_dir)?;
105+
let target_specs_dir = update_target_specs_files(&source, &dummy_metadata, false)?;
105106

106-
#[expect(
107-
clippy::shadow_unrelated,
108-
reason = "coz we use 'entry' in repeated nestings"
109-
)]
110-
let cached_targets: Vec<String> = entries
111-
.flatten()
112-
.flat_map(|entry| {
113-
let path = entry.path();
114-
if path.is_dir() {
115-
fs::read_dir(path)
116-
.ok()
117-
.into_iter()
118-
.flatten()
119-
.filter_map(Result::ok)
120-
.filter_map(|entry| {
121-
entry
122-
.path()
123-
.file_stem()
124-
.and_then(std::ffi::OsStr::to_str)
125-
.map(str::to_owned)
126-
})
127-
.collect::<Vec<_>>()
128-
} else if path.extension().and_then(std::ffi::OsStr::to_str) == Some("json") {
129-
path.file_stem()
130-
.and_then(std::ffi::OsStr::to_str)
131-
.map(str::to_owned)
132-
.into_iter()
133-
.collect()
134-
} else {
135-
Vec::new()
107+
let mut targets = fs::read_dir(target_specs_dir)?
108+
.filter_map(|entry| {
109+
let file = entry.ok()?;
110+
if file.path().is_file() {
111+
if let Some(target) = file.file_name().to_string_lossy().strip_suffix(".json") {
112+
return Some(target.to_owned());
113+
}
136114
}
115+
None
137116
})
138-
.collect();
139-
if cached_targets.is_empty() {
140-
log::error!(
141-
"Cache directory exists but contains no valid SPIR-V target files (*.json): {}",
142-
cache_dir.display()
143-
);
144-
}
145-
let mut targets: Vec<String> = legacy_targets
146-
.chain(cached_targets)
147-
.filter(|target| target.contains("vulkan"))
148-
.collect::<std::collections::HashSet<_>>()
149-
.into_iter()
150-
.collect();
117+
.collect::<Vec<_>>();
151118
targets.sort();
152-
Ok(targets.into_iter())
119+
Ok((source, targets.into_iter()))
153120
}
154121
}

0 commit comments

Comments
 (0)