@@ -48,6 +48,23 @@ pub struct BuildDockerImage {
48
48
targets : Vec < String > ,
49
49
}
50
50
51
+ fn locate_dockerfile (
52
+ target : String ,
53
+ docker_root : & Path ,
54
+ cross_toolchain_root : & Path ,
55
+ ) -> cross:: Result < ( String , String ) > {
56
+ let dockerfile_name = format ! ( "Dockerfile.{target}" ) ;
57
+ let dockerfile_root = if cross_toolchain_root. join ( & dockerfile_name) . exists ( ) {
58
+ & cross_toolchain_root
59
+ } else if docker_root. join ( & dockerfile_name) . exists ( ) {
60
+ & docker_root
61
+ } else {
62
+ eyre:: bail!( "unable to find dockerfile for target \" {target}\" " ) ;
63
+ } ;
64
+ let dockerfile = dockerfile_root. join ( dockerfile_name) . display ( ) . to_string ( ) ;
65
+ Ok ( ( target, dockerfile) )
66
+ }
67
+
51
68
pub fn build_docker_image (
52
69
BuildDockerImage {
53
70
ref_type,
@@ -102,23 +119,28 @@ pub fn build_docker_image(
102
119
}
103
120
}
104
121
let gha = std:: env:: var ( "GITHUB_ACTIONS" ) . is_ok ( ) ;
122
+ let docker_root = metadata. workspace_root . join ( "docker" ) ;
123
+ let cross_toolchains_root = docker_root. join ( "cross-toolchains" ) . join ( "docker" ) ;
124
+ let targets = targets
125
+ . into_iter ( )
126
+ . map ( |t| locate_dockerfile ( t, & docker_root, & cross_toolchains_root) )
127
+ . collect :: < cross:: Result < Vec < _ > > > ( ) ?;
128
+
105
129
let mut results = vec ! [ ] ;
106
- for target in & targets {
130
+ for ( target, dockerfile ) in & targets {
107
131
if gha && targets. len ( ) > 1 {
108
132
println ! ( "::group::Build {target}" ) ;
109
133
}
110
134
let mut docker_build = Command :: new ( engine) ;
111
135
docker_build. args ( & [ "buildx" , "build" ] ) ;
112
- docker_build. current_dir ( metadata . workspace_root . join ( "docker" ) ) ;
136
+ docker_build. current_dir ( & docker_root ) ;
113
137
114
138
if push {
115
139
docker_build. arg ( "--push" ) ;
116
140
} else {
117
141
docker_build. arg ( "--load" ) ;
118
142
}
119
143
120
- let dockerfile = format ! ( "Dockerfile.{target}" ) ;
121
-
122
144
let ( target, sub) = if let Some ( ( t, sub) ) = target. split_once ( '.' ) {
123
145
( t. to_owned ( ) , format ! ( "-{sub}" ) )
124
146
} else {
@@ -192,7 +214,7 @@ pub fn build_docker_image(
192
214
docker_build. args ( & [ "--label" , label] ) ;
193
215
}
194
216
195
- docker_build. args ( & [ "-f" , & dockerfile] ) ;
217
+ docker_build. args ( & [ "-f" , dockerfile] ) ;
196
218
197
219
if gha || progress == "plain" {
198
220
docker_build. args ( & [ "--progress" , "plain" ] ) ;
@@ -207,7 +229,10 @@ pub fn build_docker_image(
207
229
if gha && targets. len ( ) > 1 {
208
230
if let Err ( e) = & result {
209
231
// TODO: Determine what instruction errorred, and place warning on that line with appropriate warning
210
- println ! ( "::error file=docker/{dockerfile},title=Build failed::{}" , e)
232
+ println ! (
233
+ "::error file=docker/{},title=Build failed::{}" ,
234
+ dockerfile, e
235
+ )
211
236
}
212
237
}
213
238
results. push (
0 commit comments