@@ -47,6 +47,7 @@ pub(crate) mod layout;
47
47
mod links;
48
48
mod lto;
49
49
mod output_depinfo;
50
+ mod output_sbom;
50
51
pub mod rustdoc;
51
52
pub mod standard_lib;
52
53
mod timings;
@@ -60,7 +61,7 @@ use std::env;
60
61
use std:: ffi:: { OsStr , OsString } ;
61
62
use std:: fmt:: Display ;
62
63
use std:: fs:: { self , File } ;
63
- use std:: io:: { BufRead , Write } ;
64
+ use std:: io:: { BufRead , BufWriter , Write } ;
64
65
use std:: path:: { Path , PathBuf } ;
65
66
use std:: sync:: Arc ;
66
67
@@ -85,6 +86,7 @@ use self::job_queue::{Job, JobQueue, JobState, Work};
85
86
pub ( crate ) use self :: layout:: Layout ;
86
87
pub use self :: lto:: Lto ;
87
88
use self :: output_depinfo:: output_depinfo;
89
+ use self :: output_sbom:: build_sbom;
88
90
use self :: unit_graph:: UnitDep ;
89
91
use crate :: core:: compiler:: future_incompat:: FutureIncompatReport ;
90
92
pub use crate :: core:: compiler:: unit:: { Unit , UnitInterner } ;
@@ -307,6 +309,8 @@ fn rustc(
307
309
let script_metadata = build_runner. find_build_script_metadata ( unit) ;
308
310
let is_local = unit. is_local ( ) ;
309
311
let artifact = unit. artifact ;
312
+ let sbom_files = build_runner. sbom_output_files ( unit) ?;
313
+ let sbom = build_sbom ( build_runner, unit) ?;
310
314
311
315
let hide_diagnostics_for_scrape_unit = build_runner. bcx . unit_can_fail_for_docscraping ( unit)
312
316
&& !matches ! (
@@ -392,6 +396,12 @@ fn rustc(
392
396
if build_plan {
393
397
state. build_plan ( buildkey, rustc. clone ( ) , outputs. clone ( ) ) ;
394
398
} else {
399
+ for file in sbom_files {
400
+ tracing:: debug!( "writing sbom to {}" , file. display( ) ) ;
401
+ let outfile = BufWriter :: new ( paths:: create ( & file) ?) ;
402
+ serde_json:: to_writer ( outfile, & sbom) ?;
403
+ }
404
+
395
405
let result = exec
396
406
. exec (
397
407
& rustc,
@@ -685,6 +695,7 @@ where
685
695
/// completion of other units will be added later in runtime, such as flags
686
696
/// from build scripts.
687
697
fn prepare_rustc ( build_runner : & BuildRunner < ' _ , ' _ > , unit : & Unit ) -> CargoResult < ProcessBuilder > {
698
+ let gctx = build_runner. bcx . gctx ;
688
699
let is_primary = build_runner. is_primary_package ( unit) ;
689
700
let is_workspace = build_runner. bcx . ws . is_member ( & unit. pkg ) ;
690
701
@@ -700,7 +711,7 @@ fn prepare_rustc(build_runner: &BuildRunner<'_, '_>, unit: &Unit) -> CargoResult
700
711
base. args ( args) ;
701
712
}
702
713
base. args ( & unit. rustflags ) ;
703
- if build_runner . bcx . gctx . cli_unstable ( ) . binary_dep_depinfo {
714
+ if gctx. cli_unstable ( ) . binary_dep_depinfo {
704
715
base. arg ( "-Z" ) . arg ( "binary-dep-depinfo" ) ;
705
716
}
706
717
if build_runner. bcx . gctx . cli_unstable ( ) . checksum_freshness {
@@ -709,6 +720,8 @@ fn prepare_rustc(build_runner: &BuildRunner<'_, '_>, unit: &Unit) -> CargoResult
709
720
710
721
if is_primary {
711
722
base. env ( "CARGO_PRIMARY_PACKAGE" , "1" ) ;
723
+ let file_list = std:: env:: join_paths ( build_runner. sbom_output_files ( unit) ?) ?;
724
+ base. env ( "CARGO_SBOM_PATH" , file_list) ;
712
725
}
713
726
714
727
if unit. target . is_test ( ) || unit. target . is_bench ( ) {
0 commit comments