subsonic-tui/vendor/github.com/ebitengine/purego
Sagi Dayan 26e526f07e
initial commit
Signed-off-by: Sagi Dayan <sagidayan@gmail.com>
2024-02-20 19:10:14 +02:00
..
internal initial commit 2024-02-20 19:10:14 +02:00
objc initial commit 2024-02-20 19:10:14 +02:00
.gitignore initial commit 2024-02-20 19:10:14 +02:00
abi_amd64.h initial commit 2024-02-20 19:10:14 +02:00
abi_arm64.h initial commit 2024-02-20 19:10:14 +02:00
cgo.go initial commit 2024-02-20 19:10:14 +02:00
dlerror.go initial commit 2024-02-20 19:10:14 +02:00
dlfcn.go initial commit 2024-02-20 19:10:14 +02:00
dlfcn_darwin.go initial commit 2024-02-20 19:10:14 +02:00
dlfcn_freebsd.go initial commit 2024-02-20 19:10:14 +02:00
dlfcn_linux.go initial commit 2024-02-20 19:10:14 +02:00
dlfcn_nocgo_linux.go initial commit 2024-02-20 19:10:14 +02:00
dlfcn_stubs.s initial commit 2024-02-20 19:10:14 +02:00
func.go initial commit 2024-02-20 19:10:14 +02:00
go_runtime.go initial commit 2024-02-20 19:10:14 +02:00
is_ios.go initial commit 2024-02-20 19:10:14 +02:00
LICENSE initial commit 2024-02-20 19:10:14 +02:00
nocgo.go initial commit 2024-02-20 19:10:14 +02:00
README.md initial commit 2024-02-20 19:10:14 +02:00
sys_amd64.s initial commit 2024-02-20 19:10:14 +02:00
sys_arm64.s initial commit 2024-02-20 19:10:14 +02:00
sys_unix_arm64.s initial commit 2024-02-20 19:10:14 +02:00
syscall.go initial commit 2024-02-20 19:10:14 +02:00
syscall_cgo_linux.go initial commit 2024-02-20 19:10:14 +02:00
syscall_sysv.go initial commit 2024-02-20 19:10:14 +02:00
syscall_windows.go initial commit 2024-02-20 19:10:14 +02:00
zcallback_amd64.s initial commit 2024-02-20 19:10:14 +02:00
zcallback_arm64.s initial commit 2024-02-20 19:10:14 +02:00

purego

Go Reference

A library for calling C functions from Go without Cgo.

Motivation

The Ebitengine game engine was ported to use only Go on Windows. This enabled cross-compiling to Windows from any other operating system simply by setting GOOS=windows. The purego project was born to bring that same vision to the other platforms supported by Ebitengine.

Benefits

  • Simple Cross-Compilation: No C means you can build for other platforms easily without a C compiler.
  • Faster Compilation: Efficiently cache your entirely Go builds.
  • Smaller Binaries: Using Cgo generates a C wrapper function for each C function called. Purego doesn't!
  • Dynamic Linking: Load symbols at runtime and use it as a plugin system.
  • Foreign Function Interface: Call into other languages that are compiled into shared objects.

Example

This example only works on macOS and Linux. For a complete example look at libc which supports Windows and FreeBSD.

package main

import (
	"fmt"
	"runtime"

	"github.com/ebitengine/purego"
)

func getSystemLibrary() string {
	switch runtime.GOOS {
	case "darwin":
		return "/usr/lib/libSystem.B.dylib"
	case "linux":
		return "libc.so.6"
	default:
		panic(fmt.Errorf("GOOS=%s is not supported", runtime.GOOS))
	}
}

func main() {
	libc, err := purego.Dlopen(getSystemLibrary(), purego.RTLD_NOW|purego.RTLD_GLOBAL)
	if err != nil {
		panic(err)
	}
	var puts func(string)
	purego.RegisterLibFunc(&puts, libc, "puts")
	puts("Calling C from Go without Cgo!")
}

Then to run: CGO_ENABLED=0 go run main.go

External Code

Purego uses code that originates from the Go runtime. These files are under the BSD-3 License that can be found in the Go Source. This is a list of the copied files:

  • abi_*.h from package runtime/cgo
  • zcallback_darwin_*.s from package runtime
  • internal/fakecgo/abi_*.h from package runtime/cgo
  • internal/fakecgo/asm_GOARCH.s from package runtime/cgo
  • internal/fakecgo/callbacks.go from package runtime/cgo
  • internal/fakecgo/go_GOOS_GOARCH.go from package runtime/cgo
  • internal/fakecgo/iscgo.go from package runtime/cgo
  • internal/fakecgo/setenv.go from package runtime/cgo
  • internal/fakecgo/freebsd.go from package runtime/cgo

The files abi_*.h and internal/fakecgo/abi_*.h are the same because Bazel does not support cross-package use of #include so we need each one once per package. (cf. issue)