8
8
"errors"
9
9
"fmt"
10
10
"io"
11
- "os"
12
11
"os/exec"
13
12
"path/filepath"
14
13
"strconv"
@@ -59,13 +58,15 @@ func goAppleBind(gobind string, pkgs []*packages.Package, targets []targetInfo)
59
58
var waitGroup sync.WaitGroup
60
59
waitGroup .Add (len (targets ))
61
60
61
+ var parallelBuildError error
62
+
62
63
for _ , target := range targets {
63
64
go func (target targetInfo , targetBuildResultMutex * sync.Mutex ) {
64
65
defer waitGroup .Done ()
65
66
66
- err , buildResult := buildTargetArch (target , gobind , pkgs , title , name , modulesUsed )
67
+ buildResult , err := buildTargetArch (target , gobind , pkgs , title , name , modulesUsed )
67
68
if err != nil {
68
- fmt .Errorf ("%v" , err )
69
+ parallelBuildError = fmt .Errorf ("cannot build %s [%s]: %v" , target . platform , target . arch , err )
69
70
return
70
71
}
71
72
@@ -82,6 +83,10 @@ func goAppleBind(gobind string, pkgs []*packages.Package, targets []targetInfo)
82
83
83
84
waitGroup .Wait ()
84
85
86
+ if parallelBuildError != nil {
87
+ return parallelBuildError
88
+ }
89
+
85
90
// Finally combine all frameworks to an XCFramework
86
91
xcframeworkArgs := []string {"-create-xcframework" }
87
92
@@ -95,10 +100,14 @@ func goAppleBind(gobind string, pkgs []*packages.Package, targets []targetInfo)
95
100
} else if len (buildResults ) == 1 {
96
101
refinedBuildResults = append (refinedBuildResults , buildResults [0 ])
97
102
} else {
98
- fmt .Errorf ("unexpected number of build results" , len (buildResults ))
103
+ err = fmt .Errorf ("unexpected number of build results: %v " , len (buildResults ))
99
104
}
100
105
}
101
106
107
+ if err != nil {
108
+ return err
109
+ }
110
+
102
111
for _ , result := range refinedBuildResults {
103
112
xcframeworkArgs = append (xcframeworkArgs , "-framework" , result .frameworkPath )
104
113
}
@@ -144,11 +153,11 @@ func mergeArchsForSinglePlatform(from string, to string) error {
144
153
return nil
145
154
}
146
155
147
- func buildTargetArch (t targetInfo , gobindCommandPath string , pkgs []* packages.Package , title string , name string , modulesUsed bool ) (err error , buildResult * archBuildResult ) {
156
+ func buildTargetArch (t targetInfo , gobindCommandPath string , pkgs []* packages.Package , title string , name string , modulesUsed bool ) (buildResult * archBuildResult , err error ) {
148
157
// Catalyst support requires iOS 13+
149
158
v , _ := strconv .ParseFloat (buildIOSVersion , 64 )
150
159
if t .platform == "maccatalyst" && v < 13.0 {
151
- return errors .New ("catalyst requires -iosversion=13 or higher" ), nil
160
+ return nil , errors .New ("catalyst requires -iosversion=13 or higher" )
152
161
}
153
162
154
163
outDir := filepath .Join (tmpdir , t .platform , t .arch ) // adding arch
@@ -172,9 +181,7 @@ func buildTargetArch(t targetInfo, gobindCommandPath string, pkgs []*packages.Pa
172
181
cmd .Args = append (cmd .Args , p .PkgPath )
173
182
}
174
183
if err := runCmd (cmd ); err != nil {
175
- fmt .Errorf ("%v" , err )
176
- os .Exit (1 )
177
- return err , nil
184
+ return nil , err
178
185
}
179
186
180
187
env := appleEnv [t .String ()][:]
@@ -193,45 +200,45 @@ func buildTargetArch(t targetInfo, gobindCommandPath string, pkgs []*packages.Pa
193
200
env = append (env , gopath )
194
201
195
202
if err := writeGoMod (outDir , t .platform , t .arch ); err != nil {
196
- return err , nil
203
+ return nil , err
197
204
}
198
205
199
206
// Run `go mod tidy` to force to create go.sum.
200
207
// Without go.sum, `go build` fails as of Go 1.16.
201
208
if modulesUsed {
202
209
if err := goModTidyAt (outSrcDir , env ); err != nil {
203
- return err , nil
210
+ return nil , err
204
211
}
205
212
}
206
213
207
214
staticLibPath , err := goAppleBindArchive (name + "-" + t .platform + "-" + t .arch , env , outSrcDir )
208
215
if err != nil {
209
- return fmt .Errorf ("%s/%s: %v" , t .platform , t .arch , err ), nil
216
+ return nil , fmt .Errorf ("%s/%s: %v" , t .platform , t .arch , err )
210
217
}
211
218
212
219
versionsDir := filepath .Join (frameworkDir , "Versions" )
213
220
versionsADir := filepath .Join (versionsDir , "A" )
214
221
titlePath := filepath .Join (versionsADir , title )
215
222
versionsAHeadersDir := filepath .Join (versionsADir , "Headers" )
216
223
if err := mkdir (versionsAHeadersDir ); err != nil {
217
- return err , nil
224
+ return nil , err
218
225
}
219
226
if err := symlink ("A" , filepath .Join (versionsDir , "Current" )); err != nil {
220
- return err , nil
227
+ return nil , err
221
228
}
222
229
if err := symlink ("Versions/Current/Headers" , filepath .Join (frameworkDir , "Headers" )); err != nil {
223
- return err , nil
230
+ return nil , err
224
231
}
225
232
if err := symlink (filepath .Join ("Versions/Current" , title ), filepath .Join (frameworkDir , title )); err != nil {
226
- return err , nil
233
+ return nil , err
227
234
}
228
235
229
236
lipoCmd := exec .Command (
230
237
"xcrun" ,
231
238
"lipo" , staticLibPath , "-create" , "-o" , titlePath ,
232
239
)
233
240
if err := runCmd (lipoCmd ); err != nil {
234
- return err , nil
241
+ return nil , err
235
242
}
236
243
237
244
// Copy header file next to output archive.
@@ -243,7 +250,7 @@ func buildTargetArch(t targetInfo, gobindCommandPath string, pkgs []*packages.Pa
243
250
filepath .Join (gobindDir , bindPrefix + title + ".objc.h" ),
244
251
)
245
252
if err != nil {
246
- return err , nil
253
+ return nil , err
247
254
}
248
255
} else {
249
256
for _ , fileBase := range fileBases {
@@ -253,15 +260,15 @@ func buildTargetArch(t targetInfo, gobindCommandPath string, pkgs []*packages.Pa
253
260
filepath .Join (gobindDir , fileBase + ".objc.h" ),
254
261
)
255
262
if err != nil {
256
- return err , nil
263
+ return nil , err
257
264
}
258
265
}
259
266
err := copyFile (
260
267
filepath .Join (versionsAHeadersDir , "ref.h" ),
261
268
filepath .Join (gobindDir , "ref.h" ),
262
269
)
263
270
if err != nil {
264
- return err , nil
271
+ return nil , err
265
272
}
266
273
headerFiles = append (headerFiles , title + ".h" )
267
274
err = writeFile (filepath .Join (versionsAHeadersDir , title + ".h" ), func (w io.Writer ) error {
@@ -270,24 +277,24 @@ func buildTargetArch(t targetInfo, gobindCommandPath string, pkgs []*packages.Pa
270
277
})
271
278
})
272
279
if err != nil {
273
- return err , nil
280
+ return nil , err
274
281
}
275
282
}
276
283
277
284
if err := mkdir (filepath .Join (versionsADir , "Resources" )); err != nil {
278
- return err , nil
285
+ return nil , err
279
286
}
280
287
281
288
if err := symlink ("Versions/Current/Resources" , filepath .Join (frameworkDir , "Resources" )); err != nil {
282
- return err , nil
289
+ return nil , err
283
290
}
284
291
285
292
err = writeFile (filepath .Join (frameworkDir , "Resources" , "Info.plist" ), func (w io.Writer ) error {
286
293
_ , err := w .Write ([]byte (appleBindInfoPlist ))
287
294
return err
288
295
})
289
296
if err != nil {
290
- return err , nil
297
+ return nil , err
291
298
}
292
299
293
300
var mmVals = struct {
@@ -301,17 +308,17 @@ func buildTargetArch(t targetInfo, gobindCommandPath string, pkgs []*packages.Pa
301
308
return appleModuleMapTmpl .Execute (w , mmVals )
302
309
})
303
310
if err != nil {
304
- return err , nil
311
+ return nil , err
305
312
}
306
313
err = symlink (filepath .Join ("Versions/Current/Modules" ), filepath .Join (frameworkDir , "Modules" ))
307
314
if err != nil {
308
- return err , nil
315
+ return nil , err
309
316
}
310
- return err , & archBuildResult {
317
+ return & archBuildResult {
311
318
titlePath : titlePath ,
312
319
targetInfo : t ,
313
320
frameworkPath : frameworkDir ,
314
- }
321
+ }, err
315
322
}
316
323
317
324
var appleBindHeaderTmpl = template .Must (template .New ("apple.h" ).Parse (`
0 commit comments