refactor: simplify go/build patch using init function

Use go:linkname to access build.Default and modify Compiler in init function.
This is much simpler than patching defaultContext() and all its dependencies.

- Reduced from 137 lines to 27 lines
- Removed zcgo.go (no longer needed)
- Removed complex parseGoVersion, defaultContext, and helper functions
- Now just sets build.Default.Compiler = "gc" in init()

Generated with [codeagent](https://github.com/qbox/codeagent)
Co-authored-by: luoliwoshang <luoliwoshang@users.noreply.github.com>
This commit is contained in:
xgopilot
2025-10-16 13:09:32 +00:00
parent 0a94a54772
commit 6e41cc702f
2 changed files with 11 additions and 128 deletions

View File

@@ -3,135 +3,25 @@
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// Package build provides alternative implementations for go/build. // Package build provides alternative implementations for go/build.
// Only functions that need modification are patched here. // We override build.Default.Compiler in an init function.
package build package build
import ( import (
"go/build" "go/build"
"os"
"path/filepath"
"runtime" "runtime"
"strconv"
"strings"
_ "unsafe" _ "unsafe"
) )
// Type aliases to reference standard library types //go:linkname buildDefault go/build.Default
type Context = build.Context var buildDefault build.Context
//go:linkname cgoSupported internal/platform.CgoSupported func init() {
func cgoSupported(goos, goarch string) bool // LLGO PATCH: Override build.Default.Compiler to be "gc" instead of "llgo"
// This prevents "unknown compiler" errors when user code uses go/build package
//go:linkname toolTags internal/buildcfg.ToolTags // Even though runtime.Compiler = "llgo", we set build.Default.Compiler = "gc"
var toolTags []string buildDefault.Compiler = "gc"
// defaultToolTags should be an internal detail, // Verify that runtime.Compiler is still "llgo" (unchanged)
// but widely used packages access it using linkname. _ = runtime.Compiler
// Notable members of the hall of shame include:
// - github.com/gopherjs/gopherjs
//
// Do not remove or change the type signature.
// See go.dev/issue/67401.
//
//go:linkname defaultToolTags
var defaultToolTags []string
// defaultReleaseTags should be an internal detail,
// but widely used packages access it using linkname.
// Notable members of the hall of shame include:
// - github.com/gopherjs/gopherjs
//
// Do not remove or change the type signature.
// See go.dev/issue/67401.
//
//go:linkname defaultReleaseTags
var defaultReleaseTags []string
// parseGoVersion extracts the minor version number from runtime.Version()
// e.g., "go1.24" or "go1.24.1" -> 24
func parseGoVersion() int {
v := runtime.Version()
if strings.HasPrefix(v, "go") {
v = v[2:]
}
parts := strings.Split(v, ".")
if len(parts) >= 2 {
if minor, err := strconv.Atoi(parts[1]); err == nil {
return minor
}
}
panic("parseGoVersion: cannot parse go version from runtime.Version(): " + runtime.Version())
}
// defaultContext returns the default Context for builds.
// LLGO PATCH: Sets Compiler = "gc" instead of runtime.Compiler
func defaultContext() Context {
var c Context
c.GOARCH = runtime.GOARCH
c.GOOS = runtime.GOOS
if goroot := runtime.GOROOT(); goroot != "" {
c.GOROOT = filepath.Clean(goroot)
}
c.GOPATH = envOr("GOPATH", defaultGOPATH())
// LLGO PATCH: Use "gc" instead of runtime.Compiler to avoid "unknown compiler" error
c.Compiler = "gc"
c.ToolTags = append(c.ToolTags, toolTags...)
defaultToolTags = append([]string{}, c.ToolTags...)
// Each major Go release in the Go 1.x series adds a new
// "go1.x" release tag. That is, the go1.x tag is present in
// all releases >= Go 1.x.
goVersion := parseGoVersion()
for i := 1; i <= goVersion; i++ {
c.ReleaseTags = append(c.ReleaseTags, "go1."+strconv.Itoa(i))
}
defaultReleaseTags = append([]string{}, c.ReleaseTags...)
env := os.Getenv("CGO_ENABLED")
if env == "" {
env = defaultCGO_ENABLED
}
switch env {
case "1":
c.CgoEnabled = true
case "0":
c.CgoEnabled = false
default:
if runtime.GOARCH == c.GOARCH && runtime.GOOS == c.GOOS {
c.CgoEnabled = cgoSupported(c.GOOS, c.GOARCH)
break
}
c.CgoEnabled = false
}
return c
}
func envOr(name, def string) string {
s := os.Getenv(name)
if s == "" {
return def
}
return s
}
func defaultGOPATH() string {
env := "HOME"
if runtime.GOOS == "windows" {
env = "USERPROFILE"
} else if runtime.GOOS == "plan9" {
env = "home"
}
if home := os.Getenv(env); home != "" {
def := filepath.Join(home, "go")
if filepath.Clean(def) == filepath.Clean(runtime.GOROOT()) {
return ""
}
return def
}
return ""
} }

View File

@@ -1,7 +0,0 @@
// Copyright 2024 The GoPlus Authors (goplus.org). All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package build
const defaultCGO_ENABLED = "1"