env: find llgo root for development
This commit is contained in:
@@ -21,7 +21,7 @@ import (
|
|||||||
"runtime"
|
"runtime"
|
||||||
|
|
||||||
"github.com/goplus/llgo/compiler/cmd/internal/base"
|
"github.com/goplus/llgo/compiler/cmd/internal/base"
|
||||||
"github.com/goplus/llgo/x/env"
|
"github.com/goplus/llgo/compiler/internal/env"
|
||||||
)
|
)
|
||||||
|
|
||||||
// llgo version
|
// llgo version
|
||||||
|
|||||||
43
compiler/internal/env/env.go
vendored
43
compiler/internal/env/env.go
vendored
@@ -2,9 +2,11 @@ package env
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -12,6 +14,7 @@ const (
|
|||||||
LLGoCompilerPkg = "github.com/goplus/llgo"
|
LLGoCompilerPkg = "github.com/goplus/llgo"
|
||||||
LLGoRuntimePkgName = "runtime"
|
LLGoRuntimePkgName = "runtime"
|
||||||
LLGoRuntimePkg = LLGoCompilerPkg + "/" + LLGoRuntimePkgName
|
LLGoRuntimePkg = LLGoCompilerPkg + "/" + LLGoRuntimePkgName
|
||||||
|
envFileName = "/compiler/internal/env/env.go"
|
||||||
)
|
)
|
||||||
|
|
||||||
func GOROOT() string {
|
func GOROOT() string {
|
||||||
@@ -53,13 +56,22 @@ func LLGoROOT() string {
|
|||||||
}
|
}
|
||||||
// Check if parent directory is bin
|
// Check if parent directory is bin
|
||||||
dir := filepath.Dir(exe)
|
dir := filepath.Dir(exe)
|
||||||
if filepath.Base(dir) != "bin" {
|
if filepath.Base(dir) == "bin" {
|
||||||
return ""
|
// Get parent directory of bin
|
||||||
|
root := filepath.Dir(dir)
|
||||||
|
if root, ok := isLLGoRoot(root); ok {
|
||||||
|
return root
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Get parent directory of bin
|
if Devel() {
|
||||||
root := filepath.Dir(dir)
|
root, err := getRuntimePkgDirByCaller()
|
||||||
if root, ok := isLLGoRoot(root); ok {
|
if err != nil {
|
||||||
return root
|
return ""
|
||||||
|
}
|
||||||
|
if root, ok := isLLGoRoot(root); ok {
|
||||||
|
fmt.Fprintln(os.Stderr, "WARNING: Using LLGO root for devel: "+root)
|
||||||
|
return root
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
@@ -83,3 +95,22 @@ func isLLGoRoot(root string) (string, bool) {
|
|||||||
}
|
}
|
||||||
return root, true
|
return root, true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getRuntimePkgDirByCaller() (string, error) {
|
||||||
|
_, file, _, ok := runtime.Caller(0)
|
||||||
|
if !ok {
|
||||||
|
return "", fmt.Errorf("cannot get caller")
|
||||||
|
}
|
||||||
|
if !strings.HasSuffix(file, envFileName) {
|
||||||
|
return "", fmt.Errorf("wrong caller")
|
||||||
|
}
|
||||||
|
// check file exists
|
||||||
|
if _, err := os.Stat(file); os.IsNotExist(err) {
|
||||||
|
return "", fmt.Errorf("file %s not exists", file)
|
||||||
|
}
|
||||||
|
modPath := strings.TrimSuffix(file, envFileName)
|
||||||
|
if st, err := os.Stat(modPath); os.IsNotExist(err) || !st.IsDir() {
|
||||||
|
return "", fmt.Errorf("not llgo compiler root: %s", modPath)
|
||||||
|
}
|
||||||
|
return modPath, nil
|
||||||
|
}
|
||||||
|
|||||||
6
compiler/internal/env/env_test.go
vendored
6
compiler/internal/env/env_test.go
vendored
@@ -58,8 +58,10 @@ func TestLLGoRuntimeDir(t *testing.T) {
|
|||||||
defer os.Setenv("LLGO_ROOT", origLLGoRoot)
|
defer os.Setenv("LLGO_ROOT", origLLGoRoot)
|
||||||
|
|
||||||
os.Setenv("LLGO_ROOT", "/nonexistent/path")
|
os.Setenv("LLGO_ROOT", "/nonexistent/path")
|
||||||
if got := LLGoRuntimeDir(); got != "" {
|
wd, _ := os.Getwd()
|
||||||
t.Errorf("LLGoRuntimeDir() = %v, want empty string", got)
|
expected, _ := filepath.Abs(filepath.Join(wd, "../../../runtime"))
|
||||||
|
if got := LLGoRuntimeDir(); got != expected {
|
||||||
|
t.Errorf("LLGoRuntimeDir() = %v, want %v", got, expected)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ import "runtime/debug"
|
|||||||
var buildVersion string
|
var buildVersion string
|
||||||
|
|
||||||
// Version returns the version of the running LLGo binary.
|
// Version returns the version of the running LLGo binary.
|
||||||
|
//
|
||||||
|
//export LLGoVersion
|
||||||
func Version() string {
|
func Version() string {
|
||||||
if buildVersion != "" {
|
if buildVersion != "" {
|
||||||
return buildVersion
|
return buildVersion
|
||||||
@@ -33,3 +35,7 @@ func Version() string {
|
|||||||
}
|
}
|
||||||
return "(devel)"
|
return "(devel)"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Devel() bool {
|
||||||
|
return Version() == "(devel)"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user