gengoarch.mx raw
1 // Copyright 2014 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
5 //go:build ignore
6
7 package main
8
9 import (
10 "bytes"
11 "fmt"
12 "log"
13 "os"
14 )
15
16 var goarches [][]byte
17
18 func main() {
19 data, err := os.ReadFile("../../internal/syslist/syslist.go")
20 if err != nil {
21 log.Fatal(err)
22 }
23 const goarchPrefix = `var KnownArch = map[string]bool{`
24 inGOARCH := false
25 for _, line := range bytes.Split([]byte(data), "\n") {
26 if bytes.HasPrefix(line, goarchPrefix) {
27 inGOARCH = true
28 } else if inGOARCH && bytes.HasPrefix(line, "}") {
29 break
30 } else if inGOARCH {
31 goarch := bytes.Fields(line)[0]
32 goarch = bytes.TrimPrefix(goarch, `"`)
33 goarch = bytes.TrimSuffix(goarch, `":`)
34 goarches = append(goarches, goarch)
35 }
36 }
37
38 for _, target := range goarches {
39 if target == "amd64p32" {
40 continue
41 }
42 var buf bytes.Buffer
43 fmt.Fprintf(&buf, "// Code generated by gengoarch.go using 'go generate'. DO NOT EDIT.\n\n")
44 fmt.Fprintf(&buf, "//go:build %s\n\n", target) // must explicitly include target for bootstrapping purposes
45 fmt.Fprintf(&buf, "package goarch\n\n")
46 fmt.Fprintf(&buf, "const GOARCH = `%s`\n\n", target)
47 for _, goarch := range goarches {
48 value := 0
49 if goarch == target {
50 value = 1
51 }
52 fmt.Fprintf(&buf, "const Is%s = %d\n", bytes.Title(goarch), value)
53 }
54 err := os.WriteFile("zgoarch_"+target+".go", buf.Bytes(), 0666)
55 if err != nil {
56 log.Fatal(err)
57 }
58 }
59 }
60