@@ -117,9 +117,9 @@ pub enum SpirvBuilderError {
117117 "`multimodule: true` build cannot be used together with `build_script.env_shader_spv_path: true`"
118118 ) ]
119119 MultiModuleWithEnvShaderSpvPath ,
120- #[ error( "multi-module metadata file missing" ) ]
120+ #[ error( "some metadata file is missing" ) ]
121121 MetadataFileMissing ( #[ from] std:: io:: Error ) ,
122- #[ error( "unable to parse multi-module metadata file" ) ]
122+ #[ error( "unable to parse some metadata file" ) ]
123123 MetadataFileMalformed ( #[ from] serde_json:: Error ) ,
124124 #[ error(
125125 "`{ARTIFACT_SUFFIX}` artifact not found in (supposedly successful) build output.\n --- build output ---\n {stdout}"
@@ -721,17 +721,13 @@ impl SpirvBuilder {
721721
722722 /// Builds the module
723723 pub fn build ( & self ) -> Result < CompileResult , SpirvBuilderError > {
724- let metadata_file = invoke_rustc ( self ) ?;
724+ let out = invoke_rustc ( self ) ?;
725725 if self . build_script . get_dependency_info ( ) {
726- leaf_deps ( & metadata_file, |artifact| {
727- println ! ( "cargo:rerun-if-changed={artifact}" ) ;
728- } )
729- // Close enough
730- . map_err ( SpirvBuilderError :: MetadataFileMissing ) ?;
726+ for dep in & out. deps {
727+ println ! ( "cargo:rerun-if-changed={dep}" ) ;
728+ }
731729 }
732- let metadata = self . parse_metadata_file ( & metadata_file) ?;
733-
734- Ok ( metadata)
730+ Ok ( out. compile_result )
735731 }
736732
737733 pub ( crate ) fn parse_metadata_file (
@@ -818,8 +814,12 @@ fn join_checking_for_separators(strings: Vec<impl Borrow<str>>, sep: &str) -> St
818814 strings. join ( sep)
819815}
820816
821- // Returns path to the metadata json.
822- fn invoke_rustc ( builder : & SpirvBuilder ) -> Result < PathBuf , SpirvBuilderError > {
817+ pub struct RustcOutput {
818+ pub compile_result : CompileResult ,
819+ pub deps : Vec < RawString > ,
820+ }
821+
822+ fn invoke_rustc ( builder : & SpirvBuilder ) -> Result < RustcOutput , SpirvBuilderError > {
823823 let path_to_crate = builder
824824 . path_to_crate
825825 . as_ref ( )
@@ -1090,24 +1090,35 @@ fn invoke_rustc(builder: &SpirvBuilder) -> Result<PathBuf, SpirvBuilderError> {
10901090 // that ended up on stdout instead of stderr.
10911091 let stdout = String :: from_utf8 ( build. stdout ) . unwrap ( ) ;
10921092 if build. status . success ( ) {
1093- get_sole_artifact ( & stdout) . ok_or ( SpirvBuilderError :: NoArtifactProduced { stdout } )
1093+ let metadata_file =
1094+ get_sole_artifact ( & stdout) . ok_or ( SpirvBuilderError :: NoArtifactProduced { stdout } ) ?;
1095+ let compile_result = builder. parse_metadata_file ( & metadata_file) ?;
1096+ let mut deps = Vec :: new ( ) ;
1097+ leaf_deps ( & metadata_file, |artifact| {
1098+ deps. push ( RawString :: from ( artifact) ) ;
1099+ } )
1100+ . map_err ( SpirvBuilderError :: MetadataFileMissing ) ?;
1101+ Ok ( RustcOutput {
1102+ compile_result,
1103+ deps,
1104+ } )
10941105 } else {
10951106 Err ( SpirvBuilderError :: BuildFailed )
10961107 }
10971108}
10981109
1099- #[ derive( Deserialize ) ]
1100- struct RustcOutput {
1101- reason : String ,
1102- filenames : Option < Vec < String > > ,
1103- }
1104-
11051110const ARTIFACT_SUFFIX : & str = ".spv.json" ;
11061111
11071112fn get_sole_artifact ( out : & str ) -> Option < PathBuf > {
1113+ #[ derive( Deserialize ) ]
1114+ struct RustcLine {
1115+ reason : String ,
1116+ filenames : Option < Vec < String > > ,
1117+ }
1118+
11081119 let mut last_compiler_artifact = None ;
11091120 for line in out. lines ( ) {
1110- let Ok ( msg) = serde_json:: from_str :: < RustcOutput > ( line) else {
1121+ let Ok ( msg) = serde_json:: from_str :: < RustcLine > ( line) else {
11111122 // Pass through invalid lines
11121123 println ! ( "{line}" ) ;
11131124 continue ;
0 commit comments