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