aboutsummaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
authorLibravatar Terin Stock <terinjokes@gmail.com>2017-07-14 16:38:48 -0600
committerLibravatar Terin Stock <terinjokes@gmail.com>2017-07-14 23:38:25 -0600
commitd5b1fc4cea623a0d1699c9c2e693415ac69ca667 (patch)
treed56a1b3e9b4fa20aa6e710c413d2defa52581c95 /main.go
parentfeat(main): just enough to bakelite itself (diff)
downloadbakelite-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.go70
1 files changed, 41 insertions, 29 deletions
diff --git a/main.go b/main.go
index d2ecf84..ea2942c 100644
--- a/main.go
+++ b/main.go
@@ -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()
}