package goroot
import (
exec
)
func (, , string) bool {
switch {
case "gc":
:= filepath.Join(, "src", )
, := os.Stat()
return == nil
case "gccgo":
return gccgoSearch.isStandard()
default:
panic("unknown compiler " + )
}
}
type gccgoDirs struct {
once sync.Once
dirs []string
}
var gccgoSearch gccgoDirs
func ( *gccgoDirs) () {
:= os.Getenv("GCCGO")
if == "" {
= "gccgo"
}
, := exec.LookPath()
if != nil {
return
}
, := exec.Command(, "-print-search-dirs").Output()
if != nil {
return
}
, := exec.Command(, "-dumpversion").Output()
if != nil {
return
}
:= strings.TrimSpace(string())
, := exec.Command(, "-dumpmachine").Output()
if != nil {
return
}
:= strings.TrimSpace(string())
:= strings.Split(string(), "\n")
const = "libraries: ="
var []string
for , := range {
if strings.HasPrefix(, ) {
= filepath.SplitList(strings.TrimPrefix(, ))
break
}
}
if len() == 0 {
return
}
var []string
for , := range {
:= filepath.Join(, "go", )
if , := os.Stat(); == nil && .IsDir() {
.dirs = append(.dirs, )
= filepath.Join(, )
if , = os.Stat(); == nil && .IsDir() {
.dirs = append(.dirs, )
}
}
if , := os.Stat(); == nil && .IsDir() {
= append(, )
}
}
.dirs = append(.dirs, ...)
}
func ( *gccgoDirs) ( string) bool {
:= strings.Index(, "/")
if < 0 {
= len()
}
if strings.Contains([:], ".") {
return false
}
if == "unsafe" {
return true
}
.once.Do(.init)
if .dirs == nil {
return true
}
for , := range .dirs {
:= filepath.Join(, ) + ".gox"
if , := os.Stat(); == nil && !.IsDir() {
return true
}
}
return false
}