@@ -18,6 +18,8 @@ use crate::rustc::QualifiedToolchain;
1818use crate :: shell:: { MessageInfo , Verbosity } ;
1919use crate :: { CargoVariant , Target } ;
2020
21+ use rustc_version:: Version as RustcVersion ;
22+
2123pub use super :: custom:: CROSS_CUSTOM_DOCKERFILE_IMAGE_PREFIX ;
2224
2325pub const CROSS_IMAGE : & str = "ghcr.io/cross-rs" ;
@@ -37,6 +39,8 @@ pub struct DockerOptions {
3739 pub config : Config ,
3840 pub image : Image ,
3941 pub cargo_variant : CargoVariant ,
42+ // not all toolchains will provide this
43+ pub rustc_version : Option < RustcVersion > ,
4044}
4145
4246impl DockerOptions {
@@ -46,13 +50,15 @@ impl DockerOptions {
4650 config : Config ,
4751 image : Image ,
4852 cargo_variant : CargoVariant ,
53+ rustc_version : Option < RustcVersion > ,
4954 ) -> DockerOptions {
5055 DockerOptions {
5156 engine,
5257 target,
5358 config,
5459 image,
5560 cargo_variant,
61+ rustc_version,
5662 }
5763 }
5864
@@ -514,29 +520,31 @@ fn add_cargo_configuration_envvars(docker: &mut Command) {
514520
515521pub ( crate ) fn docker_envvars (
516522 docker : & mut Command ,
517- config : & Config ,
523+ options : & DockerOptions ,
518524 dirs : & Directories ,
519- target : & Target ,
520- cargo_variant : CargoVariant ,
521525 msg_info : & mut MessageInfo ,
522526) -> Result < ( ) > {
523- for ref var in config. env_passthrough ( target) ?. unwrap_or_default ( ) {
527+ for ref var in options
528+ . config
529+ . env_passthrough ( & options. target ) ?
530+ . unwrap_or_default ( )
531+ {
524532 validate_env_var ( var) ?;
525533
526534 // Only specifying the environment variable name in the "-e"
527535 // flag forwards the value from the parent shell
528536 docker. args ( [ "-e" , var] ) ;
529537 }
530538
531- let runner = config. runner ( target) ?;
539+ let runner = options . config . runner ( & options . target ) ?;
532540 let cross_runner = format ! ( "CROSS_RUNNER={}" , runner. unwrap_or_default( ) ) ;
533541 docker
534542 . args ( [ "-e" , "PKG_CONFIG_ALLOW_CROSS=1" ] )
535543 . args ( [ "-e" , & format ! ( "XARGO_HOME={}" , dirs. xargo_mount_path( ) ) ] )
536544 . args ( [ "-e" , & format ! ( "CARGO_HOME={}" , dirs. cargo_mount_path( ) ) ] )
537545 . args ( [ "-e" , "CARGO_TARGET_DIR=/target" ] )
538546 . args ( [ "-e" , & cross_runner] ) ;
539- if cargo_variant. uses_zig ( ) {
547+ if options . cargo_variant . uses_zig ( ) {
540548 // otherwise, zig has a permission error trying to create the cache
541549 docker. args ( [ "-e" , "XDG_CACHE_HOME=/target/.zig-cache" ] ) ;
542550 }
@@ -564,6 +572,18 @@ pub(crate) fn docker_envvars(
564572 docker. args ( & parse_docker_opts ( & value) ?) ;
565573 } ;
566574
575+ let ( major, minor, patch) = match options. rustc_version . as_ref ( ) {
576+ Some ( version) => ( version. major , version. minor , version. patch ) ,
577+ // no toolchain version available, always provide older
578+ // compiler available. this isn't a major issue because
579+ // linking will libgcc will not include symbols found in
580+ // the builtins.
581+ None => ( 1 , 0 , 0 ) ,
582+ } ;
583+ docker. args ( [ "-e" , & format ! ( "CROSS_RUSTC_MAJOR_VERSION={}" , major) ] ) ;
584+ docker. args ( [ "-e" , & format ! ( "CROSS_RUSTC_MINOR_VERSION={}" , minor) ] ) ;
585+ docker. args ( [ "-e" , & format ! ( "CROSS_RUSTC_PATCH_VERSION={}" , patch) ] ) ;
586+
567587 Ok ( ( ) )
568588}
569589
0 commit comments