Skip to content

Commit

Permalink
internal/fakecgo: clean up gen.go (#235)
Browse files Browse the repository at this point in the history
  • Loading branch information
TotallyGamerJet authored Apr 21, 2024
1 parent 042b201 commit de702ef
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 22 deletions.
3 changes: 1 addition & 2 deletions internal/fakecgo/doc.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-FileCopyrightText: 2022 The Ebitengine Authors

//go:build darwin || freebsd
//go:build darwin || freebsd || linux

// Package fakecgo implements the Cgo runtime (runtime/cgo) entirely in Go.
// This allows code that calls into C to function properly when CGO_ENABLED=0.
Expand Down Expand Up @@ -30,4 +30,3 @@
package fakecgo

//go:generate go run gen.go
//go:generate gofmt -s -w symbols.go
68 changes: 48 additions & 20 deletions internal/fakecgo/gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,20 @@ TEXT _{{.Name}}(SB), NOSPLIT|NOFRAME, $0-0
{{ end -}}
`

const templateSymbolsGoos = `// Code generated by 'go generate' with gen.go. DO NOT EDIT.
// SPDX-License-Identifier: Apache-2.0
// SPDX-FileCopyrightText: 2022 The Ebitengine Authors
package fakecgo
{{- range $location := . }}
{{- range .Symbols }}
//go:cgo_import_dynamic purego_{{ .Name }} {{ .Name }} "{{ $location.SharedObject }}"
{{- end }}
{{- end }}
`

type Arg struct {
Name string
Type string
Expand All @@ -111,6 +125,11 @@ type Symbol struct {
Return string
}

type LocatedSymbols struct {
SharedObject string
Symbols []Symbol
}

var (
libcSymbols = []Symbol{
{"malloc", [5]Arg{{"size", "uintptr"}}, "unsafe.Pointer"},
Expand Down Expand Up @@ -176,36 +195,45 @@ func run() error {
if err := t.Execute(f, allSymbols); err != nil {
return err
}
t, err = template.New("symbols_goos.go").Parse(templateSymbolsGoos)
if err != nil {
return err
}
for _, goos := range []string{"darwin", "linux", "freebsd"} {
f, err = os.Create(fmt.Sprintf("symbols_%s.go", goos))
defer f.Close()
if err != nil {
return err
}
f.WriteString(`// Code generated by 'go generate' with gen.go. DO NOT EDIT.
// SPDX-License-Identifier: Apache-2.0
// SPDX-FileCopyrightText: 2022 The Ebitengine Authors
package fakecgo
`)
const importPragma = `//go:cgo_import_dynamic purego_%s %s "%s"` + "\n"
libcSO := "/usr/lib/libSystem.B.dylib"
pthreadSO := "/usr/lib/libSystem.B.dylib"
if goos == "linux" {
libcSO = "libc.so.6"
pthreadSO = "libpthread.so.0"
} else if goos == "freebsd" {
b := &bytes.Buffer{}
var libcSO, pthreadSO string
switch goos {
case "darwin":
libcSO = "/usr/lib/libSystem.B.dylib"
pthreadSO = "/usr/lib/libSystem.B.dylib"
case "freebsd":
libcSO = "libc.so.7"
pthreadSO = "libpthread.so"
case "linux":
libcSO = "libc.so.6"
pthreadSO = "libpthread.so.0"
default:
return fmt.Errorf("unsupported OS: %s", goos)
}

for _, sym := range libcSymbols {
f.WriteString(fmt.Sprintf(importPragma, sym.Name, sym.Name, libcSO))
located := []LocatedSymbols{
{SharedObject: libcSO, Symbols: libcSymbols},
{SharedObject: pthreadSO, Symbols: pthreadSymbols},
}
if err = t.Execute(b, located); err != nil {
return err
}
for _, sym := range pthreadSymbols {
f.WriteString(fmt.Sprintf(importPragma, sym.Name, sym.Name, pthreadSO))
var src []byte
src, err = format.Source(b.Bytes())
if err != nil {
return err
}
if _, err = f.Write(src); err != nil {
return err
}
}
return nil
Expand Down

0 comments on commit de702ef

Please sign in to comment.