liyujie
2025-08-28 d9927380ed7c8366f762049be9f3fee225860833
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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)
}