1// Copyright 2012 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package main
6
7import (
8	"bytes"
9	"fmt"
10	"os"
11	"sort"
12)
13
14/*
15 * Helpers for building cmd/go and cmd/cgo.
16 */
17
18// mkzdefaultcc writes zdefaultcc.go:
19//
20//	package main
21//	const defaultCC = <defaultcc>
22//	const defaultCXX = <defaultcxx>
23//	const defaultPkgConfig = <defaultpkgconfig>
24//
25// It is invoked to write cmd/go/zdefaultcc.go
26// but we also write cmd/cgo/zdefaultcc.go
27func mkzdefaultcc(dir, file string) {
28	outGo := fmt.Sprintf(
29		"// auto generated by go tool dist\n"+
30			"\n"+
31			"package cfg\n"+
32			"\n"+
33			"const DefaultCC = `%s`\n"+
34			"const DefaultCXX = `%s`\n"+
35			"const DefaultPkgConfig = `%s`\n",
36		defaultcctarget, defaultcxxtarget, defaultpkgconfigtarget)
37
38	writefile(outGo, file, writeSkipSame)
39
40	// Convert file name to replace: turn go/internal/cfg into cgo.
41	outCgo := fmt.Sprintf(
42		"// auto generated by go tool dist\n"+
43			"\n"+
44			"package main\n"+
45			"\n"+
46			"const defaultCC = `%s`\n"+
47			"const defaultCXX = `%s`\n"+
48			"const defaultPkgConfig = `%s`\n",
49		defaultcctarget, defaultcxxtarget, defaultpkgconfigtarget)
50
51	i := len(file) - len("go/internal/cfg/zdefaultcc.go")
52	file = file[:i] + "cgo/zdefaultcc.go"
53	writefile(outCgo, file, writeSkipSame)
54}
55
56// mkzcgo writes zosarch.go for cmd/go.
57func mkzosarch(dir, file string) {
58	// sort for deterministic zosarch.go file
59	var list []string
60	for plat := range cgoEnabled {
61		list = append(list, plat)
62	}
63	sort.Strings(list)
64
65	var buf bytes.Buffer
66	buf.WriteString("// auto generated by go tool dist\n\n")
67	buf.WriteString("package cfg\n\n")
68	fmt.Fprintf(&buf, "var OSArchSupportsCgo = map[string]bool{\n")
69	for _, plat := range list {
70		fmt.Fprintf(&buf, "\t%q: %v,\n", plat, cgoEnabled[plat])
71	}
72	fmt.Fprintf(&buf, "}\n")
73	writefile(buf.String(), file, writeSkipSame)
74}
75
76// mkzcgo writes zcgo.go for the go/build package:
77//
78//	package build
79//  var cgoEnabled = map[string]bool{}
80//
81// It is invoked to write go/build/zcgo.go.
82func mkzcgo(dir, file string) {
83	// sort for deterministic zcgo.go file
84	var list []string
85	for plat, hasCgo := range cgoEnabled {
86		if hasCgo {
87			list = append(list, plat)
88		}
89	}
90	sort.Strings(list)
91
92	var buf bytes.Buffer
93
94	fmt.Fprintf(&buf,
95		"// auto generated by go tool dist\n"+
96			"\n"+
97			"package build\n"+
98			"\n"+
99			"const defaultCGO_ENABLED = %q\n\n"+
100			"var cgoEnabled = map[string]bool{\n", os.Getenv("CGO_ENABLED"))
101	for _, plat := range list {
102		fmt.Fprintf(&buf, "\t%q: true,\n", plat)
103	}
104	fmt.Fprintf(&buf, "}")
105
106	writefile(buf.String(), file, writeSkipSame)
107}
108