internal/fakecgo: clean up gen.go (#235)
- commit
- de702ef019637a84d1b980077f2ba4376ea1f3a4
- author
- TotallyGamerJet · · 2024-04-21 02:54 UTC
- committer
- GitHub · · 2024-04-21 02:54 UTC
- parent
- 042b201
- signature
- GPG Unverified
B5690EEEBB952194The key is unknown
2 files · +49 -22
M internal/fakecgo/doc.go +1 -2
| @@ -1,7 +1,7 @@ | |||
| 1 | 1 | // SPDX-License-Identifier: Apache-2.0 | |
| 2 | 2 | // SPDX-FileCopyrightText: 2022 The Ebitengine Authors | |
| 3 | 3 | ||
| 4 | - | //go:build darwin || freebsd | |
| 4 | + | //go:build darwin || freebsd || linux | |
| 5 | 5 | ||
| 6 | 6 | // Package fakecgo implements the Cgo runtime (runtime/cgo) entirely in Go. | |
| 7 | 7 | // This allows code that calls into C to function properly when CGO_ENABLED=0. | |
| @@ -30,4 +30,3 @@ | |||
| 30 | 30 | package fakecgo | |
| 31 | 31 | ||
| 32 | 32 | //go:generate go run gen.go | |
| 33 | - | //go:generate gofmt -s -w symbols.go | |
| @@ -1,7 +1,7 @@ | |||||
| 1 | // SPDX-License-Identifier: Apache-2.0 | 1 | // SPDX-License-Identifier: Apache-2.0 | ||
| 2 | // SPDX-FileCopyrightText: 2022 The Ebitengine Authors | 2 | // SPDX-FileCopyrightText: 2022 The Ebitengine Authors | ||
| 3 | 3 | ||||
| 4 | - | //go:build darwin || freebsd | 4 | + | //go:build darwin || freebsd || linux |
| 5 | 5 | ||||
| 6 | // Package fakecgo implements the Cgo runtime (runtime/cgo) entirely in Go. | 6 | // Package fakecgo implements the Cgo runtime (runtime/cgo) entirely in Go. | ||
| 7 | // This allows code that calls into C to function properly when CGO_ENABLED=0. | 7 | // This allows code that calls into C to function properly when CGO_ENABLED=0. | ||
| @@ -30,4 +30,3 @@ | |||||
| 30 | package fakecgo | 30 | package fakecgo | ||
| 31 | 31 | ||||
| 32 | //go:generate go run gen.go | 32 | //go:generate go run gen.go | ||
| 33 | - | //go:generate gofmt -s -w symbols.go | |||
M internal/fakecgo/gen.go +48 -20
| @@ -100,6 +100,20 @@ TEXT _{{.Name}}(SB), NOSPLIT|NOFRAME, $0-0 | |||
| 100 | 100 | {{ end -}} | |
| 101 | 101 | ` | |
| 102 | 102 | ||
| 103 | + | const templateSymbolsGoos = `// Code generated by 'go generate' with gen.go. DO NOT EDIT. | |
| 104 | + | ||
| 105 | + | // SPDX-License-Identifier: Apache-2.0 | |
| 106 | + | // SPDX-FileCopyrightText: 2022 The Ebitengine Authors | |
| 107 | + | ||
| 108 | + | package fakecgo | |
| 109 | + | ||
| 110 | + | {{- range $location := . }} | |
| 111 | + | {{- range .Symbols }} | |
| 112 | + | //go:cgo_import_dynamic purego_{{ .Name }} {{ .Name }} "{{ $location.SharedObject }}" | |
| 113 | + | {{- end }} | |
| 114 | + | {{- end }} | |
| 115 | + | ` | |
| 116 | + | ||
| 103 | 117 | type Arg struct { | |
| 104 | 118 | Name string | |
| 105 | 119 | Type string | |
| @@ -111,6 +125,11 @@ type Symbol struct { | |||
| 111 | 125 | Return string | |
| 112 | 126 | } | |
| 113 | 127 | ||
| 128 | + | type LocatedSymbols struct { | |
| 129 | + | SharedObject string | |
| 130 | + | Symbols []Symbol | |
| 131 | + | } | |
| 132 | + | ||
| 114 | 133 | var ( | |
| 115 | 134 | libcSymbols = []Symbol{ | |
| 116 | 135 | {"malloc", [5]Arg{{"size", "uintptr"}}, "unsafe.Pointer"}, | |
| @@ -176,36 +195,45 @@ func run() error { | |||
| 176 | 195 | if err := t.Execute(f, allSymbols); err != nil { | |
| 177 | 196 | return err | |
| 178 | 197 | } | |
| 198 | + | t, err = template.New("symbols_goos.go").Parse(templateSymbolsGoos) | |
| 199 | + | if err != nil { | |
| 200 | + | return err | |
| 201 | + | } | |
| 179 | 202 | for _, goos := range []string{"darwin", "linux", "freebsd"} { | |
| 180 | 203 | f, err = os.Create(fmt.Sprintf("symbols_%s.go", goos)) | |
| 181 | 204 | defer f.Close() | |
| 182 | 205 | if err != nil { | |
| 183 | 206 | return err | |
| 184 | 207 | } | |
| 185 | - | f.WriteString(`// Code generated by 'go generate' with gen.go. DO NOT EDIT. | |
| 186 | - | ||
| 187 | - | // SPDX-License-Identifier: Apache-2.0 | |
| 188 | - | // SPDX-FileCopyrightText: 2022 The Ebitengine Authors | |
| 189 | - | ||
| 190 | - | package fakecgo | |
| 191 | - | ||
| 192 | - | `) | |
| 193 | - | const importPragma = `//go:cgo_import_dynamic purego_%s %s "%s"` + "\n" | |
| 194 | - | libcSO := "/usr/lib/libSystem.B.dylib" | |
| 195 | - | pthreadSO := "/usr/lib/libSystem.B.dylib" | |
| 196 | - | if goos == "linux" { | |
| 197 | - | libcSO = "libc.so.6" | |
| 198 | - | pthreadSO = "libpthread.so.0" | |
| 199 | - | } else if goos == "freebsd" { | |
| 208 | + | b := &bytes.Buffer{} | |
| 209 | + | var libcSO, pthreadSO string | |
| 210 | + | switch goos { | |
| 211 | + | case "darwin": | |
| 212 | + | libcSO = "/usr/lib/libSystem.B.dylib" | |
| 213 | + | pthreadSO = "/usr/lib/libSystem.B.dylib" | |
| 214 | + | case "freebsd": | |
| 200 | 215 | libcSO = "libc.so.7" | |
| 201 | 216 | pthreadSO = "libpthread.so" | |
| 217 | + | case "linux": | |
| 218 | + | libcSO = "libc.so.6" | |
| 219 | + | pthreadSO = "libpthread.so.0" | |
| 220 | + | default: | |
| 221 | + | return fmt.Errorf("unsupported OS: %s", goos) | |
| 202 | 222 | } | |
| 203 | - | ||
| 204 | - | for _, sym := range libcSymbols { | |
| 205 | - | f.WriteString(fmt.Sprintf(importPragma, sym.Name, sym.Name, libcSO)) | |
| 223 | + | located := []LocatedSymbols{ | |
| 224 | + | {SharedObject: libcSO, Symbols: libcSymbols}, | |
| 225 | + | {SharedObject: pthreadSO, Symbols: pthreadSymbols}, | |
| 226 | + | } | |
| 227 | + | if err = t.Execute(b, located); err != nil { | |
| 228 | + | return err | |
| 206 | 229 | } | |
| 207 | - | for _, sym := range pthreadSymbols { | |
| 208 | - | f.WriteString(fmt.Sprintf(importPragma, sym.Name, sym.Name, pthreadSO)) | |
| 230 | + | var src []byte | |
| 231 | + | src, err = format.Source(b.Bytes()) | |
| 232 | + | if err != nil { | |
| 233 | + | return err | |
| 234 | + | } | |
| 235 | + | if _, err = f.Write(src); err != nil { | |
| 236 | + | return err | |
| 209 | 237 | } | |
| 210 | 238 | } | |
| 211 | 239 | return nil | |
| @@ -100,6 +100,20 @@ TEXT _{{.Name}}(SB), NOSPLIT|NOFRAME, $0-0 | |||||
| 100 | {{ end -}} | 100 | {{ end -}} | ||
| 101 | ` | 101 | ` | ||
| 102 | 102 | ||||
| 103 | + | const templateSymbolsGoos = `// Code generated by 'go generate' with gen.go. DO NOT EDIT. | |||
| 104 | + | ||||
| 105 | + | // SPDX-License-Identifier: Apache-2.0 | |||
| 106 | + | // SPDX-FileCopyrightText: 2022 The Ebitengine Authors | |||
| 107 | + | ||||
| 108 | + | package fakecgo | |||
| 109 | + | ||||
| 110 | + | {{- range $location := . }} | |||
| 111 | + | {{- range .Symbols }} | |||
| 112 | + | //go:cgo_import_dynamic purego_{{ .Name }} {{ .Name }} "{{ $location.SharedObject }}" | |||
| 113 | + | {{- end }} | |||
| 114 | + | {{- end }} | |||
| 115 | + | ` | |||
| 116 | + | ||||
| 103 | type Arg struct { | 117 | type Arg struct { | ||
| 104 | Name string | 118 | Name string | ||
| 105 | Type string | 119 | Type string | ||
| @@ -111,6 +125,11 @@ type Symbol struct { | |||||
| 111 | Return string | 125 | Return string | ||
| 112 | } | 126 | } | ||
| 113 | 127 | ||||
| 128 | + | type LocatedSymbols struct { | |||
| 129 | + | SharedObject string | |||
| 130 | + | Symbols []Symbol | |||
| 131 | + | } | |||
| 132 | + | ||||
| 114 | var ( | 133 | var ( | ||
| 115 | libcSymbols = []Symbol{ | 134 | libcSymbols = []Symbol{ | ||
| 116 | {"malloc", [5]Arg{{"size", "uintptr"}}, "unsafe.Pointer"}, | 135 | {"malloc", [5]Arg{{"size", "uintptr"}}, "unsafe.Pointer"}, | ||
| @@ -176,36 +195,45 @@ func run() error { | |||||
| 176 | if err := t.Execute(f, allSymbols); err != nil { | 195 | if err := t.Execute(f, allSymbols); err != nil { | ||
| 177 | return err | 196 | return err | ||
| 178 | } | 197 | } | ||
| 198 | + | t, err = template.New("symbols_goos.go").Parse(templateSymbolsGoos) | |||
| 199 | + | if err != nil { | |||
| 200 | + | return err | |||
| 201 | + | } | |||
| 179 | for _, goos := range []string{"darwin", "linux", "freebsd"} { | 202 | for _, goos := range []string{"darwin", "linux", "freebsd"} { | ||
| 180 | f, err = os.Create(fmt.Sprintf("symbols_%s.go", goos)) | 203 | f, err = os.Create(fmt.Sprintf("symbols_%s.go", goos)) | ||
| 181 | defer f.Close() | 204 | defer f.Close() | ||
| 182 | if err != nil { | 205 | if err != nil { | ||
| 183 | return err | 206 | return err | ||
| 184 | } | 207 | } | ||
| 185 | - | f.WriteString(`// Code generated by 'go generate' with gen.go. DO NOT EDIT. | 208 | + | b := &bytes.Buffer{} |
| 186 | - | 209 | + | var libcSO, pthreadSO string | |
| 187 | - | // SPDX-License-Identifier: Apache-2.0 | 210 | + | switch goos { |
| 188 | - | // SPDX-FileCopyrightText: 2022 The Ebitengine Authors | 211 | + | case "darwin": |
| 189 | - | 212 | + | libcSO = "/usr/lib/libSystem.B.dylib" | |
| 190 | - | package fakecgo | 213 | + | pthreadSO = "/usr/lib/libSystem.B.dylib" |
| 191 | - | 214 | + | case "freebsd": | |
| 192 | - | `) | |||
| 193 | - | const importPragma = `//go:cgo_import_dynamic purego_%s %s "%s"` + "\n" | |||
| 194 | - | libcSO := "/usr/lib/libSystem.B.dylib" | |||
| 195 | - | pthreadSO := "/usr/lib/libSystem.B.dylib" | |||
| 196 | - | if goos == "linux" { | |||
| 197 | - | libcSO = "libc.so.6" | |||
| 198 | - | pthreadSO = "libpthread.so.0" | |||
| 199 | - | } else if goos == "freebsd" { | |||
| 200 | libcSO = "libc.so.7" | 215 | libcSO = "libc.so.7" | ||
| 201 | pthreadSO = "libpthread.so" | 216 | pthreadSO = "libpthread.so" | ||
| 217 | + | case "linux": | |||
| 218 | + | libcSO = "libc.so.6" | |||
| 219 | + | pthreadSO = "libpthread.so.0" | |||
| 220 | + | default: | |||
| 221 | + | return fmt.Errorf("unsupported OS: %s", goos) | |||
| 202 | } | 222 | } | ||
| 203 | - | 223 | + | located := []LocatedSymbols{ | |
| 204 | - | for _, sym := range libcSymbols { | 224 | + | {SharedObject: libcSO, Symbols: libcSymbols}, |
| 205 | - | f.WriteString(fmt.Sprintf(importPragma, sym.Name, sym.Name, libcSO)) | 225 | + | {SharedObject: pthreadSO, Symbols: pthreadSymbols}, |
| 226 | + | } | |||
| 227 | + | if err = t.Execute(b, located); err != nil { | |||
| 228 | + | return err | |||
| 206 | } | 229 | } | ||
| 207 | - | for _, sym := range pthreadSymbols { | 230 | + | var src []byte |
| 208 | - | f.WriteString(fmt.Sprintf(importPragma, sym.Name, sym.Name, pthreadSO)) | 231 | + | src, err = format.Source(b.Bytes()) |
| 232 | + | if err != nil { | |||
| 233 | + | return err | |||
| 234 | + | } | |||
| 235 | + | if _, err = f.Write(src); err != nil { | |||
| 236 | + | return err | |||
| 209 | } | 237 | } | ||
| 210 | } | 238 | } | ||
| 211 | return nil | 239 | return nil | ||