github.com/bir3/gocompiler@v0.3.205/api.go (about)

     1  // Copyright 2022 Bergur Ragnarsson.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package gocompiler //syncpackage:
     6  
     7  import (
     8  	"bytes"
     9  	"errors"
    10  	"fmt"
    11  	"os"
    12  	"os/exec"
    13  	"strings"
    14  
    15          "github.com/bir3/gocompiler/src/cmd/asm" //syncimport: "$pkg/src/$cmd/asm"
    16          "github.com/bir3/gocompiler/src/cmd/cgo" //syncimport: "$pkg/src/$cmd/cgo"
    17          "github.com/bir3/gocompiler/src/cmd/compile" //syncimport: "$pkg/src/$cmd/compile"
    18          "github.com/bir3/gocompiler/src/cmd/gocmd" //syncimport: "$pkg/src/$cmd/gocmd"
    19          "github.com/bir3/gocompiler/src/cmd/gofmt" //syncimport: "$pkg/src/$cmd/gofmt"
    20          "github.com/bir3/gocompiler/src/cmd/link" //syncimport: "$pkg/src/$cmd/link"
    21  
    22  	/*
    23          "github.com/bir3/gocompiler/src/cmd/addr2line" //syncimport: "$pkg/src/$cmd/addr2line"
    24          "github.com/bir3/gocompiler/src/cmd/buildid" //syncimport: "$pkg/src/$cmd/buildid"
    25          "github.com/bir3/gocompiler/src/cmd/covdata" //syncimport: "$pkg/src/$cmd/covdata"
    26          "github.com/bir3/gocompiler/src/cmd/dist" //syncimport: "$pkg/src/$cmd/dist"
    27          "github.com/bir3/gocompiler/src/cmd/doc" //syncimport: "$pkg/src/$cmd/doc"
    28          "github.com/bir3/gocompiler/src/cmd/fix" //syncimport: "$pkg/src/$cmd/fix"
    29          "github.com/bir3/gocompiler/src/cmd/nm" //syncimport: "$pkg/src/$cmd/nm"
    30          "github.com/bir3/gocompiler/src/cmd/objdump" //syncimport: "$pkg/src/$cmd/objdump"
    31          "github.com/bir3/gocompiler/src/cmd/pack" //syncimport: "$pkg/src/$cmd/pack"
    32          "github.com/bir3/gocompiler/src/cmd/test2json" //syncimport: "$pkg/src/$cmd/test2json"
    33          "github.com/bir3/gocompiler/src/cmd/trace" //syncimport: "$pkg/src/$cmd/trace"
    34  	*/
    35          "github.com/bir3/gocompiler/vfs" //syncimport: "$pkg/vfs"
    36  )
    37  
    38  func DebugShowEmbed() {
    39  	vfs.DebugShowEmbed()
    40  }
    41  
    42  func IsRunToolchainRequest() bool {
    43  	return os.Getenv("GOCOMPILER_TOOL") != ""
    44  }
    45  
    46  // adding extra executables : 44 MB -> 51 MB
    47  func RunToolchain() {
    48  	switch os.Getenv("GOCOMPILER_TOOL") {
    49  	/*
    50  		case "addr2line":
    51  			addr2line.Main()
    52  		case "buildid":
    53  			buildid.Main()
    54  		case "covdata":
    55  			covdata.Main()
    56  		case "dist":
    57  			dist.Main()
    58  		case "doc":
    59  			doc.Main()
    60  		case "fix":
    61  			fix.Main()
    62  		case "nm":
    63  			nm.Main()
    64  		case "objdump":
    65  			objdump.Main()
    66  		case "pack":
    67  			pack.Main()
    68  		case "test2json":
    69  			test2json.Main()
    70  		case "trace":
    71  			trace.Main()
    72  	*/
    73  	case "go":
    74  		gocmd.Main()
    75  	case "compile":
    76  		compile.Main()
    77  	case "asm":
    78  		asm.Main()
    79  	case "link":
    80  		link.Main()
    81  	case "cgo":
    82  		cgo.Main()
    83  	case "gofmt":
    84  		gofmt.Main()
    85  	default:
    86  		fmt.Fprintf(os.Stderr, "ERROR: unknown GOCOMPILER_TOOL=%s\n", os.Getenv("GOCOMPILER_TOOL"))
    87  		os.Exit(3)
    88  	}
    89  }
    90  
    91  type Result struct {
    92  	Stdout string
    93  	Stderr string
    94  }
    95  
    96  func Command(env []string, args ...string) (*exec.Cmd, error) {
    97  	if vfs.SharedExe == "" {
    98  		if vfs.SharedExeError == nil {
    99  			panic("program error")
   100  		}
   101  		return nil, vfs.SharedExeError
   102  	}
   103  	if len(args) < 2 {
   104  		return nil, errors.New("too few arguments")
   105  	}
   106  	if !(args[0] == "go" || args[0] == "gofmt") {
   107  		return nil, errors.New("only 'go' or 'gofmt' supported as first argument")
   108  	}
   109  	cmd := exec.Command(vfs.SharedExe, args[1:]...)
   110  
   111  	cmd.Env = make([]string, len(env), len(env)+10)
   112  	copy(cmd.Env, env)
   113  
   114  	// disable cgo for now, does not work yet
   115  	var cgoVar bool = false
   116  	cmd.Env = append(cmd.Env, "GOCOMPILER_TOOL=go")
   117  	for _, s := range cmd.Env {
   118  		if strings.HasPrefix(s, "CGO_ENABLED=") {
   119  			cgoVar = true
   120  		}
   121  	}
   122  	if !cgoVar {
   123  		cmd.Env = append(cmd.Env, "CGO_ENABLED=0")
   124  	}
   125  	return cmd, nil
   126  }
   127  
   128  func RunWithEnv(env []string, args ...string) (Result, error) {
   129  	var result Result
   130  
   131  	cmd, err := Command(env, args...)
   132  	if err != nil {
   133  		return result, err
   134  	}
   135  	var out bytes.Buffer
   136  	var outerr bytes.Buffer
   137  
   138  	cmd.Stdout = &out
   139  	cmd.Stderr = &outerr
   140  
   141  	err = cmd.Run()
   142  	result.Stdout = out.String()
   143  	result.Stderr = outerr.String()
   144  
   145  	if err != nil {
   146  		return result, err
   147  	}
   148  	return result, nil
   149  }
   150  
   151  func Run(args ...string) (Result, error) {
   152  	return RunWithEnv(os.Environ(), args...)
   153  }
   154  
   155  func GoVersion() string {
   156  	return "go1.20.5"
   157  }