@@ -96,6 +96,7 @@ use self::unit_graph::UnitDep;
9696
9797use crate :: core:: compiler:: future_incompat:: FutureIncompatReport ;
9898use crate :: core:: compiler:: locking:: LockKey ;
99+ use crate :: core:: compiler:: rustdoc:: is_rustdoc_json_output;
99100use crate :: core:: compiler:: timings:: SectionTiming ;
100101pub use crate :: core:: compiler:: unit:: Unit ;
101102pub use crate :: core:: compiler:: unit:: UnitIndex ;
@@ -868,7 +869,16 @@ fn prepare_rustdoc(build_runner: &BuildRunner<'_, '_>, unit: &Unit) -> CargoResu
868869 add_cap_lints ( bcx, unit, & mut rustdoc) ;
869870
870871 unit. kind . add_target_arg ( & mut rustdoc) ;
871- let doc_dir = build_runner. files ( ) . output_dir ( unit) ;
872+
873+ let doc_dir = if is_rustdoc_json_output ( build_runner) {
874+ // Always use new layout for '--output-format=json'.
875+ // In fix for https://github.com/rust-lang/cargo/issues/16291
876+
877+ build_runner. files ( ) . out_dir_new_layout ( unit)
878+ } else {
879+ build_runner. files ( ) . output_dir ( unit)
880+ } ;
881+
872882 rustdoc. arg ( "-o" ) . arg ( & doc_dir) ;
873883 rustdoc. args ( & features_args ( unit) ) ;
874884 rustdoc. args ( & check_cfg_args ( unit) ) ;
@@ -972,7 +982,9 @@ fn rustdoc(build_runner: &mut BuildRunner<'_, '_>, unit: &Unit) -> CargoResult<W
972982 let mut rustdoc = prepare_rustdoc ( build_runner, unit) ?;
973983
974984 let crate_name = unit. target . crate_name ( ) ;
985+ let is_json_output = is_rustdoc_json_output ( build_runner) ;
975986 let doc_dir = build_runner. files ( ) . output_dir ( unit) ;
987+ let new_doc_dir = build_runner. files ( ) . out_dir_new_layout ( unit) ;
976988 // Create the documentation directory ahead of time as rustdoc currently has
977989 // a bug where concurrent invocations will race to create this directory if
978990 // it doesn't already exist.
@@ -1055,12 +1067,17 @@ fn rustdoc(build_runner: &mut BuildRunner<'_, '_>, unit: &Unit) -> CargoResult<W
10551067 }
10561068 }
10571069
1058- let crate_dir = doc_dir. join ( & crate_name) ;
1070+ let crate_dir = if is_json_output {
1071+ new_doc_dir
1072+ } else {
1073+ doc_dir. join ( & crate_name)
1074+ } ;
1075+
10591076 if crate_dir. exists ( ) {
10601077 // Remove output from a previous build. This ensures that stale
10611078 // files for removed items are removed.
10621079 debug ! ( "removing pre-existing doc directory {:?}" , crate_dir) ;
1063- paths:: remove_dir_all ( crate_dir) ?;
1080+ paths:: remove_dir_all ( & crate_dir) ?;
10641081 }
10651082 state. running ( & rustdoc) ;
10661083 let timestamp = paths:: set_invocation_time ( & fingerprint_dir) ?;
0 commit comments