about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTerin Stock <terinjokes@gmail.com>2017-07-14 16:38:48 -0600
committerTerin Stock <terinjokes@gmail.com>2017-07-14 23:38:25 -0600
commitd5b1fc4cea623a0d1699c9c2e693415ac69ca667 (patch)
treed56a1b3e9b4fa20aa6e710c413d2defa52581c95
parent290e822a687e7d69def79d55dd7801447c804293 (diff)
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.
-rw-r--r--.travis.yml5
-rw-r--r--Gopkg.lock15
-rw-r--r--Gopkg.toml3
-rw-r--r--main.go70
4 files changed, 62 insertions, 31 deletions
diff --git a/.travis.yml b/.travis.yml
index 1de576e..48a19e9 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,9 +2,10 @@ language: go
 go:
   - 1.8.x
 install:
-  - go get github.com/Masterminds/glide
+  - go get github.com/golang/dep/cmd/dep
+  - dep ensure
 script:
-  - go test -v $(glide nv)
+  - go test -v $(go list ./... | grep -v /vendor/)
 
 jobs:
   include:
diff --git a/Gopkg.lock b/Gopkg.lock
new file mode 100644
index 0000000..19691af
--- /dev/null
+++ b/Gopkg.lock
@@ -0,0 +1,15 @@
+# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
+
+
+[[projects]]
+  branch = "master"
+  name = "github.com/neelance/parallel"
+  packages = ["."]
+  revision = "4de9ce63d14c18517a79efe69e10e99d32c850c3"
+
+[solve-meta]
+  analyzer-name = "dep"
+  analyzer-version = 1
+  inputs-digest = "5cee123e66d33e8e63ab1f1a2ae68b744798e2093d92a855bfa52f7465b4c6ca"
+  solver-name = "gps-cdcl"
+  solver-version = 1
diff --git a/Gopkg.toml b/Gopkg.toml
new file mode 100644
index 0000000..3e6859e
--- /dev/null
+++ b/Gopkg.toml
@@ -0,0 +1,3 @@
+[[constraint]]
+  branch = "master"
+  name = "github.com/neelance/parallel"
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()
 }