@@ -868,7 +868,16 @@ fn prepare_rustdoc(build_runner: &BuildRunner<'_, '_>, unit: &Unit) -> CargoResu
868868 add_cap_lints ( bcx, unit, & mut rustdoc) ;
869869
870870 unit. kind . add_target_arg ( & mut rustdoc) ;
871- let doc_dir = build_runner. files ( ) . output_dir ( unit) ;
871+
872+ let doc_dir = if build_runner. bcx . build_config . intent . wants_doc_json_output ( ) {
873+ // Always use new layout for '--output-format=json'.
874+ // In fix for https://github.com/rust-lang/cargo/issues/16291
875+
876+ build_runner. files ( ) . out_dir_new_layout ( unit)
877+ } else {
878+ build_runner. files ( ) . output_dir ( unit)
879+ } ;
880+
872881 rustdoc. arg ( "-o" ) . arg ( & doc_dir) ;
873882 rustdoc. args ( & features_args ( unit) ) ;
874883 rustdoc. args ( & check_cfg_args ( unit) ) ;
@@ -972,6 +981,7 @@ fn rustdoc(build_runner: &mut BuildRunner<'_, '_>, unit: &Unit) -> CargoResult<W
972981 let mut rustdoc = prepare_rustdoc ( build_runner, unit) ?;
973982
974983 let crate_name = unit. target . crate_name ( ) ;
984+ let is_json_output = build_runner. bcx . build_config . intent . wants_doc_json_output ( ) ;
975985 let doc_dir = build_runner. files ( ) . output_dir ( unit) ;
976986 // Create the documentation directory ahead of time as rustdoc currently has
977987 // a bug where concurrent invocations will race to create this directory if
@@ -1055,13 +1065,15 @@ fn rustdoc(build_runner: &mut BuildRunner<'_, '_>, unit: &Unit) -> CargoResult<W
10551065 }
10561066 }
10571067
1058- let crate_dir = doc_dir. join ( & crate_name) ;
1059- if crate_dir. exists ( ) {
1060- // Remove output from a previous build. This ensures that stale
1061- // files for removed items are removed.
1062- debug ! ( "removing pre-existing doc directory {:?}" , crate_dir) ;
1063- paths:: remove_dir_all ( crate_dir) ?;
1064- }
1068+ if !is_json_output {
1069+ let crate_dir = doc_dir. join ( & crate_name) ;
1070+ if crate_dir. exists ( ) {
1071+ // Remove output from a previous build. This ensures that stale
1072+ // files for removed items are removed.
1073+ debug ! ( "removing pre-existing doc directory {:?}" , crate_dir) ;
1074+ paths:: remove_dir_all ( & crate_dir) ?;
1075+ }
1076+ } ;
10651077 state. running ( & rustdoc) ;
10661078 let timestamp = paths:: set_invocation_time ( & fingerprint_dir) ?;
10671079
0 commit comments