@@ -23,7 +23,7 @@ type archBuildResult struct {
23
23
frameworkPath string
24
24
}
25
25
26
- func goAppleBind (gobind string , pkgs []* packages.Package , targets []targetInfo ) error {
26
+ func goAppleBind (gobind string , pkgs []* packages.Package , targets []targetInfo , buildWorkers int ) error {
27
27
var name string
28
28
var title string
29
29
@@ -55,15 +55,20 @@ func goAppleBind(gobind string, pkgs []*packages.Package, targets []targetInfo)
55
55
var waitGroup sync.WaitGroup
56
56
waitGroup .Add (len (targets ))
57
57
58
- var parallelBuildError error
58
+ var parallelBuildErrorBuffer = make (chan error , len (targets ))
59
+ semophore := make (chan struct {}, buildWorkers )
59
60
60
61
for _ , target := range targets {
61
62
go func (target targetInfo ) {
62
- defer waitGroup .Done ()
63
+ semophore <- struct {}{}
64
+ defer func () {
65
+ <- semophore
66
+ waitGroup .Done ()
67
+ }()
63
68
64
69
buildResult , err := buildTargetArch (target , gobind , pkgs , title , name , modulesUsed )
65
70
if err != nil {
66
- parallelBuildError = fmt .Errorf ("cannot build %s [%s]: %v" , target .platform , target .arch , err )
71
+ parallelBuildErrorBuffer <- fmt .Errorf ("cannot build %s [%s]: %v" , target .platform , target .arch , err )
67
72
return
68
73
}
69
74
@@ -75,9 +80,10 @@ func goAppleBind(gobind string, pkgs []*packages.Package, targets []targetInfo)
75
80
}
76
81
77
82
waitGroup .Wait ()
83
+ close (parallelBuildErrorBuffer )
78
84
79
- if parallelBuildError != nil {
80
- return parallelBuildError
85
+ for buildErr := range parallelBuildErrorBuffer {
86
+ return buildErr
81
87
}
82
88
83
89
// Finally combine all frameworks to an XCFramework
0 commit comments