summaryrefslogtreecommitdiffstats
path: root/src/cmd/dist/buildgo.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/dist/buildgo.go')
-rw-r--r--src/cmd/dist/buildgo.go127
1 files changed, 127 insertions, 0 deletions
diff --git a/src/cmd/dist/buildgo.go b/src/cmd/dist/buildgo.go
new file mode 100644
index 0000000..caafc13
--- /dev/null
+++ b/src/cmd/dist/buildgo.go
@@ -0,0 +1,127 @@
+// 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)
+}