@@ -794,16 +794,54 @@ fn main_result() -> anyhow::Result<i32> {
794794 runtime : & runtime_benchmark_dir,
795795 } ;
796796
797- let host_target_tuple =
798- String :: from_utf8 ( command_output ( Command :: new ( "rustc" ) . arg ( "--print=host-tuple" ) ) ?. stdout ) ?
799- . trim ( )
800- . to_string ( ) ;
797+ // We need to find the host tuple for a couple of things (several collector commands need it).
798+ // Probably the simplest way of determining it is asking rustc what is its host tuple.
799+ // However, where to get that rustc? We could just try using "rustc", but that is not always
800+ // available, e.g. on Rust's CI.
801+ // So we try to figure out if we have some rustc available from the command that is being
802+ // executed; such rustc should definitely be executable on this host.
803+ // If we don't, we'll simply fall back to `rustc`.
804+ let used_rustc: Option < String > = match & args. command {
805+ Commands :: BinaryStats {
806+ mode : BinaryStatsMode :: Compile ( args) ,
807+ ..
808+ } => Some ( args. local . rustc . clone ( ) ) ,
809+ Commands :: BenchRuntimeLocal { local, .. } => Some ( local. rustc . clone ( ) ) ,
810+ Commands :: ProfileRuntime { rustc, .. } => Some ( rustc. clone ( ) ) ,
811+ Commands :: CodegenDiff { rustc1, .. } => Some ( rustc1. clone ( ) ) ,
812+ Commands :: BenchLocal { local, .. } => Some ( local. rustc . clone ( ) ) ,
813+ Commands :: ProfileLocal { local, .. } => Some ( local. rustc . clone ( ) ) ,
814+ Commands :: BinaryStats {
815+ mode : BinaryStatsMode :: Local ( _) ,
816+ ..
817+ }
818+ | Commands :: BenchNext { .. }
819+ | Commands :: BenchPublished { .. }
820+ | Commands :: InstallNext { .. }
821+ | Commands :: Download ( _)
822+ | Commands :: PurgeArtifact { .. }
823+ | Commands :: BenchCmp { .. }
824+ | Commands :: AddCollector { .. }
825+ | Commands :: BenchmarkJobQueue { .. } => None ,
826+ } ;
827+
828+ let host_target_tuple = match used_rustc {
829+ Some ( rustc) => get_host_tuple_from_rustc ( & rustc) ,
830+ None => get_host_tuple_from_rustc ( "rustc" ) ,
831+ } ;
832+ // We only unwrap the host tuple in places where we actually need it, to avoid panicking if it
833+ // is missing, but we don't really need it.
834+ let require_host_target_tuple = || {
835+ host_target_tuple. expect (
836+ "Cannot determine host target tuple. Please make a `rustc` binary available in PATH." ,
837+ )
838+ } ;
801839
802840 match args. command {
803841 Commands :: BinaryStats { mode, symbols } => {
804842 match mode {
805843 BinaryStatsMode :: Compile ( args) => {
806- binary_stats_compile ( args, symbols, & host_target_tuple ) ?;
844+ binary_stats_compile ( args, symbols, & require_host_target_tuple ( ) ) ?;
807845 }
808846 BinaryStatsMode :: Local ( args) => {
809847 binary_stats_local ( args, symbols) ?;
@@ -822,7 +860,8 @@ fn main_result() -> anyhow::Result<i32> {
822860 purge,
823861 } => {
824862 log_db ( & db) ;
825- let toolchain = get_local_toolchain_for_runtime_benchmarks ( & local, & host_target_tuple) ?;
863+ let toolchain =
864+ get_local_toolchain_for_runtime_benchmarks ( & local, & require_host_target_tuple ( ) ) ?;
826865 let pool = Pool :: open ( & db. db ) ;
827866
828867 let isolation_mode = if no_isolate {
@@ -871,6 +910,7 @@ fn main_result() -> anyhow::Result<i32> {
871910 rustc2,
872911 benchmark,
873912 } => {
913+ let host_target_tuple = require_host_target_tuple ( ) ;
874914 let get_suite = |rustc : & str , id : & str | {
875915 let toolchain = get_local_toolchain (
876916 & [ Profile :: Opt ] ,
@@ -928,6 +968,7 @@ fn main_result() -> anyhow::Result<i32> {
928968 rustc1 : rustc,
929969 rustc2,
930970 } => {
971+ let host_target_tuple = require_host_target_tuple ( ) ;
931972 let get_toolchain = |rustc : & str , id : & str | {
932973 let toolchain = get_local_toolchain (
933974 & [ Profile :: Opt ] ,
@@ -978,7 +1019,7 @@ fn main_result() -> anyhow::Result<i32> {
9781019 . cargo ( local. cargo . as_deref ( ) , local. cargo_config . as_slice ( ) )
9791020 . id ( local. id . as_deref ( ) ) ,
9801021 "" ,
981- host_target_tuple ,
1022+ require_host_target_tuple ( ) ,
9821023 ) ?;
9831024
9841025 let mut benchmarks = get_compile_benchmarks ( & compile_benchmark_dir, ( & local) . into ( ) ) ?;
@@ -1047,8 +1088,10 @@ fn main_result() -> anyhow::Result<i32> {
10471088
10481089 match next {
10491090 NextArtifact :: Release ( tag) => {
1050- let toolchain =
1051- create_toolchain_from_published_version ( & tag, & host_target_tuple) ?;
1091+ let toolchain = create_toolchain_from_published_version (
1092+ & tag,
1093+ & require_host_target_tuple ( ) ,
1094+ ) ?;
10521095 let conn = rt. block_on ( pool. connection ( ) ) ;
10531096 rt. block_on ( bench_published_artifact (
10541097 conn,
@@ -1097,7 +1140,7 @@ fn main_result() -> anyhow::Result<i32> {
10971140 . block_on ( Sysroot :: install (
10981141 Path :: new ( TOOLCHAIN_CACHE_DIRECTORY ) ,
10991142 sha. clone ( ) ,
1100- & host_target_tuple ,
1143+ & require_host_target_tuple ( ) ,
11011144 & backends,
11021145 ) )
11031146 . map_err ( SysrootDownloadError :: as_anyhow_error)
@@ -1180,7 +1223,7 @@ fn main_result() -> anyhow::Result<i32> {
11801223 let rt = build_async_runtime ( ) ;
11811224 let conn = rt. block_on ( pool. connection ( ) ) ;
11821225 let toolchain =
1183- create_toolchain_from_published_version ( & toolchain, & host_target_tuple ) ?;
1226+ create_toolchain_from_published_version ( & toolchain, & require_host_target_tuple ( ) ) ?;
11841227 rt. block_on ( bench_published_artifact (
11851228 conn,
11861229 toolchain,
@@ -1221,6 +1264,7 @@ fn main_result() -> anyhow::Result<i32> {
12211264 . build_global ( )
12221265 . unwrap ( ) ;
12231266
1267+ let host_target_tuple = require_host_target_tuple ( ) ;
12241268 let mut get_toolchain_and_profile =
12251269 |rustc : & str , suffix : & str | -> anyhow:: Result < String > {
12261270 let toolchain = get_local_toolchain (
@@ -1295,7 +1339,7 @@ fn main_result() -> anyhow::Result<i32> {
12951339 . block_on ( Sysroot :: install (
12961340 Path :: new ( TOOLCHAIN_CACHE_DIRECTORY ) ,
12971341 commit. sha ,
1298- & host_target_tuple ,
1342+ & require_host_target_tuple ( ) ,
12991343 & codegen_backends. 0 ,
13001344 ) )
13011345 . map_err ( SysrootDownloadError :: as_anyhow_error) ?;
@@ -1407,6 +1451,7 @@ Make sure to modify `{dir}/perf-config.json` if the category/artifact don't matc
14071451 )
14081452 } ) ?;
14091453
1454+ let host_target_tuple = require_host_target_tuple ( ) ;
14101455 if collector_config. target ( ) . as_str ( ) != host_target_tuple {
14111456 return Err ( anyhow:: anyhow!(
14121457 "The collector `{collector_name}` is configured for target `{}`, but the current host target seems to be `{host_target_tuple}`" ,
@@ -1437,6 +1482,14 @@ Make sure to modify `{dir}/perf-config.json` if the category/artifact don't matc
14371482 }
14381483}
14391484
1485+ fn get_host_tuple_from_rustc ( rustc : & str ) -> anyhow:: Result < String > {
1486+ Ok (
1487+ String :: from_utf8 ( command_output ( Command :: new ( rustc) . arg ( "--print=host-tuple" ) ) ?. stdout ) ?
1488+ . trim ( )
1489+ . to_string ( ) ,
1490+ )
1491+ }
1492+
14401493/// Maximum number of failures before a job will be marked as failed.
14411494const MAX_JOB_FAILS : u32 = 3 ;
14421495
0 commit comments