diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go index 1c63c6ebc7b182fdd11b453993f12986b6bf278c..343f0ce332f82b4db2deb90f19b6a33b44f5e2b2 100644 --- a/src/cmd/dist/build.go +++ b/src/cmd/dist/build.go @@ -313,6 +313,9 @@ var clangos = []string{ // compilerEnvLookup returns the compiler settings for goos/goarch in map m. // kind is "CC" or "CXX". func compilerEnvLookup(kind string, m map[string]string, goos, goarch string) string { + if !needCC() { + return "" + } if cc := m[goos+"/"+goarch]; cc != "" { return cc } @@ -1568,7 +1571,7 @@ func cmdbootstrap() { } // Remove go_bootstrap now that we're done. - xremove(pathf("%s/go_bootstrap", tooldir)) + xremove(pathf("%s/go_bootstrap"+exe, tooldir)) if goos == "android" { // Make sure the exec wrapper will sync a fresh $GOROOT to the device. @@ -1740,13 +1743,7 @@ var firstClass = map[string]bool{ } func needCC() bool { - switch os.Getenv("CGO_ENABLED") { - case "1": - return true - case "0": - return false - } - return cgoEnabled[gohostos+"/"+gohostarch] + return os.Getenv("CGO_ENABLED") == "1" } func checkCC() { diff --git a/src/cmd/dist/buildgo.go b/src/cmd/dist/buildgo.go index 7f1bc0105e061a2bd7b8749b3ef9e62c4bddb913..d6a3b8121435e2695769af3252d7edd76720bf79 100644 --- a/src/cmd/dist/buildgo.go +++ b/src/cmd/dist/buildgo.go @@ -63,11 +63,11 @@ func defaultCCFunc(name string, defaultcc map[string]string) string { } sort.Strings(keys) for _, k := range keys { - fmt.Fprintf(&buf, "\tcase %q:\n\t\treturn %q\n", k, defaultcc[k]) + fmt.Fprintf(&buf, "\tcase %s:\n\t\treturn %s\n", quote(k), quote(defaultcc[k])) } fmt.Fprintf(&buf, "\t}\n") if cc := defaultcc[""]; cc != "" { - fmt.Fprintf(&buf, "\treturn %q\n", cc) + fmt.Fprintf(&buf, "\treturn %s\n", quote(cc)) } else { clang, gcc := "clang", "gcc" if strings.HasSuffix(name, "CXX") { @@ -79,12 +79,12 @@ func defaultCCFunc(name string, defaultcc map[string]string) string { if i > 0 { fmt.Fprintf(&buf, ", ") } - fmt.Fprintf(&buf, "%q", os) + fmt.Fprintf(&buf, "%s", quote(os)) } fmt.Fprintf(&buf, ":\n") - fmt.Fprintf(&buf, "\t\treturn %q\n", clang) + fmt.Fprintf(&buf, "\t\treturn %s\n", quote(clang)) fmt.Fprintf(&buf, "\t}\n") - fmt.Fprintf(&buf, "\treturn %q\n", gcc) + fmt.Fprintf(&buf, "\treturn %s\n", quote(gcc)) } fmt.Fprintf(&buf, "}\n") @@ -105,7 +105,7 @@ func mkzosarch(dir, file string) { 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, "\t%s: %v,\n", quote(plat), cgoEnabled[plat]) } fmt.Fprintf(&buf, "}\n") @@ -133,11 +133,11 @@ func mkzcgo(dir, file string) { 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.Fprintf(&buf, "const defaultCGO_ENABLED = %s\n", quote(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, "\t%s: true,\n", quote(plat)) } fmt.Fprintf(&buf, "}\n") @@ -156,7 +156,28 @@ func mktzdata(dir, file string) { fmt.Fprintln(&buf) fmt.Fprintf(&buf, "package tzdata\n") fmt.Fprintln(&buf) - fmt.Fprintf(&buf, "const zipdata = %q\n", zip) + fmt.Fprintf(&buf, "const zipdata = %s\n", quote(zip)) writefile(buf.String(), file, writeSkipSame) } + +// quote is like strconv.Quote but simpler and has output +// that does not depend on the exact Go bootstrap version. +func quote(s string) string { + const hex = "0123456789abcdef" + var out strings.Builder + out.WriteByte('"') + for i := 0; i < len(s); i++ { + c := s[i] + if 0x20 <= c && c <= 0x7E && c != '"' && c != '\\' { + out.WriteByte(c) + } else { + out.WriteByte('\\') + out.WriteByte('x') + out.WriteByte(hex[c>>4]) + out.WriteByte(hex[c&0xf]) + } + } + out.WriteByte('"') + return out.String() +}