- 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)
- }
- }