Merge pull request #936 from cpunion/optional-llgo-root

build: make llgo root usage optional for runtime loading
This commit is contained in:
xushiwei
2025-01-07 19:47:40 +08:00
committed by GitHub

View File

@@ -176,7 +176,24 @@ func Do(args []string, conf *Config) ([]Package, error) {
} }
altPkgPaths := altPkgs(initial, llssa.PkgRuntime) altPkgPaths := altPkgs(initial, llssa.PkgRuntime)
cfg.Dir = env.LLGoROOT() // Use LLGoROOT as default implementation if `github.com/goplus/llgo` is not
// imported in user's go.mod. This ensures compilation works without import
// while allowing `github.com/goplus/llgo` upgrades via go.mod.
//
// WARNING(lijie): This approach cannot guarantee compatibility between `llgo`
// executable and runtime. This is a known design limitation that needs to be
// addressed in future improvements. The runtime should be:
// 1. Released and fully tested with the `llgo` compiler across different Go
// compiler versions and user-specified go versions in go.mod
// 2. Not be dependent on `github.com/goplus/llgo/c` library. Current runtime directly
// depends on it, causing version conflicts: using LLGoROOT makes user's specified
// version ineffective, while not using it leaves runtime unable to follow compiler
// updates. Since `github.com/goplus/llgo/c/*` contains many application libraries
// that may change frequently, a possible solution is to have both depend on a
// stable and limited c core API.
if !llgoPkgImported(initial) {
cfg.Dir = env.LLGoROOT()
}
altPkgs, err := packages.LoadEx(dedup, sizes, cfg, altPkgPaths...) altPkgs, err := packages.LoadEx(dedup, sizes, cfg, altPkgPaths...)
check(err) check(err)
@@ -234,6 +251,17 @@ func Do(args []string, conf *Config) ([]Package, error) {
return dpkg, nil return dpkg, nil
} }
func llgoPkgImported(pkgs []*packages.Package) bool {
for _, pkg := range pkgs {
for _, imp := range pkg.Imports {
if imp.Module != nil && imp.Module.Path == env.LLGoCompilerPkg {
return true
}
}
}
return false
}
func setNeedRuntimeOrPyInit(pkg *packages.Package, needRuntime, needPyInit bool) { func setNeedRuntimeOrPyInit(pkg *packages.Package, needRuntime, needPyInit bool) {
v := []byte{'0', '0'} v := []byte{'0', '0'}
if needRuntime { if needRuntime {