@@ -5,7 +5,6 @@ use crate::db::{
55} ;
66use crate :: docbuilder:: { crates:: crates_from_path, Limits } ;
77use crate :: error:: Result ;
8- use crate :: index:: api:: ReleaseData ;
98use crate :: repositories:: RepositoryStatsUpdater ;
109use crate :: storage:: { rustdoc_archive_path, source_archive_path} ;
1110use crate :: utils:: {
@@ -16,7 +15,7 @@ use crate::RUSTDOC_STATIC_STORAGE_PREFIX;
1615use crate :: { db:: blacklist:: is_blacklisted, utils:: MetadataPackage } ;
1716use crate :: { Config , Context , Index , Metrics , Storage } ;
1817use anyhow:: { anyhow, bail, Context as _, Error } ;
19- use docsrs_metadata:: { Metadata , DEFAULT_TARGETS , HOST_TARGET } ;
18+ use docsrs_metadata:: { BuildTargets , Metadata , DEFAULT_TARGETS , HOST_TARGET } ;
2019use failure:: Error as FailureError ;
2120use postgres:: Client ;
2221use regex:: Regex ;
@@ -367,6 +366,7 @@ impl RustwideBuilder {
367366 let mut build_dir = self . workspace . build_dir ( & format ! ( "{name}-{version}" ) ) ;
368367 build_dir. purge ( ) . map_err ( FailureError :: compat) ?;
369368
369+ let is_local = matches ! ( kind, PackageKind :: Local ( _) ) ;
370370 let krate = match kind {
371371 PackageKind :: Local ( path) => Crate :: local ( path) ,
372372 PackageKind :: CratesIo => Crate :: crates_io ( name, version) ,
@@ -383,16 +383,19 @@ impl RustwideBuilder {
383383 let successful = build_dir
384384 . build ( & self . toolchain , & krate, self . prepare_sandbox ( & limits) )
385385 . run ( |build| {
386- ( || -> Result < bool > {
387- use docsrs_metadata:: BuildTargets ;
386+ let metadata = Metadata :: from_crate_root ( build. host_source_dir ( ) ) ?;
387+ let BuildTargets {
388+ default_target,
389+ other_targets,
390+ } = metadata. targets ( self . config . include_default_targets ) ;
391+ let mut targets = vec ! [ default_target] ;
392+ targets. extend ( & other_targets) ;
393+ // Fetch this before we enter the sandbox, so networking isn't blocked.
394+ build. fetch_build_std_dependencies ( & targets) ?;
388395
396+ ( || -> Result < bool > {
389397 let mut has_docs = false ;
390398 let mut successful_targets = Vec :: new ( ) ;
391- let metadata = Metadata :: from_crate_root ( build. host_source_dir ( ) ) ?;
392- let BuildTargets {
393- default_target,
394- other_targets,
395- } = metadata. targets ( self . config . include_default_targets ) ;
396399
397400 // Perform an initial build
398401 let mut res =
@@ -488,19 +491,24 @@ impl RustwideBuilder {
488491 self . metrics . non_library_builds . inc ( ) ;
489492 }
490493
491- let release_data = match self
492- . index
493- . api ( )
494- . get_release_data ( name, version)
495- . with_context ( || {
496- format ! ( "could not fetch releases-data for {name}-{version}" )
497- } ) {
498- Ok ( data) => data,
499- Err ( err) => {
500- report_error ( & err) ;
501- ReleaseData :: default ( )
494+ let release_data = if !is_local {
495+ match self
496+ . index
497+ . api ( )
498+ . get_release_data ( name, version)
499+ . with_context ( || {
500+ format ! ( "could not fetch releases-data for {name}-{version}" )
501+ } ) {
502+ Ok ( data) => Some ( data) ,
503+ Err ( err) => {
504+ report_error ( & err) ;
505+ None
506+ }
502507 }
503- } ;
508+ } else {
509+ None
510+ }
511+ . unwrap_or_default ( ) ;
504512
505513 let cargo_metadata = res. cargo_metadata . root ( ) ;
506514 let repository = self . get_repo ( cargo_metadata) ?;
@@ -530,11 +538,13 @@ impl RustwideBuilder {
530538 self . storage . store_one ( build_log_path, res. build_log ) ?;
531539
532540 // Some crates.io crate data is mutable, so we proactively update it during a release
533- match self . index . api ( ) . get_crate_data ( name) {
534- Ok ( crate_data) => {
535- update_crate_data_in_database ( & mut conn, name, & crate_data) ?
541+ if !is_local {
542+ match self . index . api ( ) . get_crate_data ( name) {
543+ Ok ( crate_data) => {
544+ update_crate_data_in_database ( & mut conn, name, & crate_data) ?
545+ }
546+ Err ( err) => warn ! ( "{:#?}" , err) ,
536547 }
537- Err ( err) => warn ! ( "{:#?}" , err) ,
538548 }
539549
540550 if res. result . successful {
@@ -725,14 +735,6 @@ impl RustwideBuilder {
725735 limits : & Limits ,
726736 mut rustdoc_flags_extras : Vec < String > ,
727737 ) -> Result < Command < ' ws , ' pl > > {
728- // If the explicit target is not a tier one target, we need to install it.
729- if !docsrs_metadata:: DEFAULT_TARGETS . contains ( & target) {
730- // This is a no-op if the target is already installed.
731- self . toolchain
732- . add_target ( & self . workspace , target)
733- . map_err ( FailureError :: compat) ?;
734- }
735-
736738 // Add docs.rs specific arguments
737739 let mut cargo_args = vec ! [
738740 "--offline" . into( ) ,
@@ -781,6 +783,18 @@ impl RustwideBuilder {
781783 rustdoc_flags_extras. extend ( UNCONDITIONAL_ARGS . iter ( ) . map ( |& s| s. to_owned ( ) ) ) ;
782784 let cargo_args = metadata. cargo_args ( & cargo_args, & rustdoc_flags_extras) ;
783785
786+ // If the explicit target is not a tier one target, we need to install it.
787+ let has_build_std = cargo_args. windows ( 2 ) . any ( |args| {
788+ args[ 0 ] . starts_with ( "-Zbuild-std" )
789+ || ( args[ 0 ] == "-Z" && args[ 1 ] . starts_with ( "build-std" ) )
790+ } ) || cargo_args. last ( ) . unwrap ( ) . starts_with ( "-Zbuild-std" ) ;
791+ if !docsrs_metadata:: DEFAULT_TARGETS . contains ( & target) && !has_build_std {
792+ // This is a no-op if the target is already installed.
793+ self . toolchain
794+ . add_target ( & self . workspace , target)
795+ . map_err ( FailureError :: compat) ?;
796+ }
797+
784798 let mut command = build
785799 . cargo ( )
786800 . timeout ( Some ( limits. timeout ( ) ) )
@@ -1218,4 +1232,14 @@ mod tests {
12181232 Ok ( ( ) )
12191233 } ) ;
12201234 }
1235+
1236+ #[ test]
1237+ #[ ignore]
1238+ fn test_build_std ( ) {
1239+ wrapper ( |env| {
1240+ assert ! ( RustwideBuilder :: init( env) ?
1241+ . build_local_package( Path :: new( "tests/crates/build-std" ) ) ?) ;
1242+ Ok ( ( ) )
1243+ } )
1244+ }
12211245}
0 commit comments