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 }