|  | // Copyright 2012 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | package main | 
|  |  | 
|  | import ( | 
|  | "bytes" | 
|  | "fmt" | 
|  | "os" | 
|  | "path/filepath" | 
|  | "sort" | 
|  | "strings" | 
|  | ) | 
|  |  | 
|  | /* | 
|  | * Helpers for building cmd/go and cmd/cgo. | 
|  | */ | 
|  |  | 
|  | // mkzdefaultcc writes zdefaultcc.go: | 
|  | // | 
|  | //	package main | 
|  | //	const defaultCC = <defaultcc> | 
|  | //	const defaultCXX = <defaultcxx> | 
|  | //	const defaultPkgConfig = <defaultpkgconfig> | 
|  | // | 
|  | // It is invoked to write cmd/go/internal/cfg/zdefaultcc.go | 
|  | // but we also write cmd/cgo/zdefaultcc.go | 
|  | func mkzdefaultcc(dir, file string) { | 
|  | if strings.Contains(file, filepath.FromSlash("go/internal/cfg")) { | 
|  | var buf bytes.Buffer | 
|  | fmt.Fprintf(&buf, "// Code generated by go tool dist; DO NOT EDIT.\n") | 
|  | fmt.Fprintln(&buf) | 
|  | fmt.Fprintf(&buf, "package cfg\n") | 
|  | fmt.Fprintln(&buf) | 
|  | fmt.Fprintf(&buf, "const DefaultPkgConfig = `%s`\n", defaultpkgconfig) | 
|  | buf.WriteString(defaultCCFunc("DefaultCC", defaultcc)) | 
|  | buf.WriteString(defaultCCFunc("DefaultCXX", defaultcxx)) | 
|  | writefile(buf.String(), file, writeSkipSame) | 
|  | return | 
|  | } | 
|  |  | 
|  | var buf bytes.Buffer | 
|  | fmt.Fprintf(&buf, "// Code generated by go tool dist; DO NOT EDIT.\n") | 
|  | fmt.Fprintln(&buf) | 
|  | fmt.Fprintf(&buf, "package main\n") | 
|  | fmt.Fprintln(&buf) | 
|  | fmt.Fprintf(&buf, "const defaultPkgConfig = `%s`\n", defaultpkgconfig) | 
|  | buf.WriteString(defaultCCFunc("defaultCC", defaultcc)) | 
|  | buf.WriteString(defaultCCFunc("defaultCXX", defaultcxx)) | 
|  | writefile(buf.String(), file, writeSkipSame) | 
|  | } | 
|  |  | 
|  | func defaultCCFunc(name string, defaultcc map[string]string) string { | 
|  | var buf bytes.Buffer | 
|  |  | 
|  | fmt.Fprintf(&buf, "func %s(goos, goarch string) string {\n", name) | 
|  | fmt.Fprintf(&buf, "\tswitch goos+`/`+goarch {\n") | 
|  | var keys []string | 
|  | for k := range defaultcc { | 
|  | if k != "" { | 
|  | keys = append(keys, k) | 
|  | } | 
|  | } | 
|  | sort.Strings(keys) | 
|  | for _, k := range keys { | 
|  | fmt.Fprintf(&buf, "\tcase %q:\n\t\treturn %q\n", k, defaultcc[k]) | 
|  | } | 
|  | fmt.Fprintf(&buf, "\t}\n") | 
|  | fmt.Fprintf(&buf, "\treturn %q\n", defaultcc[""]) | 
|  | fmt.Fprintf(&buf, "}\n") | 
|  |  | 
|  | return buf.String() | 
|  | } | 
|  |  | 
|  | // mkzcgo writes zosarch.go for cmd/go. | 
|  | func mkzosarch(dir, file string) { | 
|  | // sort for deterministic zosarch.go file | 
|  | var list []string | 
|  | for plat := range cgoEnabled { | 
|  | list = append(list, plat) | 
|  | } | 
|  | sort.Strings(list) | 
|  |  | 
|  | var buf bytes.Buffer | 
|  | fmt.Fprintf(&buf, "// Code generated by go tool dist; DO NOT EDIT.\n\n") | 
|  | fmt.Fprintf(&buf, "package cfg\n\n") | 
|  | fmt.Fprintf(&buf, "var OSArchSupportsCgo = map[string]bool{\n") | 
|  | for _, plat := range list { | 
|  | fmt.Fprintf(&buf, "\t%q: %v,\n", plat, cgoEnabled[plat]) | 
|  | } | 
|  | fmt.Fprintf(&buf, "}\n") | 
|  |  | 
|  | writefile(buf.String(), file, writeSkipSame) | 
|  | } | 
|  |  | 
|  | // mkzcgo writes zcgo.go for the go/build package: | 
|  | // | 
|  | //	package build | 
|  | //  var cgoEnabled = map[string]bool{} | 
|  | // | 
|  | // It is invoked to write go/build/zcgo.go. | 
|  | func mkzcgo(dir, file string) { | 
|  | // sort for deterministic zcgo.go file | 
|  | var list []string | 
|  | for plat, hasCgo := range cgoEnabled { | 
|  | if hasCgo { | 
|  | list = append(list, plat) | 
|  | } | 
|  | } | 
|  | sort.Strings(list) | 
|  |  | 
|  | var buf bytes.Buffer | 
|  | fmt.Fprintf(&buf, "// Code generated by go tool dist; DO NOT EDIT.\n") | 
|  | fmt.Fprintln(&buf) | 
|  | fmt.Fprintf(&buf, "package build\n") | 
|  | fmt.Fprintln(&buf) | 
|  | fmt.Fprintf(&buf, "const defaultCGO_ENABLED = %q\n", os.Getenv("CGO_ENABLED")) | 
|  | fmt.Fprintln(&buf) | 
|  | fmt.Fprintf(&buf, "var cgoEnabled = map[string]bool{\n") | 
|  | for _, plat := range list { | 
|  | fmt.Fprintf(&buf, "\t%q: true,\n", plat) | 
|  | } | 
|  | fmt.Fprintf(&buf, "}\n") | 
|  |  | 
|  | writefile(buf.String(), file, writeSkipSame) | 
|  | } |