60 lines
1.5 KiB
Go
60 lines
1.5 KiB
Go
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}
|
|
}
|