Skip to content

Commit fd0e949

Browse files
committed
Add parallelism limit
1 parent 6d124e1 commit fd0e949

File tree

3 files changed

+27
-7
lines changed

3 files changed

+27
-7
lines changed

cmd/gomobile/bind.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,10 +126,13 @@ func runBind(cmd *command) error {
126126
case isAndroidPlatform(targets[0].platform):
127127
return goAndroidBind(gobind, pkgs, targets)
128128
case isApplePlatform(targets[0].platform):
129+
if buildWorkerError := validateBuildWorkers(buildWorkers); buildWorkerError != nil {
130+
return buildWorkerError
131+
}
129132
if !xcodeAvailable() {
130133
return fmt.Errorf("-target=%q requires Xcode", buildTarget)
131134
}
132-
return goAppleBind(gobind, pkgs, targets)
135+
return goAppleBind(gobind, pkgs, targets, buildWorkers)
133136
default:
134137
return fmt.Errorf(`invalid -target=%q`, buildTarget)
135138
}
@@ -321,3 +324,11 @@ func areGoModulesUsed() (bool, error) {
321324
}
322325
return true, nil
323326
}
327+
328+
func validateBuildWorkers(workers int) error {
329+
if workers < 1 {
330+
return fmt.Errorf("invalid workers %d: must be >= 1", workers)
331+
} else {
332+
return nil
333+
}
334+
}

cmd/gomobile/bind_iosapp.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ type archBuildResult struct {
2323
frameworkPath string
2424
}
2525

26-
func goAppleBind(gobind string, pkgs []*packages.Package, targets []targetInfo) error {
26+
func goAppleBind(gobind string, pkgs []*packages.Package, targets []targetInfo, buildWorkers int) error {
2727
var name string
2828
var title string
2929

@@ -55,15 +55,20 @@ func goAppleBind(gobind string, pkgs []*packages.Package, targets []targetInfo)
5555
var waitGroup sync.WaitGroup
5656
waitGroup.Add(len(targets))
5757

58-
var parallelBuildError error
58+
var parallelBuildErrorBuffer = make(chan error, len(targets))
59+
semophore := make(chan struct{}, buildWorkers)
5960

6061
for _, target := range targets {
6162
go func(target targetInfo) {
62-
defer waitGroup.Done()
63+
semophore <- struct{}{}
64+
defer func() {
65+
<-semophore
66+
waitGroup.Done()
67+
}()
6368

6469
buildResult, err := buildTargetArch(target, gobind, pkgs, title, name, modulesUsed)
6570
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)
6772
return
6873
}
6974

@@ -75,9 +80,10 @@ func goAppleBind(gobind string, pkgs []*packages.Package, targets []targetInfo)
7580
}
7681

7782
waitGroup.Wait()
83+
close(parallelBuildErrorBuffer)
7884

79-
if parallelBuildError != nil {
80-
return parallelBuildError
85+
for buildErr := range parallelBuildErrorBuffer {
86+
return buildErr
8187
}
8288

8389
// Finally combine all frameworks to an XCFramework

cmd/gomobile/build.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"os"
1515
"os/exec"
1616
"regexp"
17+
"runtime"
1718
"strconv"
1819
"strings"
1920

@@ -243,6 +244,7 @@ var (
243244
buildTarget string // -target
244245
buildTrimpath bool // -trimpath
245246
buildWork bool // -work
247+
buildWorkers int // -j
246248
buildBundleID string // -bundleid
247249
buildIOSVersion string // -iosversion
248250
buildAndroidAPI int // -androidapi
@@ -262,6 +264,7 @@ func addBuildFlags(cmd *command) {
262264
cmd.flag.BoolVar(&buildI, "i", false, "")
263265
cmd.flag.BoolVar(&buildTrimpath, "trimpath", false, "")
264266
cmd.flag.Var(&buildTags, "tags", "")
267+
cmd.flag.IntVar(&buildWorkers, "j", runtime.NumCPU(), "")
265268
}
266269

267270
func addBuildFlagsNVXWork(cmd *command) {

0 commit comments

Comments
 (0)