diff options
author | 2017-07-14 16:38:48 -0600 | |
---|---|---|
committer | 2017-07-14 23:38:25 -0600 | |
commit | d5b1fc4cea623a0d1699c9c2e693415ac69ca667 (patch) | |
tree | d56a1b3e9b4fa20aa6e710c413d2defa52581c95 /main.go | |
parent | feat(main): just enough to bakelite itself (diff) | |
download | bakelite-d5b1fc4cea623a0d1699c9c2e693415ac69ca667.tar.xz |
feat(main): run jobs in parallel
Ons systems with multiple CPUs, support running build jobs in parallel.
This is currently a naive implementation, which only supports running
`runtime.NumCPU()` jobs, with no additional configuration.
Diffstat (limited to 'main.go')
-rw-r--r-- | main.go | 70 |
1 files changed, 41 insertions, 29 deletions
@@ -9,6 +9,9 @@ import ( "os" "os/exec" "path/filepath" + "runtime" + + "github.com/neelance/parallel" ) type Arch string @@ -111,37 +114,46 @@ func main() { os.Exit(-1) } + parallelJobs := runtime.NumCPU() + par := parallel.NewRun(parallelJobs) + fmt.Printf("info: running bakelite with %d jobs\n", parallelJobs) + for _, platform := range platforms { for _, pkg := range packages { - 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) - } + 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) } } + par.Wait() } |