Files
llgo/runtime/internal/lib/go/build/build.go
xgopilot 7fbcc8cd10 refactor: use runtime.Version() instead of hardcoded goVersion
Replaced hardcoded goVersion constant with parseGoVersion() function
that dynamically extracts the Go version from runtime.Version().
This eliminates the need to update the version manually.

🤖 Generated with [codeagent](https://github.com/qbox/codeagent)
Co-authored-by: luoliwoshang <luoliwoshang@users.noreply.github.com>
2025-10-16 02:33:53 +00:00

143 lines
3.5 KiB
Go

// 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 provides alternative implementations for go/build.
// Only functions that need modification are patched here.
package build
import (
"go/build"
"os"
"path/filepath"
"runtime"
"strconv"
"strings"
)
// Type aliases to reference standard library types
type Context = build.Context
// parseGoVersion extracts the minor version number from runtime.Version()
// e.g., "go1.24" or "go1.24.1" -> 24
func parseGoVersion() int {
v := runtime.Version()
// Strip "go" prefix
if strings.HasPrefix(v, "go") {
v = v[2:]
}
// Extract version like "1.24" or "1.24.1"
parts := strings.Split(v, ".")
if len(parts) >= 2 {
if minor, err := strconv.Atoi(parts[1]); err == nil {
return minor
}
}
// Fallback to a reasonable default if parsing fails
return 24
}
var goVersion = parseGoVersion()
var defaultToolTags []string
var defaultReleaseTags []string
// 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, buildToolTags()...)
defaultToolTags = append([]string{}, c.ToolTags...)
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 = "1"
}
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 ""
}
// buildToolTags returns the tool tags for the current build configuration.
// This is a simplified version that returns basic tags.
func buildToolTags() []string {
return []string{
// Standard tool tags
"gc",
"goexperiment.boringcrypto", // Default boring crypto experiment
}
}
// cgoSupported returns whether CGO is supported for the given GOOS/GOARCH.
// This is a simplified version of internal/platform.CgoSupported.
func cgoSupported(goos, goarch string) bool {
// Most common platforms support CGO
switch goos + "/" + goarch {
case "darwin/amd64", "darwin/arm64",
"linux/386", "linux/amd64", "linux/arm", "linux/arm64",
"windows/386", "windows/amd64", "windows/arm64",
"freebsd/386", "freebsd/amd64", "freebsd/arm", "freebsd/arm64",
"openbsd/386", "openbsd/amd64", "openbsd/arm", "openbsd/arm64",
"netbsd/386", "netbsd/amd64", "netbsd/arm", "netbsd/arm64",
"android/386", "android/amd64", "android/arm", "android/arm64",
"illumos/amd64",
"solaris/amd64",
"linux/ppc64le", "linux/riscv64", "linux/s390x":
return true
}
return false
}