mirror of https://github.com/golang/go.git
163 lines
4.3 KiB
Go
163 lines
4.3 KiB
Go
// 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 (
|
|
"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 strings.Builder
|
|
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 strings.Builder
|
|
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 strings.Builder
|
|
|
|
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")
|
|
if cc := defaultcc[""]; cc != "" {
|
|
fmt.Fprintf(&buf, "\treturn %q\n", cc)
|
|
} else {
|
|
clang, gcc := "clang", "gcc"
|
|
if strings.HasSuffix(name, "CXX") {
|
|
clang, gcc = "clang++", "g++"
|
|
}
|
|
fmt.Fprintf(&buf, "\tswitch goos {\n")
|
|
fmt.Fprintf(&buf, "\tcase ")
|
|
for i, os := range clangos {
|
|
if i > 0 {
|
|
fmt.Fprintf(&buf, ", ")
|
|
}
|
|
fmt.Fprintf(&buf, "%q", os)
|
|
}
|
|
fmt.Fprintf(&buf, ":\n")
|
|
fmt.Fprintf(&buf, "\t\treturn %q\n", clang)
|
|
fmt.Fprintf(&buf, "\t}\n")
|
|
fmt.Fprintf(&buf, "\treturn %q\n", gcc)
|
|
}
|
|
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 strings.Builder
|
|
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 strings.Builder
|
|
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)
|
|
}
|
|
|
|
// mktzdata src/time/tzdata/zzipdata.go:
|
|
//
|
|
// package tzdata
|
|
// const zipdata = "PK..."
|
|
func mktzdata(dir, file string) {
|
|
zip := readfile(filepath.Join(dir, "../../../lib/time/zoneinfo.zip"))
|
|
|
|
var buf strings.Builder
|
|
fmt.Fprintf(&buf, "// Code generated by go tool dist; DO NOT EDIT.\n")
|
|
fmt.Fprintln(&buf)
|
|
fmt.Fprintf(&buf, "package tzdata\n")
|
|
fmt.Fprintln(&buf)
|
|
fmt.Fprintf(&buf, "const zipdata = %q\n", zip)
|
|
|
|
writefile(buf.String(), file, writeSkipSame)
|
|
}
|