func (gd *gccgoDirs ) init () {
gccgo := os .Getenv ("GCCGO" )
if gccgo == "" {
gccgo = "gccgo"
}
bin , err := exec .LookPath (gccgo )
if err != nil {
return
}
allDirs , err := exec .Command (bin , "-print-search-dirs" ).Output ()
if err != nil {
return
}
versionB , err := exec .Command (bin , "-dumpversion" ).Output ()
if err != nil {
return
}
version := strings .TrimSpace (string (versionB ))
machineB , err := exec .Command (bin , "-dumpmachine" ).Output ()
if err != nil {
return
}
machine := strings .TrimSpace (string (machineB ))
dirsEntries := strings .Split (string (allDirs ), "\n" )
const prefix = "libraries: ="
var dirs []string
for _ , dirEntry := range dirsEntries {
if strings .HasPrefix (dirEntry , prefix ) {
dirs = filepath .SplitList (strings .TrimPrefix (dirEntry , prefix ))
break
}
}
if len (dirs ) == 0 {
return
}
var lastDirs []string
for _ , dir := range dirs {
goDir := filepath .Join (dir , "go" , version )
if fi , err := os .Stat (goDir ); err == nil && fi .IsDir () {
gd .dirs = append (gd .dirs , goDir )
goDir = filepath .Join (goDir , machine )
if fi , err = os .Stat (goDir ); err == nil && fi .IsDir () {
gd .dirs = append (gd .dirs , goDir )
}
}
if fi , err := os .Stat (dir ); err == nil && fi .IsDir () {
lastDirs = append (lastDirs , dir )
}
}
gd .dirs = append (gd .dirs , lastDirs ...)
}