github.com/nevalang/neva@v0.23.1-0.20240507185603-7696a9bb8dda/internal/compiler/backend/golang/native/backend.go (about) 1 package native 2 3 import ( 4 "os" 5 "os/exec" 6 "path/filepath" 7 8 "github.com/nevalang/neva/internal/compiler/backend/golang" 9 "github.com/nevalang/neva/internal/runtime/ir" 10 ) 11 12 type Backend struct { 13 golang golang.Backend 14 } 15 16 func (b Backend) Emit(dst string, prog *ir.Program) error { 17 gomod := dst + "/tmp" 18 if err := b.golang.Emit(gomod, prog); err != nil { 19 return err 20 } 21 if err := buildExecutable(gomod, dst); err != nil { 22 return err 23 } 24 if err := os.RemoveAll(gomod); err != nil { 25 return err 26 } 27 return nil 28 } 29 30 func buildExecutable(src, dst string) error { 31 outputPath := filepath.Join(dst, "output") 32 if err := os.Chdir(src); err != nil { 33 return err 34 } 35 cmd := exec.Command( 36 "go", 37 "build", 38 "-ldflags", "-s -w", // strip debug information 39 "-o", outputPath, 40 src, 41 ) 42 cmd.Stdout = os.Stdout 43 cmd.Stderr = os.Stderr 44 return cmd.Run() 45 } 46 47 func NewBackend(golangBackend golang.Backend) Backend { 48 return Backend{ 49 golang: golangBackend, 50 } 51 }