package main import ( "fmt" "os/exec" "sync" ) func Compile(cfg *CompileConfig, ch chan<- *CompileReport, wg *sync.WaitGroup) { filename := fmt.Sprintf("%s_%s_%s%s", ProjectName, cfg.OS, cfg.Arch, cfg.FileExt) ch <- &CompileReport{Config: cfg, State: StateCompiling} compileCmd := exec.Command("go", "build", "-o", filename) compileCmd.Dir = ModulePath if err := compileCmd.Start(); err != nil { ch <- &CompileReport{Config: cfg, State: StateCompileError} wg.Done() return } if err := compileCmd.Wait(); err != nil { ch <- &CompileReport{Config: cfg, State: StateCompileError} wg.Done() return } Compress(filename, cfg, ch, wg) // uncomment for independent compile and compress tasks // (slightly slower in tests, most likely because of more context switches) /* ch <- &CompileReport{Config: cfg, State: StateWaiting} go Runner.Run(func() { Compress(filename, cfg, ch, wg) }) */ } func Compress(filename string, cfg *CompileConfig, ch chan<- *CompileReport, wg *sync.WaitGroup) { defer wg.Done() ch <- &CompileReport{Config: cfg, State: StateCompressing} if !*NoCompress && cfg.Compress { compressCmd := exec.Command("upx", "--best", filename) compressCmd.Dir = ModulePath if err := compressCmd.Start(); err != nil { ch <- &CompileReport{Config: cfg, State: StateCompressError} return } if err := compressCmd.Wait(); err != nil { ch <- &CompileReport{Config: cfg, State: StateCompressError} return } } ch <- &CompileReport{Config: cfg, State: StateDone} }