11//! Display various information about `cargo gpu`, eg its cache directory.
22
3- use std:: fs;
4-
53use 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