github.com/jwijenbergh/purego@v0.0.0-20240126093400-70ff3a61df13/nocgo.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // SPDX-FileCopyrightText: 2022 The Ebitengine Authors
     3  
     4  //go:build !cgo && (darwin || freebsd || linux)
     5  
     6  package purego
     7  
     8  // if CGO_ENABLED=0 import fakecgo to setup the Cgo runtime correctly.
     9  // This is required since some frameworks need TLS setup the C way which Go doesn't do.
    10  // We currently don't support ios in fakecgo mode so force Cgo or fail
    11  //
    12  // The way that the Cgo runtime (runtime/cgo) works is by setting some variables found
    13  // in runtime with non-null GCC compiled functions. The variables that are replaced are
    14  // var (
    15  //		iscgo             bool 							// in runtime/cgo.go
    16  //		_cgo_init         unsafe.Pointer 				// in runtime/cgo.go
    17  //		_cgo_thread_start unsafe.Pointer				// in runtime/cgo.go
    18  //		_cgo_notify_runtime_init_done unsafe.Pointer 	// in runtime/cgo.go
    19  //		_cgo_setenv unsafe.Pointer  					// in runtime/env_posix.go
    20  //		_cgo_unsetenv unsafe.Pointer					// in runtime/env_posix.go
    21  // )
    22  // importing fakecgo will set these (using //go:linkname) with functions written
    23  // entirely in Go (except for some assembly trampolines to change GCC ABI to Go ABI).
    24  // Doing so makes it possible to build applications that call into C without CGO_ENABLED=1.
    25  import _ "github.com/jwijenbergh/purego/internal/fakecgo"