diff options
Diffstat (limited to 'main.go')
-rw-r--r-- | main.go | 96 |
1 files changed, 57 insertions, 39 deletions
@@ -11,7 +11,7 @@ import ( "path/filepath" "runtime" - "github.com/neelance/parallel" + "golang.org/x/sync/semaphore" ) type Arch string @@ -114,46 +114,64 @@ func main() { os.Exit(-1) } - parallelJobs := runtime.NumCPU() - par := parallel.NewRun(parallelJobs) + var ( + parallelJobs = runtime.NumCPU() + sem = semaphore.NewWeighted(int64(parallelJobs)) + out = make([]error, len(platforms)*len(packages)) + ctx = context.Background() + ) + fmt.Printf("info: running bakelite with %d jobs\n", parallelJobs) - for _, platform := range platforms { - for _, pkg := range packages { - par.Acquire() - go func(platform Platform, pkg string) { - defer par.Release() - name := fmt.Sprintf("%s-%s-%s", filepath.Base(pkg), platform.OS, platform.Arch) - env := kvs{ - "GOOS": string(platform.OS), - "GOARCH": string(platform.Arch), - "GOROOT": os.Getenv("GOROOT"), - "GOPATH": os.Getenv("GOPATH"), - } - - if cgo { - env["CGO_ENABLED"] = "1" - } else { - env["CGO_ENABLED"] = "0" - } - - var stdout bytes.Buffer - var stderr bytes.Buffer - - cmd := exec.CommandContext(context.Background(), "go", "build", "-o", name, pkg) - cmd.Env = env.Strings() - cmd.Stdout = &stdout - cmd.Stderr = &stderr - - fmt.Printf("info: Running build for %s @ %s/%s…\n", pkg, platform.OS, platform.Arch) - err := cmd.Run() - - if err != nil { - log.Printf("fatal: There was an error! err='%s' stdout='%s' stderr='%s'", err, stdout.String(), stderr.String()) - os.Exit(-1) - } - }(platform, pkg) + for i, platform := range platforms { + for j, pkg := range packages { + if err := sem.Acquire(ctx, 1); err != nil { + log.Printf("failed to acquire semaphore: %s", err) + break + } + + go func(i int, j int, platform Platform, pkg string) { + defer sem.Release(1) + out[i*j] = build(ctx, platform, pkg) + }(i, j, platform, pkg) } } - par.Wait() + + if err := sem.Acquire(ctx, int64(parallelJobs)); err != nil { + log.Printf("failed to acquire semaphore: %s", err) + } +} + +func build(ctx context.Context, platform Platform, pkg string) error { + name := fmt.Sprintf("%s-%s-%s", filepath.Base(pkg), platform.OS, platform.Arch) + + env := kvs{ + "GOOS": string(platform.OS), + "GOARCH": string(platform.Arch), + "GOROOT": os.Getenv("GOROOT"), + "GOPATH": os.Getenv("GOPATH"), + } + + if cgo { + env["CGO_ENABLED"] = "1" + } else { + env["CGO_ENABLED"] = "0" + } + + var stdout bytes.Buffer + var stderr bytes.Buffer + + cmd := exec.CommandContext(context.Background(), "go", "build", "-o", name, pkg) + cmd.Env = env.Strings() + cmd.Stdout = &stdout + cmd.Stderr = &stderr + + fmt.Printf("info: Running build for %s @ %s/%s…\n", pkg, platform.OS, platform.Arch) + err := cmd.Run() + + if err != nil { + log.Printf("fatal: There was an error! err='%s' stdout='%s' stderr='%s'", err, stdout.String(), stderr.String()) + } + + return err } |