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  }