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