diff --git a/src/cargo/ops/cargo_compile/mod.rs b/src/cargo/ops/cargo_compile/mod.rs index 64e81fdf3a4..0a07eacd9f5 100644 --- a/src/cargo/ops/cargo_compile/mod.rs +++ b/src/cargo/ops/cargo_compile/mod.rs @@ -58,6 +58,8 @@ use crate::util::BuildLogger; use crate::util::context::{GlobalContext, WarningHandling}; use crate::util::interning::InternedString; use crate::util::log_message::LogMessage; +use crate::util::machine_message; +use crate::util::machine_message::Message as _; use crate::util::{CargoResult, StableHasher}; mod compile_filter; @@ -181,6 +183,12 @@ pub fn compile_ws<'a>( target_dir: ws.target_dir().as_path_unlocked().to_path_buf(), workspace_root: ws.root().to_path_buf(), }); + + if options.build_config.emit_json() { + let run_id = logger.run_id().to_string(); + let msg = machine_message::BuildStarted { run_id: &run_id }.to_json_string(); + writeln!(ws.gctx().shell().out(), "{msg}")?; + } } let bcx = create_bcx(ws, options, &interner, logger.as_ref())?; diff --git a/src/cargo/util/machine_message.rs b/src/cargo/util/machine_message.rs index 6623521766c..bdc1cfd3690 100644 --- a/src/cargo/util/machine_message.rs +++ b/src/cargo/util/machine_message.rs @@ -103,3 +103,14 @@ impl Message for BuildFinished { "build-finished" } } + +#[derive(Serialize)] +pub struct BuildStarted<'a> { + pub run_id: &'a str, +} + +impl Message for BuildStarted<'_> { + fn reason(&self) -> &str { + "build-started" + } +} diff --git a/tests/testsuite/build_analysis.rs b/tests/testsuite/build_analysis.rs index 458461bf726..4ec5d87aa65 100644 --- a/tests/testsuite/build_analysis.rs +++ b/tests/testsuite/build_analysis.rs @@ -719,6 +719,39 @@ fn log_msg_resolution_events() { ); } +#[cargo_test] +fn json_message_build_started_with_run_id() { + let p = project() + .file("Cargo.toml", &basic_manifest("foo", "0.0.0")) + .file("src/lib.rs", "") + .build(); + + p.cargo("check -Zbuild-analysis --message-format=json") + .env("CARGO_BUILD_ANALYSIS_ENABLED", "true") + .masquerade_as_nightly_cargo(&["build-analysis"]) + .with_stdout_data( + str![[r#" +[ + { + "reason": "build-started", + "run_id": "[..]T[..]Z-[..]" + }, + { + "reason": "compiler-artifact", + "...": "{...}" + }, + { + "reason": "build-finished", + "success": true + } +] +"#]] + .is_json() + .against_jsonlines(), + ) + .run(); +} + fn get_log(idx: usize) -> String { std::fs::read_to_string(log_file(idx)).unwrap() }