|  | // This tool generates //build/analysis/lib:stdlib_packages.go, which contains a | 
|  | // set of all Go stdlib packges. This is generated ahead of time in the build | 
|  | // system as it can be an expensive operation that also depends on the presence | 
|  | // of a working `go` tool environment, so we want to do this as rarely as | 
|  | // possible. | 
|  | package main | 
|  |  | 
|  | import ( | 
|  | "fmt" | 
|  | "os" | 
|  | "path/filepath" | 
|  | "sort" | 
|  | "strings" | 
|  |  | 
|  | "golang.org/x/tools/go/packages" | 
|  |  | 
|  | "source.monogon.dev/build/toolbase/gotoolchain" | 
|  | ) | 
|  |  | 
|  | func main() { | 
|  | os.Setenv("PATH", filepath.Dir(gotoolchain.Go)) | 
|  |  | 
|  | gocache, err := os.MkdirTemp("/tmp", "gocache") | 
|  | if err != nil { | 
|  | panic(err) | 
|  | } | 
|  | defer os.RemoveAll(gocache) | 
|  |  | 
|  | gopath, err := os.MkdirTemp("/tmp", "gopath") | 
|  | if err != nil { | 
|  | panic(err) | 
|  | } | 
|  | defer os.RemoveAll(gopath) | 
|  |  | 
|  | os.Setenv("GOCACHE", gocache) | 
|  | os.Setenv("GOPATH", gopath) | 
|  |  | 
|  | pkgs, err := packages.Load(nil, "std") | 
|  | if err != nil { | 
|  | panic(err) | 
|  | } | 
|  | sort.Slice(pkgs, func(i, j int) bool { return pkgs[i].PkgPath < pkgs[j].PkgPath }) | 
|  |  | 
|  | if len(os.Args) != 2 { | 
|  | panic("must be called with output file name") | 
|  | } | 
|  |  | 
|  | out, err := os.Create(os.Args[1]) | 
|  | if err != nil { | 
|  | panic(err) | 
|  | } | 
|  | defer out.Close() | 
|  |  | 
|  | fmt.Fprintf(out, "// Code generated by //build/analysis/lib/genstd. DO NOT EDIT.\n") | 
|  | fmt.Fprintf(out, "package lib\n\n") | 
|  | fmt.Fprintf(out, "// StdlibPackages is a set of all package paths that are part of the Go standard\n") | 
|  | fmt.Fprintf(out, "// library.\n") | 
|  | fmt.Fprintf(out, "var StdlibPackages = map[string]bool{\n") | 
|  | for _, pkg := range pkgs { | 
|  | path := pkg.PkgPath | 
|  | if strings.Contains(path, "/internal/") { | 
|  | continue | 
|  | } | 
|  | if strings.HasPrefix(path, "vendor/") { | 
|  | continue | 
|  | } | 
|  | fmt.Fprintf(out, "\t%q: true,\n", pkg.PkgPath) | 
|  | } | 
|  | fmt.Fprintf(out, "}\n") | 
|  | } |