summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'main.go')
-rw-r--r--main.go147
1 files changed, 147 insertions, 0 deletions
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..d2ecf84
--- /dev/null
+++ b/main.go
@@ -0,0 +1,147 @@
+package main
+
+import (
+ "bytes"
+ "context"
+ "flag"
+ "fmt"
+ "log"
+ "os"
+ "os/exec"
+ "path/filepath"
+)
+
+type Arch string
+
+const (
+ ARCH_AMD64 Arch = "amd64"
+ ARCH_386 Arch = "386"
+ ARCH_ARM Arch = "arm"
+ ARCH_ARM64 Arch = "arm64"
+ ARCH_PPC64 Arch = "ppc64"
+ ARCH_PPC64LE Arch = "ppc64le"
+ ARCH_MIPS Arch = "mips"
+ ARCH_MIPSLE Arch = "mipsle"
+ ARCH_MIPS64 Arch = "mips64"
+ ARCH_MIPS64LE Arch = "mips64le"
+)
+
+type OS string
+
+const (
+ OS_ANDROID OS = "android"
+ OS_DARWIN OS = "darwin"
+ OS_DRAGONFLY OS = "dragonfly"
+ OS_FREEBSD OS = "freebsd"
+ OS_LINUX OS = "linux"
+ OS_NETBSD OS = "netbsd"
+ OS_OPENBSD OS = "openbsd"
+ OS_PLAN9 OS = "plan9"
+ OS_SOLARIS OS = "solaris"
+ OS_WINDOWS OS = "windows"
+)
+
+type Platform struct {
+ OS OS
+ Arch Arch
+}
+
+type kvs map[string]string
+
+func (o kvs) Strings() []string {
+ str := []string{}
+ for k, v := range o {
+ str = append(str, k+"="+v)
+ }
+
+ return str
+}
+
+var cgo bool
+
+func main() {
+ // TODO: enable ARM after supporting GOARM
+ // TODO: probably should make this configurable…
+ platforms := []Platform{
+ //{OS_ANDROID, ARCH_ARM},
+ {OS_DARWIN, ARCH_386},
+ {OS_DARWIN, ARCH_AMD64},
+ //{OS_DARWIN, ARCH_ARM},
+ //{OS_DARWIN, ARCH_ARM64},
+ {OS_DRAGONFLY, ARCH_AMD64},
+ {OS_FREEBSD, ARCH_386},
+ {OS_FREEBSD, ARCH_AMD64},
+ //{OS_FREEBSD, ARCH_ARM},
+ {OS_LINUX, ARCH_386},
+ {OS_LINUX, ARCH_AMD64},
+ //{OS_LINUX, ARCH_ARM},
+ //{OS_LINUX, ARCH_ARM64},
+ {OS_LINUX, ARCH_PPC64},
+ {OS_LINUX, ARCH_PPC64LE},
+ {OS_LINUX, ARCH_MIPS},
+ {OS_LINUX, ARCH_MIPSLE},
+ {OS_LINUX, ARCH_MIPS64},
+ {OS_LINUX, ARCH_MIPS64LE},
+ {OS_NETBSD, ARCH_386},
+ {OS_NETBSD, ARCH_AMD64},
+ //{OS_NETBSD, ARCH_ARM},
+ {OS_OPENBSD, ARCH_386},
+ {OS_OPENBSD, ARCH_AMD64},
+ //{OS_OPENBSD, ARCH_ARM},
+ {OS_PLAN9, ARCH_386},
+ {OS_PLAN9, ARCH_AMD64},
+ {OS_SOLARIS, ARCH_AMD64},
+ {OS_WINDOWS, ARCH_386},
+ {OS_WINDOWS, ARCH_AMD64},
+ }
+
+ flags := flag.NewFlagSet("bakelite", flag.ExitOnError)
+ flags.BoolVar(&cgo, "cgo", false, "Enables cgo (BYOTC)")
+ flags.Usage = func() {
+ fmt.Println("bakelite - dev")
+ }
+ if err := flags.Parse(os.Args[1:]); err != nil {
+ flags.Usage()
+ os.Exit(-1)
+ }
+
+ packages := flags.Args()
+ if len(packages) == 0 {
+ fmt.Println("fatal: Expected at least one package.")
+ os.Exit(-1)
+ }
+
+ 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)
+ }
+ }
+ }
+}