| // 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") | 
 | } |