package main import ( "fmt" "os" "os/exec" "path/filepath" "runtime" "strings" "github.com/akamensky/argparse" ) func main() { parser := argparse.NewParser("print", "Multi-OS Golang compiler ("+runtime.GOOS+")") p := parser.String("p", "path", &argparse.Options{Required: true, Help: "path/to/program.go t compile"}) err := parser.Parse(os.Args) if err != nil { fmt.Print(parser.Usage(err)) os.Exit(1) } // convert CRLF to LF fullPath := strings.Replace(*p, "\n", "", -1) dir, file := filepath.Split(fullPath) fmt.Println("Dir: " + dir) fmt.Println("File: " + file) if _, err := os.Stat(fullPath); os.IsNotExist(err) { fmt.Println("[-] file does not exist!") os.Exit(1) } osASM := [4]string{"windows-386", "windows-amd64", "linux-386", "linux-amd64"} for index, element := range osASM { fmt.Printf("%v) Compiling %v - ", index+1, element) elemSplit := strings.Split(element, "-") fileNoExt := strings.TrimSuffix(file, filepath.Ext(file)) var ext string if elemSplit[0] == "windows" { ext = ".exe" } else { ext = "" } if runtime.GOOS == "windows" { fmt.Print("(windows compiler)... ") exec.Command("go", "env", "-w", "GOOS="+elemSplit[0]).Output() // windows exec.Command("go", "env", "-w", "GOARCH="+elemSplit[1]).Output() // windows exec.Command("go", "build", "-o", dir+fileNoExt+"-"+element+ext, fullPath).Output() } if runtime.GOOS == "linux" { fmt.Print("(linux compiler)... ") exec.Command("env", "GOOS="+elemSplit[0], "GOARC="+elemSplit[1], "go", "build", "-o", dir+fileNoExt+"-"+element+ext, fullPath).Output() // linux } fmt.Printf("Built %v\n", dir+fileNoExt+"-"+element+ext) } }